blob: 912c0829db1660bd417b77355b8d6c1656ae17d1 [file] [log] [blame]
Harald Welteec8b4502010-02-20 20:34:29 +01001/*
2 * (C) 2008 by Daniel Willmann <daniel@totalueberwachung.de>
Nico Golde28de0532010-07-09 17:19:12 +02003 * (C) 2010 by Nico Golde <nico@ngolde.de>
Harald Welteec8b4502010-02-20 20:34:29 +01004 * All Rights Reserved
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
Harald Welteec8b4502010-02-20 20:34:29 +010016 */
17
18#include <stdio.h>
19#include <stdlib.h>
20#include <string.h>
Holger Hans Peter Freyther4d7e49b2013-05-02 22:37:16 +020021
22#include <osmocom/gsm/protocol/gsm_03_40.h>
23
Pablo Neira Ayuso83419342011-03-22 16:36:13 +010024#include <osmocom/gsm/gsm_utils.h>
Holger Hans Peter Freyther4d7e49b2013-05-02 22:37:16 +020025#include <osmocom/gsm/gsm0411_utils.h>
26
27#include <osmocom/core/msgb.h>
Pablo Neira Ayuso83419342011-03-22 16:36:13 +010028#include <osmocom/core/utils.h>
Holger Hans Peter Freyther31e97ea2010-07-20 02:46:56 +080029
Alexander Chemerise4c50d52014-03-07 20:42:03 +010030#include <osmocom/core/logging.h>
31#include <osmocom/core/application.h>
32
33struct log_info fake_log_info = {};
34
Holger Hans Peter Freyther31e97ea2010-07-20 02:46:56 +080035struct test_case {
36 const uint8_t *input;
37 const uint16_t input_length;
38
39 const uint8_t *expected;
Dennis Wehrle291e6132011-07-24 20:14:13 +020040 const uint16_t expected_octet_length;
41 const uint16_t expected_septet_length;
42 const uint8_t ud_hdr_ind;
Holger Hans Peter Freyther31e97ea2010-07-20 02:46:56 +080043};
44
45static const char simple_text[] = "test text";
Dennis Wehrle291e6132011-07-24 20:14:13 +020046#define simple_septet_length 9
Holger Hans Peter Freyther31e97ea2010-07-20 02:46:56 +080047static const uint8_t simple_enc[] = {
Nico Goldec0ce9aa2010-07-20 15:43:58 +020048 0xf4, 0xf2, 0x9c, 0x0e, 0xa2, 0x97, 0xf1, 0x74
Holger Hans Peter Freyther31e97ea2010-07-20 02:46:56 +080049};
50
Dennis Wehrle291e6132011-07-24 20:14:13 +020051static const char escape_text[] = "!$ a more#^- complicated test@@?_%! case";
52#define escape_septet_length 41 /* note: the ^ counts as two, because it is a extension character */
Holger Hans Peter Freyther31e97ea2010-07-20 02:46:56 +080053static const uint8_t escape_enc[] = {
54 0x21, 0x01, 0x28, 0x0c, 0x6a, 0xbf, 0xe5, 0xe5, 0xd1,
55 0x86, 0xd2, 0x02, 0x8d, 0xdf, 0x6d, 0x38, 0x3b, 0x3d,
56 0x0e, 0xd3, 0xcb, 0x64, 0x10, 0xbd, 0x3c, 0xa7, 0x03,
57 0x00, 0xbf, 0x48, 0x29, 0x04, 0x1a, 0x87, 0xe7, 0x65,
Holger Hans Peter Freyther31e97ea2010-07-20 02:46:56 +080058};
59
Dennis Wehrle291e6132011-07-24 20:14:13 +020060static const char enhanced_text[] = "enhanced ^ {][} test |+~ ^ test";
61#define enhanced_septet_length 39 /* note: the characters { } [ ] ^ | ~ count as two (each of them), because they are extension characters */
62static const uint8_t enhanced_enc[] = {
63 0x65, 0x37, 0x3A, 0xEC, 0x1E, 0x97, 0xC9, 0xA0, 0x0D,
64 0x05, 0xB4, 0x41, 0x6D, 0x7C, 0x1B, 0xDE, 0x26, 0x05,
65 0xA2, 0x97, 0xE7, 0x74, 0xD0, 0x06, 0xB8, 0xDA, 0xF4,
66 0x40, 0x1B, 0x0A, 0x88, 0x5E, 0x9E, 0xD3, 0x01,
67};
68
69static const char enhancedV2_text[] = "enhanced ^ {][} test |+~ ^ tests";
70#define enhancedV2_septet_length 40 /* note: number of octets are equal to the enhanced_text! */
71static const uint8_t enhancedV2_enc[] = {
72 0x65, 0x37, 0x3A, 0xEC, 0x1E, 0x97, 0xC9, 0xA0, 0x0D,
73 0x05, 0xB4, 0x41, 0x6D, 0x7C, 0x1B, 0xDE, 0x26, 0x05,
74 0xA2, 0x97, 0xE7, 0x74, 0xD0, 0x06, 0xB8, 0xDA, 0xF4,
75 0x40, 0x1B, 0x0A, 0x88, 0x5E, 0x9E, 0xD3, 0xE7,
76};
77
78
79
80static const char concatenated_text[] =
81 "this is a testmessage. this is a testmessage. this is a testmessage. this is a testmessage. "
82 "this is a testmessage. this is a testmessage. cut here .....: this is a second testmessage. end here.";
83
84static const char splitted_text_part1[] =
85 "this is a testmessage. this is a testmessage. this is a testmessage. this is a testmessage. "
86 "this is a testmessage. this is a testmessage. cut here .....:";
87#define concatenated_part1_septet_length_with_header 160
88#define concatenated_part1_septet_length 153
89static const uint8_t concatenated_part1_enc[] = {
90 0x05, 0x00, 0x03, 0x6f, 0x02, 0x01,
91 0xe8, 0xe8, 0xf4, 0x1c, 0x94, 0x9e, 0x83, 0xc2,
92 0x20, 0x7a, 0x79, 0x4e, 0x6f, 0x97, 0xe7, 0xf3,
93 0xf0, 0xb9, 0xec, 0x02, 0xd1, 0xd1, 0xe9, 0x39,
94 0x28, 0x3d, 0x07, 0x85, 0x41, 0xf4, 0xf2, 0x9c,
95 0xde, 0x2e, 0xcf, 0xe7, 0xe1, 0x73, 0xd9, 0x05,
96 0xa2, 0xa3, 0xd3, 0x73, 0x50, 0x7a, 0x0e, 0x0a,
97 0x83, 0xe8, 0xe5, 0x39, 0xbd, 0x5d, 0x9e, 0xcf,
98 0xc3, 0xe7, 0xb2, 0x0b, 0x44, 0x47, 0xa7, 0xe7,
99 0xa0, 0xf4, 0x1c, 0x14, 0x06, 0xd1, 0xcb, 0x73,
100 0x7a, 0xbb, 0x3c, 0x9f, 0x87, 0xcf, 0x65, 0x17,
101 0x88, 0x8e, 0x4e, 0xcf, 0x41, 0xe9, 0x39, 0x28,
102 0x0c, 0xa2, 0x97, 0xe7, 0xf4, 0x76, 0x79, 0x3e,
103 0x0f, 0x9f, 0xcb, 0x2e, 0x10, 0x1d, 0x9d, 0x9e,
104 0x83, 0xd2, 0x73, 0x50, 0x18, 0x44, 0x2f, 0xcf,
105 0xe9, 0xed, 0xf2, 0x7c, 0x1e, 0x3e, 0x97, 0x5d,
106 0xa0, 0x71, 0x9d, 0x0e, 0x42, 0x97, 0xe5, 0x65,
107 0x90, 0xcb, 0xe5, 0x72, 0xb9, 0x74,
108};
109
110static const char splitted_text_part2[] = " this is a second testmessage. end here.";
111#define concatenated_part2_septet_length_with_header 47
112#define concatenated_part2_septet_length 40
113static const uint8_t concatenated_part2_enc[] = {
114 0x05, 0x00, 0x03, 0x6f, 0x02, 0x02,
115 0x40, 0x74, 0x74, 0x7a, 0x0e, 0x4a, 0xcf, 0x41,
116 0x61, 0xd0, 0xbc, 0x3c, 0x7e, 0xbb, 0xc9, 0x20,
117 0x7a, 0x79, 0x4e, 0x6f, 0x97, 0xe7, 0xf3, 0xf0,
118 0xb9, 0xec, 0x02, 0x95, 0xdd, 0x64, 0x10, 0xba,
119 0x2c, 0x2f, 0xbb, 0x00,
120};
121
122static const struct test_case test_multiple_encode[] =
123{
124 {
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200125 .input = (const uint8_t *) concatenated_text,
Dennis Wehrle291e6132011-07-24 20:14:13 +0200126 .expected = concatenated_part1_enc,
127 .expected_octet_length = sizeof(concatenated_part1_enc),
128 .expected_septet_length = concatenated_part1_septet_length,
129 .ud_hdr_ind = 1,
130 },
131 {
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200132 .input = (const uint8_t *) concatenated_text,
Dennis Wehrle291e6132011-07-24 20:14:13 +0200133 .expected = concatenated_part2_enc,
134 .expected_octet_length = sizeof(concatenated_part2_enc),
135 .expected_septet_length = concatenated_part2_septet_length,
136 .ud_hdr_ind = 1,
137 },
138};
139
Holger Hans Peter Freyther31e97ea2010-07-20 02:46:56 +0800140static const struct test_case test_encode[] =
141{
142 {
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200143 .input = (const uint8_t *) simple_text,
Holger Hans Peter Freyther31e97ea2010-07-20 02:46:56 +0800144 .expected = simple_enc,
Dennis Wehrle291e6132011-07-24 20:14:13 +0200145 .expected_octet_length = sizeof(simple_enc),
146 .expected_septet_length = simple_septet_length,
147 .ud_hdr_ind = 0,
Holger Hans Peter Freyther31e97ea2010-07-20 02:46:56 +0800148 },
149 {
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200150 .input = (const uint8_t *) escape_text,
Holger Hans Peter Freyther31e97ea2010-07-20 02:46:56 +0800151 .expected = escape_enc,
Dennis Wehrle291e6132011-07-24 20:14:13 +0200152 .expected_octet_length = sizeof(escape_enc),
153 .expected_septet_length = escape_septet_length,
154 .ud_hdr_ind = 0,
155 },
156 {
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200157 .input = (const uint8_t *) enhanced_text,
Dennis Wehrle291e6132011-07-24 20:14:13 +0200158 .expected = enhanced_enc,
159 .expected_octet_length = sizeof(enhanced_enc),
160 .expected_septet_length = enhanced_septet_length,
161 .ud_hdr_ind = 0,
162 },
163 {
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200164 .input = (const uint8_t *) enhancedV2_text,
Dennis Wehrle291e6132011-07-24 20:14:13 +0200165 .expected = enhancedV2_enc,
166 .expected_octet_length = sizeof(enhancedV2_enc),
167 .expected_septet_length = enhancedV2_septet_length,
168 .ud_hdr_ind = 0,
Holger Hans Peter Freyther31e97ea2010-07-20 02:46:56 +0800169 },
170};
171
172static const struct test_case test_decode[] =
173{
174 {
175 .input = simple_enc,
Nico Goldec0ce9aa2010-07-20 15:43:58 +0200176 .input_length = sizeof(simple_enc),
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200177 .expected = (const uint8_t *) simple_text,
Dennis Wehrle291e6132011-07-24 20:14:13 +0200178 .expected_septet_length = simple_septet_length,
179 .ud_hdr_ind = 0,
Holger Hans Peter Freyther31e97ea2010-07-20 02:46:56 +0800180 },
181 {
182 .input = escape_enc,
Nico Goldec0ce9aa2010-07-20 15:43:58 +0200183 .input_length = sizeof(escape_enc),
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200184 .expected = (const uint8_t *) escape_text,
Dennis Wehrle291e6132011-07-24 20:14:13 +0200185 .expected_septet_length = escape_septet_length,
186 .ud_hdr_ind = 0,
187 },
188 {
189 .input = enhanced_enc,
190 .input_length = sizeof(enhanced_enc),
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200191 .expected = (const uint8_t *) enhanced_text,
Dennis Wehrle291e6132011-07-24 20:14:13 +0200192 .expected_septet_length = enhanced_septet_length,
193 .ud_hdr_ind = 0,
194 },
195 {
196 .input = enhancedV2_enc,
197 .input_length = sizeof(enhancedV2_enc),
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200198 .expected = (const uint8_t *) enhancedV2_text,
Dennis Wehrle291e6132011-07-24 20:14:13 +0200199 .expected_septet_length = enhancedV2_septet_length,
200 .ud_hdr_ind = 0,
201 },
202 {
203 .input = concatenated_part1_enc,
204 .input_length = sizeof(concatenated_part1_enc),
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200205 .expected = (const uint8_t *) splitted_text_part1,
Dennis Wehrle291e6132011-07-24 20:14:13 +0200206 .expected_septet_length = concatenated_part1_septet_length_with_header,
207 .ud_hdr_ind = 1,
208 },
209 {
210 .input = concatenated_part2_enc,
211 .input_length = sizeof(concatenated_part2_enc),
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200212 .expected = (const uint8_t *) splitted_text_part2,
Dennis Wehrle291e6132011-07-24 20:14:13 +0200213 .expected_septet_length = concatenated_part2_septet_length_with_header,
214 .ud_hdr_ind = 1,
Holger Hans Peter Freyther31e97ea2010-07-20 02:46:56 +0800215 },
216};
Harald Welteec8b4502010-02-20 20:34:29 +0100217
Harald Weltee61d4592022-11-03 11:05:58 +0100218static void test_octet_return(void)
Holger Hans Peter Freyther6bfa7442013-08-08 12:38:52 +0200219{
220 char out[256];
221 int oct, septets;
222
223 printf("Encoding some tests and printing number of septets/octets\n");
224
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200225 septets = gsm_7bit_encode_n((uint8_t *) out, sizeof(out), "test1234", &oct);
Holger Hans Peter Freyther6bfa7442013-08-08 12:38:52 +0200226 printf("SEPTETS: %d OCTETS: %d\n", septets, oct);
227
228 printf("Done\n");
229}
230
Holger Hans Peter Freyther4d7e49b2013-05-02 22:37:16 +0200231static void test_gen_oa(void)
232{
233 uint8_t oa[12];
234 int len;
235
236 printf("Testing gsm340_gen_oa\n");
237
238 /* first try... */
239 len = gsm340_gen_oa(oa, ARRAY_SIZE(oa), GSM340_TYPE_UNKNOWN,
240 GSM340_PLAN_ISDN, "12345678901234567891");
241 OSMO_ASSERT(len == 12);
242 printf("Result: len(%d) data(%s)\n", len, osmo_hexdump(oa, len));
243 len = gsm340_gen_oa(oa, ARRAY_SIZE(oa), GSM340_TYPE_NATIONAL,
244 GSM340_PLAN_ISDN, "12345678901234567891");
245 OSMO_ASSERT(len == 12);
246 printf("Result: len(%d) data(%s)\n", len, osmo_hexdump(oa, len));
247
248 /* long input.. will fail and just prints the header*/
249 len = gsm340_gen_oa(oa, ARRAY_SIZE(oa), GSM340_TYPE_INTERNATIONAL,
250 GSM340_PLAN_ISDN, "123456789123456789120");
251 OSMO_ASSERT(len == 2);
252 printf("Result: len(%d) data(%s)\n", len, osmo_hexdump(oa, len));
253
254 /* try the alpha numeric encoding */
255 len = gsm340_gen_oa(oa, ARRAY_SIZE(oa), GSM340_TYPE_ALPHA_NUMERIC,
256 GSM340_PLAN_UNKNOWN, "OpenBSC");
257 OSMO_ASSERT(len == 9);
258 printf("Result: len(%d) data(%s)\n", len, osmo_hexdump(oa, len));
259
260 /* long alpha numeric text */
261 len = gsm340_gen_oa(oa, ARRAY_SIZE(oa), GSM340_TYPE_ALPHA_NUMERIC,
262 GSM340_PLAN_UNKNOWN, "OpenBSCabcdefghijklm");
263 OSMO_ASSERT(len == 12);
264 printf("Result: len(%d) data(%s)\n", len, osmo_hexdump(oa, len));
265}
266
Vadim Yanitskiy44ac4f62021-01-30 00:27:06 +0100267static void test_enc_large_msg(void)
268{
269 uint8_t enc_buf[2048 * 7 / 8];
270 char large_msg[2048 + 1];
271 int i, j, nsep, noct = 0;
272
273 printf("\nRunning %s\n", __func__);
274
275 /* Expected chunks (repeated) in the output buffer */
276 const uint8_t exp_chunk[] = { 0xc1, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x83 };
277
278 /* Length variants to be tested */
279 static const size_t nlen[] = { 2048, 1024, 555, 512, 260, 255, 250 };
280
281 memset(&large_msg[0], (int) 'A', sizeof(large_msg) - 1);
282
283 for (i = 0; i < ARRAY_SIZE(nlen); i++) {
284 /* Clear the output buffer first */
285 memset(&enc_buf[0], 0x00, sizeof(enc_buf));
286 /* Limit length of the input string */
287 large_msg[nlen[i]] = '\0';
288
289 /* How many octets we expect to be used? */
290 int noct_exp = nlen[i] * 7 / 8;
291 if (nlen[i] % 8 != 0)
292 noct_exp++;
293
294 /* Encode a sequence of 'A' repeated nlen[i] times */
295 nsep = gsm_7bit_encode_n(&enc_buf[0], sizeof(enc_buf), large_msg, &noct);
296 printf("gsm_7bit_encode_n(len=%zu) processed %d septets (expected %zu): %s\n",
297 nlen[i], nsep, nlen[i], nsep == nlen[i] ? "OK" : "FAIL");
298 printf("gsm_7bit_encode_n(len=%zu) used %d octets in the buffer (expected %d): %s\n",
299 nlen[i], noct, noct_exp, noct == noct_exp ? "OK" : "FAIL");
300
301 /* The encoding result is expected to consist of repeated chunks */
302 for (j = 0; j < noct_exp; j += sizeof(exp_chunk)) {
303 size_t len = OSMO_MIN(noct_exp - j, sizeof(exp_chunk));
304 if (nlen[i] % 8 != 0) /* skip incomplete octets */
305 len--;
306 if (memcmp(&enc_buf[j], exp_chunk, len) != 0) {
307 printf("\tUnexpected chunk at enc_buf[%d:%zu]: %s\n",
308 j, len, osmo_hexdump(&enc_buf[j], len));
309 break; /* No need to show them all */
310 }
311 }
312 }
313}
314
Harald Welteec8b4502010-02-20 20:34:29 +0100315int main(int argc, char** argv)
316{
317 printf("SMS testing\n");
Harald Welteec8b4502010-02-20 20:34:29 +0100318 uint8_t i;
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200319 uint16_t buffer_size;
Dennis Wehrle291e6132011-07-24 20:14:13 +0200320 uint8_t octet_length;
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200321 int octets_written;
322 uint8_t computed_octet_length;
Dennis Wehrle291e6132011-07-24 20:14:13 +0200323 uint8_t septet_length;
Harald Welteec8b4502010-02-20 20:34:29 +0100324 uint8_t coded[256];
Dennis Wehrle291e6132011-07-24 20:14:13 +0200325 uint8_t tmp[160];
326 uint8_t septet_data[256];
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200327 int nchars;
Harald Welteec8b4502010-02-20 20:34:29 +0100328 char result[256];
Neels Hofmeyra829b452018-04-05 03:02:35 +0200329 void *ctx = talloc_named_const(NULL, 0, "sms_test");
Harald Welteec8b4502010-02-20 20:34:29 +0100330
Alexander Chemerise4c50d52014-03-07 20:42:03 +0100331 /* Fake logging. */
Neels Hofmeyra829b452018-04-05 03:02:35 +0200332 osmo_init_logging2(ctx, &fake_log_info);
Alexander Chemerise4c50d52014-03-07 20:42:03 +0100333
Holger Hans Peter Freyther31e97ea2010-07-20 02:46:56 +0800334 /* test 7-bit encoding */
Nico Goldec0ce9aa2010-07-20 15:43:58 +0200335 for (i = 0; i < ARRAY_SIZE(test_encode); ++i) {
Jacob Erlbeck26cbd452014-01-07 13:39:24 +0100336 /* Test new function */
Nico Goldec0ce9aa2010-07-20 15:43:58 +0200337 memset(coded, 0x42, sizeof(coded));
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200338 septet_length = gsm_7bit_encode_n(coded, sizeof(coded),
339 (const char *) test_encode[i].input,
340 &octets_written);
341 computed_octet_length = gsm_get_octet_len(septet_length);
342 printf("Encode case %d: "
343 "Octet length %d (expected %d, computed %d), "
344 "septet length %d (expected %d)\n"
345 , i
346 , octets_written, test_encode[i].expected_octet_length, computed_octet_length
347 , septet_length, test_encode[i].expected_septet_length
348 );
Holger Hans Peter Freyther31e97ea2010-07-20 02:46:56 +0800349
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200350 OSMO_ASSERT (octets_written == test_encode[i].expected_octet_length);
351 OSMO_ASSERT (octets_written == computed_octet_length);
352 OSMO_ASSERT (memcmp(coded, test_encode[i].expected, octets_written) == 0);
Jacob Erlbeck26cbd452014-01-07 13:39:24 +0100353 OSMO_ASSERT (septet_length == test_encode[i].expected_septet_length);
Dennis Wehrle291e6132011-07-24 20:14:13 +0200354
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200355 /* check buffer limiting */
356 memset(coded, 0xaa, sizeof(coded));
357
358 for (buffer_size = 0;
359 buffer_size < test_encode[i].expected_octet_length + 1
360 && buffer_size < sizeof(coded) - 1;
361 ++buffer_size)
362 {
363 gsm_7bit_encode_n(coded, buffer_size,
364 (const char *) test_encode[i].input,
365 &octets_written);
366
367 OSMO_ASSERT(octets_written <= buffer_size);
368 OSMO_ASSERT(coded[buffer_size] == 0xaa);
Holger Hans Peter Freyther31e97ea2010-07-20 02:46:56 +0800369 }
Harald Welteec8b4502010-02-20 20:34:29 +0100370 }
Nico Golde28de0532010-07-09 17:19:12 +0200371
Dennis Wehrle291e6132011-07-24 20:14:13 +0200372
373 /* Test: encode multiple SMS */
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200374 int number_of_septets = gsm_septet_encode(septet_data, (const char *) test_multiple_encode[0].input);
Jacob Erlbeck73ae7a92013-10-08 12:04:42 +0200375 (void) number_of_septets;
Dennis Wehrle291e6132011-07-24 20:14:13 +0200376
377 /* SMS part 1 */
378 memset(tmp, 0x42, sizeof(tmp));
379 memset(coded, 0x42, sizeof(coded));
380 memcpy(tmp, septet_data, concatenated_part1_septet_length);
381
382 /* In our case: test_multiple_decode[0].ud_hdr_ind equals number of padding bits*/
Vadim Yanitskiy943133c2021-01-30 01:31:32 +0100383 octet_length = gsm_septet_pack(coded, tmp, concatenated_part1_septet_length, test_multiple_encode[0].ud_hdr_ind);
Dennis Wehrle291e6132011-07-24 20:14:13 +0200384
385 /* copy header */
386 memset(tmp, 0x42, sizeof(tmp));
387 int udh_length = test_multiple_encode[0].expected[0] + 1;
388 memcpy(tmp, test_multiple_encode[0].expected, udh_length);
389 memcpy(tmp + udh_length, coded, octet_length);
390 memset(coded, 0x42, sizeof(coded));
391 memcpy(coded, tmp, octet_length + 6);
392
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200393 OSMO_ASSERT(memcmp(coded, test_multiple_encode[0].expected, octet_length) == 0);
Dennis Wehrle291e6132011-07-24 20:14:13 +0200394
395 /* SMS part 2 */
396 memset(tmp, 0x42, sizeof(tmp));
397 memset(coded, 0x42, sizeof(coded));
398 memcpy(tmp, septet_data + concatenated_part1_septet_length, concatenated_part2_septet_length);
399
400 /* In our case: test_multiple_decode[1].ud_hdr_ind equals number of padding bits*/
Vadim Yanitskiy943133c2021-01-30 01:31:32 +0100401 octet_length = gsm_septet_pack(coded, tmp, concatenated_part2_septet_length, test_multiple_encode[1].ud_hdr_ind);
Dennis Wehrle291e6132011-07-24 20:14:13 +0200402
403 /* copy header */
404 memset(tmp, 0x42, sizeof(tmp));
405 udh_length = test_multiple_encode[1].expected[0] + 1;
406 memcpy(tmp, test_multiple_encode[1].expected, udh_length);
407 memcpy(tmp + udh_length, coded, octet_length);
408 memset(coded, 0x42, sizeof(coded));
409 memcpy(coded, tmp, octet_length + 6);
410
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200411 OSMO_ASSERT(memcmp(coded, test_multiple_encode[1].expected, octet_length) == 0);
Dennis Wehrle291e6132011-07-24 20:14:13 +0200412
Holger Hans Peter Freyther31e97ea2010-07-20 02:46:56 +0800413 /* test 7-bit decoding */
414 for (i = 0; i < ARRAY_SIZE(test_decode); ++i) {
Jacob Erlbeck26cbd452014-01-07 13:39:24 +0100415 /* Test new function */
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200416 memset(result, 0x42, sizeof(result));
417 nchars = gsm_7bit_decode_n_hdr(result, sizeof(result), test_decode[i].input,
Dennis Wehrle291e6132011-07-24 20:14:13 +0200418 test_decode[i].expected_septet_length, test_decode[i].ud_hdr_ind);
Holger Hans Peter Freytherfdb46672015-11-09 16:32:43 +0000419 printf("Decode case %d: return value %d (expected %zu)\n", i, nchars, strlen(result));
Holger Hans Peter Freyther31e97ea2010-07-20 02:46:56 +0800420
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200421 OSMO_ASSERT(strcmp(result, (const char *) test_decode[i].expected) == 0);
422 OSMO_ASSERT(nchars == strlen(result));
423
424 /* check buffer limiting */
425 memset(result, 0xaa, sizeof(result));
426
427 for (buffer_size = 1;
Holger Hans Peter Freytherbb9f8972013-10-08 13:57:51 +0200428 buffer_size < test_decode[i].expected_septet_length + 1
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200429 && buffer_size < sizeof(result) - 1;
430 ++buffer_size)
431 {
432 nchars = gsm_7bit_decode_n_hdr(result, buffer_size, test_decode[i].input,
433 test_decode[i].expected_septet_length, test_decode[i].ud_hdr_ind);
434
435 OSMO_ASSERT(nchars <= buffer_size);
436 OSMO_ASSERT(result[buffer_size] == (char)0xaa);
437 OSMO_ASSERT(result[nchars] == '\0');
Dennis Wehrle291e6132011-07-24 20:14:13 +0200438 }
Nico Golde28de0532010-07-09 17:19:12 +0200439 }
440
Holger Hans Peter Freyther6bfa7442013-08-08 12:38:52 +0200441 test_octet_return();
Holger Hans Peter Freyther4d7e49b2013-05-02 22:37:16 +0200442 test_gen_oa();
Vadim Yanitskiy44ac4f62021-01-30 00:27:06 +0100443 test_enc_large_msg();
Holger Hans Peter Freyther6bfa7442013-08-08 12:38:52 +0200444
Holger Hans Peter Freyther31e97ea2010-07-20 02:46:56 +0800445 printf("OK\n");
Nico Golde28de0532010-07-09 17:19:12 +0200446 return 0;
Harald Welteec8b4502010-02-20 20:34:29 +0100447}