blob: 8e10241a7c7a720923f8d186cd3493826240f271 [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 *
16 * You should have received a copy of the GNU General Public License along
17 * with this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19 *
20 */
21
22#include <stdio.h>
23#include <stdlib.h>
24#include <string.h>
Holger Hans Peter Freyther4d7e49b2013-05-02 22:37:16 +020025
26#include <osmocom/gsm/protocol/gsm_03_40.h>
27
Pablo Neira Ayuso83419342011-03-22 16:36:13 +010028#include <osmocom/gsm/gsm_utils.h>
Holger Hans Peter Freyther4d7e49b2013-05-02 22:37:16 +020029#include <osmocom/gsm/gsm0411_utils.h>
30
31#include <osmocom/core/msgb.h>
Pablo Neira Ayuso83419342011-03-22 16:36:13 +010032#include <osmocom/core/utils.h>
Holger Hans Peter Freyther31e97ea2010-07-20 02:46:56 +080033
34struct test_case {
35 const uint8_t *input;
36 const uint16_t input_length;
37
38 const uint8_t *expected;
Dennis Wehrle291e6132011-07-24 20:14:13 +020039 const uint16_t expected_octet_length;
40 const uint16_t expected_septet_length;
41 const uint8_t ud_hdr_ind;
Holger Hans Peter Freyther31e97ea2010-07-20 02:46:56 +080042};
43
44static const char simple_text[] = "test text";
Dennis Wehrle291e6132011-07-24 20:14:13 +020045#define simple_septet_length 9
Holger Hans Peter Freyther31e97ea2010-07-20 02:46:56 +080046static const uint8_t simple_enc[] = {
Nico Goldec0ce9aa2010-07-20 15:43:58 +020047 0xf4, 0xf2, 0x9c, 0x0e, 0xa2, 0x97, 0xf1, 0x74
Holger Hans Peter Freyther31e97ea2010-07-20 02:46:56 +080048};
49
Dennis Wehrle291e6132011-07-24 20:14:13 +020050static const char escape_text[] = "!$ a more#^- complicated test@@?_%! case";
51#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 +080052static const uint8_t escape_enc[] = {
53 0x21, 0x01, 0x28, 0x0c, 0x6a, 0xbf, 0xe5, 0xe5, 0xd1,
54 0x86, 0xd2, 0x02, 0x8d, 0xdf, 0x6d, 0x38, 0x3b, 0x3d,
55 0x0e, 0xd3, 0xcb, 0x64, 0x10, 0xbd, 0x3c, 0xa7, 0x03,
56 0x00, 0xbf, 0x48, 0x29, 0x04, 0x1a, 0x87, 0xe7, 0x65,
Holger Hans Peter Freyther31e97ea2010-07-20 02:46:56 +080057};
58
Dennis Wehrle291e6132011-07-24 20:14:13 +020059static const char enhanced_text[] = "enhanced ^ {][} test |+~ ^ test";
60#define enhanced_septet_length 39 /* note: the characters { } [ ] ^ | ~ count as two (each of them), because they are extension characters */
61static const uint8_t enhanced_enc[] = {
62 0x65, 0x37, 0x3A, 0xEC, 0x1E, 0x97, 0xC9, 0xA0, 0x0D,
63 0x05, 0xB4, 0x41, 0x6D, 0x7C, 0x1B, 0xDE, 0x26, 0x05,
64 0xA2, 0x97, 0xE7, 0x74, 0xD0, 0x06, 0xB8, 0xDA, 0xF4,
65 0x40, 0x1B, 0x0A, 0x88, 0x5E, 0x9E, 0xD3, 0x01,
66};
67
68static const char enhancedV2_text[] = "enhanced ^ {][} test |+~ ^ tests";
69#define enhancedV2_septet_length 40 /* note: number of octets are equal to the enhanced_text! */
70static const uint8_t enhancedV2_enc[] = {
71 0x65, 0x37, 0x3A, 0xEC, 0x1E, 0x97, 0xC9, 0xA0, 0x0D,
72 0x05, 0xB4, 0x41, 0x6D, 0x7C, 0x1B, 0xDE, 0x26, 0x05,
73 0xA2, 0x97, 0xE7, 0x74, 0xD0, 0x06, 0xB8, 0xDA, 0xF4,
74 0x40, 0x1B, 0x0A, 0x88, 0x5E, 0x9E, 0xD3, 0xE7,
75};
76
77
78
79static const char concatenated_text[] =
80 "this is a testmessage. this is a testmessage. this is a testmessage. this is a testmessage. "
81 "this is a testmessage. this is a testmessage. cut here .....: this is a second testmessage. end here.";
82
83static const char splitted_text_part1[] =
84 "this is a testmessage. this is a testmessage. this is a testmessage. this is a testmessage. "
85 "this is a testmessage. this is a testmessage. cut here .....:";
86#define concatenated_part1_septet_length_with_header 160
87#define concatenated_part1_septet_length 153
88static const uint8_t concatenated_part1_enc[] = {
89 0x05, 0x00, 0x03, 0x6f, 0x02, 0x01,
90 0xe8, 0xe8, 0xf4, 0x1c, 0x94, 0x9e, 0x83, 0xc2,
91 0x20, 0x7a, 0x79, 0x4e, 0x6f, 0x97, 0xe7, 0xf3,
92 0xf0, 0xb9, 0xec, 0x02, 0xd1, 0xd1, 0xe9, 0x39,
93 0x28, 0x3d, 0x07, 0x85, 0x41, 0xf4, 0xf2, 0x9c,
94 0xde, 0x2e, 0xcf, 0xe7, 0xe1, 0x73, 0xd9, 0x05,
95 0xa2, 0xa3, 0xd3, 0x73, 0x50, 0x7a, 0x0e, 0x0a,
96 0x83, 0xe8, 0xe5, 0x39, 0xbd, 0x5d, 0x9e, 0xcf,
97 0xc3, 0xe7, 0xb2, 0x0b, 0x44, 0x47, 0xa7, 0xe7,
98 0xa0, 0xf4, 0x1c, 0x14, 0x06, 0xd1, 0xcb, 0x73,
99 0x7a, 0xbb, 0x3c, 0x9f, 0x87, 0xcf, 0x65, 0x17,
100 0x88, 0x8e, 0x4e, 0xcf, 0x41, 0xe9, 0x39, 0x28,
101 0x0c, 0xa2, 0x97, 0xe7, 0xf4, 0x76, 0x79, 0x3e,
102 0x0f, 0x9f, 0xcb, 0x2e, 0x10, 0x1d, 0x9d, 0x9e,
103 0x83, 0xd2, 0x73, 0x50, 0x18, 0x44, 0x2f, 0xcf,
104 0xe9, 0xed, 0xf2, 0x7c, 0x1e, 0x3e, 0x97, 0x5d,
105 0xa0, 0x71, 0x9d, 0x0e, 0x42, 0x97, 0xe5, 0x65,
106 0x90, 0xcb, 0xe5, 0x72, 0xb9, 0x74,
107};
108
109static const char splitted_text_part2[] = " this is a second testmessage. end here.";
110#define concatenated_part2_septet_length_with_header 47
111#define concatenated_part2_septet_length 40
112static const uint8_t concatenated_part2_enc[] = {
113 0x05, 0x00, 0x03, 0x6f, 0x02, 0x02,
114 0x40, 0x74, 0x74, 0x7a, 0x0e, 0x4a, 0xcf, 0x41,
115 0x61, 0xd0, 0xbc, 0x3c, 0x7e, 0xbb, 0xc9, 0x20,
116 0x7a, 0x79, 0x4e, 0x6f, 0x97, 0xe7, 0xf3, 0xf0,
117 0xb9, 0xec, 0x02, 0x95, 0xdd, 0x64, 0x10, 0xba,
118 0x2c, 0x2f, 0xbb, 0x00,
119};
120
121static const struct test_case test_multiple_encode[] =
122{
123 {
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200124 .input = (const uint8_t *) concatenated_text,
Dennis Wehrle291e6132011-07-24 20:14:13 +0200125 .expected = concatenated_part1_enc,
126 .expected_octet_length = sizeof(concatenated_part1_enc),
127 .expected_septet_length = concatenated_part1_septet_length,
128 .ud_hdr_ind = 1,
129 },
130 {
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200131 .input = (const uint8_t *) concatenated_text,
Dennis Wehrle291e6132011-07-24 20:14:13 +0200132 .expected = concatenated_part2_enc,
133 .expected_octet_length = sizeof(concatenated_part2_enc),
134 .expected_septet_length = concatenated_part2_septet_length,
135 .ud_hdr_ind = 1,
136 },
137};
138
Holger Hans Peter Freyther31e97ea2010-07-20 02:46:56 +0800139static const struct test_case test_encode[] =
140{
141 {
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200142 .input = (const uint8_t *) simple_text,
Holger Hans Peter Freyther31e97ea2010-07-20 02:46:56 +0800143 .expected = simple_enc,
Dennis Wehrle291e6132011-07-24 20:14:13 +0200144 .expected_octet_length = sizeof(simple_enc),
145 .expected_septet_length = simple_septet_length,
146 .ud_hdr_ind = 0,
Holger Hans Peter Freyther31e97ea2010-07-20 02:46:56 +0800147 },
148 {
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200149 .input = (const uint8_t *) escape_text,
Holger Hans Peter Freyther31e97ea2010-07-20 02:46:56 +0800150 .expected = escape_enc,
Dennis Wehrle291e6132011-07-24 20:14:13 +0200151 .expected_octet_length = sizeof(escape_enc),
152 .expected_septet_length = escape_septet_length,
153 .ud_hdr_ind = 0,
154 },
155 {
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200156 .input = (const uint8_t *) enhanced_text,
Dennis Wehrle291e6132011-07-24 20:14:13 +0200157 .expected = enhanced_enc,
158 .expected_octet_length = sizeof(enhanced_enc),
159 .expected_septet_length = enhanced_septet_length,
160 .ud_hdr_ind = 0,
161 },
162 {
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200163 .input = (const uint8_t *) enhancedV2_text,
Dennis Wehrle291e6132011-07-24 20:14:13 +0200164 .expected = enhancedV2_enc,
165 .expected_octet_length = sizeof(enhancedV2_enc),
166 .expected_septet_length = enhancedV2_septet_length,
167 .ud_hdr_ind = 0,
Holger Hans Peter Freyther31e97ea2010-07-20 02:46:56 +0800168 },
169};
170
171static const struct test_case test_decode[] =
172{
173 {
174 .input = simple_enc,
Nico Goldec0ce9aa2010-07-20 15:43:58 +0200175 .input_length = sizeof(simple_enc),
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200176 .expected = (const uint8_t *) simple_text,
Dennis Wehrle291e6132011-07-24 20:14:13 +0200177 .expected_septet_length = simple_septet_length,
178 .ud_hdr_ind = 0,
Holger Hans Peter Freyther31e97ea2010-07-20 02:46:56 +0800179 },
180 {
181 .input = escape_enc,
Nico Goldec0ce9aa2010-07-20 15:43:58 +0200182 .input_length = sizeof(escape_enc),
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200183 .expected = (const uint8_t *) escape_text,
Dennis Wehrle291e6132011-07-24 20:14:13 +0200184 .expected_septet_length = escape_septet_length,
185 .ud_hdr_ind = 0,
186 },
187 {
188 .input = enhanced_enc,
189 .input_length = sizeof(enhanced_enc),
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200190 .expected = (const uint8_t *) enhanced_text,
Dennis Wehrle291e6132011-07-24 20:14:13 +0200191 .expected_septet_length = enhanced_septet_length,
192 .ud_hdr_ind = 0,
193 },
194 {
195 .input = enhancedV2_enc,
196 .input_length = sizeof(enhancedV2_enc),
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200197 .expected = (const uint8_t *) enhancedV2_text,
Dennis Wehrle291e6132011-07-24 20:14:13 +0200198 .expected_septet_length = enhancedV2_septet_length,
199 .ud_hdr_ind = 0,
200 },
201 {
202 .input = concatenated_part1_enc,
203 .input_length = sizeof(concatenated_part1_enc),
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200204 .expected = (const uint8_t *) splitted_text_part1,
Dennis Wehrle291e6132011-07-24 20:14:13 +0200205 .expected_septet_length = concatenated_part1_septet_length_with_header,
206 .ud_hdr_ind = 1,
207 },
208 {
209 .input = concatenated_part2_enc,
210 .input_length = sizeof(concatenated_part2_enc),
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200211 .expected = (const uint8_t *) splitted_text_part2,
Dennis Wehrle291e6132011-07-24 20:14:13 +0200212 .expected_septet_length = concatenated_part2_septet_length_with_header,
213 .ud_hdr_ind = 1,
Holger Hans Peter Freyther31e97ea2010-07-20 02:46:56 +0800214 },
215};
Harald Welteec8b4502010-02-20 20:34:29 +0100216
Holger Hans Peter Freyther6bfa7442013-08-08 12:38:52 +0200217static void test_octet_return()
218{
219 char out[256];
220 int oct, septets;
221
222 printf("Encoding some tests and printing number of septets/octets\n");
223
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200224 septets = gsm_7bit_encode_n((uint8_t *) out, sizeof(out), "test1234", &oct);
Holger Hans Peter Freyther6bfa7442013-08-08 12:38:52 +0200225 printf("SEPTETS: %d OCTETS: %d\n", septets, oct);
226
227 printf("Done\n");
228}
229
Holger Hans Peter Freyther4d7e49b2013-05-02 22:37:16 +0200230static void test_gen_oa(void)
231{
232 uint8_t oa[12];
233 int len;
234
235 printf("Testing gsm340_gen_oa\n");
236
237 /* first try... */
238 len = gsm340_gen_oa(oa, ARRAY_SIZE(oa), GSM340_TYPE_UNKNOWN,
239 GSM340_PLAN_ISDN, "12345678901234567891");
240 OSMO_ASSERT(len == 12);
241 printf("Result: len(%d) data(%s)\n", len, osmo_hexdump(oa, len));
242 len = gsm340_gen_oa(oa, ARRAY_SIZE(oa), GSM340_TYPE_NATIONAL,
243 GSM340_PLAN_ISDN, "12345678901234567891");
244 OSMO_ASSERT(len == 12);
245 printf("Result: len(%d) data(%s)\n", len, osmo_hexdump(oa, len));
246
247 /* long input.. will fail and just prints the header*/
248 len = gsm340_gen_oa(oa, ARRAY_SIZE(oa), GSM340_TYPE_INTERNATIONAL,
249 GSM340_PLAN_ISDN, "123456789123456789120");
250 OSMO_ASSERT(len == 2);
251 printf("Result: len(%d) data(%s)\n", len, osmo_hexdump(oa, len));
252
253 /* try the alpha numeric encoding */
254 len = gsm340_gen_oa(oa, ARRAY_SIZE(oa), GSM340_TYPE_ALPHA_NUMERIC,
255 GSM340_PLAN_UNKNOWN, "OpenBSC");
256 OSMO_ASSERT(len == 9);
257 printf("Result: len(%d) data(%s)\n", len, osmo_hexdump(oa, len));
258
259 /* long alpha numeric text */
260 len = gsm340_gen_oa(oa, ARRAY_SIZE(oa), GSM340_TYPE_ALPHA_NUMERIC,
261 GSM340_PLAN_UNKNOWN, "OpenBSCabcdefghijklm");
262 OSMO_ASSERT(len == 12);
263 printf("Result: len(%d) data(%s)\n", len, osmo_hexdump(oa, len));
264}
265
Harald Welteec8b4502010-02-20 20:34:29 +0100266int main(int argc, char** argv)
267{
268 printf("SMS testing\n");
269 struct msgb *msg;
Harald Welteec8b4502010-02-20 20:34:29 +0100270 uint8_t i;
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200271 uint16_t buffer_size;
Dennis Wehrle291e6132011-07-24 20:14:13 +0200272 uint8_t octet_length;
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200273 int octets_written;
274 uint8_t computed_octet_length;
Dennis Wehrle291e6132011-07-24 20:14:13 +0200275 uint8_t septet_length;
276 uint8_t gsm_septet_length;
Harald Welteec8b4502010-02-20 20:34:29 +0100277 uint8_t coded[256];
Dennis Wehrle291e6132011-07-24 20:14:13 +0200278 uint8_t tmp[160];
279 uint8_t septet_data[256];
280 uint8_t ud_header[6];
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200281 int nchars;
Harald Welteec8b4502010-02-20 20:34:29 +0100282 char result[256];
283
Holger Hans Peter Freyther31e97ea2010-07-20 02:46:56 +0800284 /* test 7-bit encoding */
Nico Goldec0ce9aa2010-07-20 15:43:58 +0200285 for (i = 0; i < ARRAY_SIZE(test_encode); ++i) {
286 memset(coded, 0x42, sizeof(coded));
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200287 septet_length = gsm_7bit_encode_n(coded, sizeof(coded),
288 (const char *) test_encode[i].input,
289 &octets_written);
290 computed_octet_length = gsm_get_octet_len(septet_length);
291 printf("Encode case %d: "
292 "Octet length %d (expected %d, computed %d), "
293 "septet length %d (expected %d)\n"
294 , i
295 , octets_written, test_encode[i].expected_octet_length, computed_octet_length
296 , septet_length, test_encode[i].expected_septet_length
297 );
Holger Hans Peter Freyther31e97ea2010-07-20 02:46:56 +0800298
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200299 OSMO_ASSERT (octets_written == test_encode[i].expected_octet_length);
300 OSMO_ASSERT (octets_written == computed_octet_length);
301 OSMO_ASSERT (memcmp(coded, test_encode[i].expected, octets_written) == 0);
Dennis Wehrle291e6132011-07-24 20:14:13 +0200302
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200303 /* check buffer limiting */
304 memset(coded, 0xaa, sizeof(coded));
305
306 for (buffer_size = 0;
307 buffer_size < test_encode[i].expected_octet_length + 1
308 && buffer_size < sizeof(coded) - 1;
309 ++buffer_size)
310 {
311 gsm_7bit_encode_n(coded, buffer_size,
312 (const char *) test_encode[i].input,
313 &octets_written);
314
315 OSMO_ASSERT(octets_written <= buffer_size);
316 OSMO_ASSERT(coded[buffer_size] == 0xaa);
Holger Hans Peter Freyther31e97ea2010-07-20 02:46:56 +0800317 }
Harald Welteec8b4502010-02-20 20:34:29 +0100318 }
Nico Golde28de0532010-07-09 17:19:12 +0200319
Dennis Wehrle291e6132011-07-24 20:14:13 +0200320
321 /* Test: encode multiple SMS */
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200322 int number_of_septets = gsm_septet_encode(septet_data, (const char *) test_multiple_encode[0].input);
Dennis Wehrle291e6132011-07-24 20:14:13 +0200323
324 /* SMS part 1 */
325 memset(tmp, 0x42, sizeof(tmp));
326 memset(coded, 0x42, sizeof(coded));
327 memcpy(tmp, septet_data, concatenated_part1_septet_length);
328
329 /* In our case: test_multiple_decode[0].ud_hdr_ind equals number of padding bits*/
330 octet_length = gsm_septets2octets(coded, tmp, concatenated_part1_septet_length, test_multiple_encode[0].ud_hdr_ind);
331
332 /* copy header */
333 memset(tmp, 0x42, sizeof(tmp));
334 int udh_length = test_multiple_encode[0].expected[0] + 1;
335 memcpy(tmp, test_multiple_encode[0].expected, udh_length);
336 memcpy(tmp + udh_length, coded, octet_length);
337 memset(coded, 0x42, sizeof(coded));
338 memcpy(coded, tmp, octet_length + 6);
339
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200340 OSMO_ASSERT(memcmp(coded, test_multiple_encode[0].expected, octet_length) == 0);
Dennis Wehrle291e6132011-07-24 20:14:13 +0200341
342 /* SMS part 2 */
343 memset(tmp, 0x42, sizeof(tmp));
344 memset(coded, 0x42, sizeof(coded));
345 memcpy(tmp, septet_data + concatenated_part1_septet_length, concatenated_part2_septet_length);
346
347 /* In our case: test_multiple_decode[1].ud_hdr_ind equals number of padding bits*/
348 octet_length = gsm_septets2octets(coded, tmp, concatenated_part2_septet_length, test_multiple_encode[1].ud_hdr_ind);
349
350 /* copy header */
351 memset(tmp, 0x42, sizeof(tmp));
352 udh_length = test_multiple_encode[1].expected[0] + 1;
353 memcpy(tmp, test_multiple_encode[1].expected, udh_length);
354 memcpy(tmp + udh_length, coded, octet_length);
355 memset(coded, 0x42, sizeof(coded));
356 memcpy(coded, tmp, octet_length + 6);
357
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200358 OSMO_ASSERT(memcmp(coded, test_multiple_encode[1].expected, octet_length) == 0);
Dennis Wehrle291e6132011-07-24 20:14:13 +0200359
Holger Hans Peter Freyther31e97ea2010-07-20 02:46:56 +0800360 /* test 7-bit decoding */
361 for (i = 0; i < ARRAY_SIZE(test_decode); ++i) {
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200362 memset(result, 0x42, sizeof(result));
363 nchars = gsm_7bit_decode_n_hdr(result, sizeof(result), test_decode[i].input,
Dennis Wehrle291e6132011-07-24 20:14:13 +0200364 test_decode[i].expected_septet_length, test_decode[i].ud_hdr_ind);
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200365 printf("Decode case %d: return value %d (expected %d)\n", i, nchars, strlen(result));
Holger Hans Peter Freyther31e97ea2010-07-20 02:46:56 +0800366
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200367 OSMO_ASSERT(strcmp(result, (const char *) test_decode[i].expected) == 0);
368 OSMO_ASSERT(nchars == strlen(result));
369
370 /* check buffer limiting */
371 memset(result, 0xaa, sizeof(result));
372
373 for (buffer_size = 1;
Holger Hans Peter Freytherbb9f8972013-10-08 13:57:51 +0200374 buffer_size < test_decode[i].expected_septet_length + 1
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200375 && buffer_size < sizeof(result) - 1;
376 ++buffer_size)
377 {
378 nchars = gsm_7bit_decode_n_hdr(result, buffer_size, test_decode[i].input,
379 test_decode[i].expected_septet_length, test_decode[i].ud_hdr_ind);
380
381 OSMO_ASSERT(nchars <= buffer_size);
382 OSMO_ASSERT(result[buffer_size] == (char)0xaa);
383 OSMO_ASSERT(result[nchars] == '\0');
Dennis Wehrle291e6132011-07-24 20:14:13 +0200384 }
Nico Golde28de0532010-07-09 17:19:12 +0200385 }
386
Holger Hans Peter Freyther6bfa7442013-08-08 12:38:52 +0200387 test_octet_return();
Holger Hans Peter Freyther4d7e49b2013-05-02 22:37:16 +0200388 test_gen_oa();
Holger Hans Peter Freyther6bfa7442013-08-08 12:38:52 +0200389
Holger Hans Peter Freyther31e97ea2010-07-20 02:46:56 +0800390 printf("OK\n");
Nico Golde28de0532010-07-09 17:19:12 +0200391 return 0;
Harald Welteec8b4502010-02-20 20:34:29 +0100392}