summaryrefslogtreecommitdiffstats
path: root/tests/ussd
diff options
context:
space:
mode:
authorAndreas Eversberg <jolly@eversberg.eu>2013-08-08 12:38:53 +0200
committerHolger Hans Peter Freyther <holger@moiji-mobile.com>2013-08-08 14:27:13 +0200
commit9597555a362cd28c02e9bbfe4f55c4b90ecdfa34 (patch)
tree819721bf3ee366ff6a333da64cb646519e1e0a2c /tests/ussd
parent6bfa7445fca074fdf94707681d93e92ec0993bbd (diff)
Add special 7-bit encoding and decoding functions for USSD coding
Handling 7-bit coding is a little different for USSD, as TS 03.38 states: To avoid the situation where the receiving entity confuses 7 binary zero pad bits as the @ character, the carriage return or <CR> character shall be used for padding in this situation [...]. If <CR> is intended to be the last character and the message (including the wanted <CR>) ends on an octet boundary, then another <CR> must be added together with a padding bit 0. The receiving entity will perform the carriage return function twice, but this will not result in misoperation as the definition of <CR> [...] is identical to the definition of <CR><CR>. The receiving entity shall remove the final <CR> character where the message ends on an octet boundary with <CR> as the last character. Jacob has verified the fix with fakeBTS and the wireshark dissector. Fixes: OW#947 Reviewed-by: Jacob Erlbeck <jerlbeck@sysmocom.de>
Diffstat (limited to 'tests/ussd')
-rw-r--r--tests/ussd/ussd_test.c22
-rw-r--r--tests/ussd/ussd_test.ok21
2 files changed, 43 insertions, 0 deletions
diff --git a/tests/ussd/ussd_test.c b/tests/ussd/ussd_test.c
index 55384f10..d41c141d 100644
--- a/tests/ussd/ussd_test.c
+++ b/tests/ussd/ussd_test.c
@@ -22,6 +22,7 @@
#include <osmocom/core/application.h>
#include <osmocom/core/logging.h>
#include <osmocom/gsm/gsm0480.h>
+#include <osmocom/gsm/gsm_utils.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -68,6 +69,20 @@ static int parse_mangle_ussd(const uint8_t *_data, int len)
struct log_info info = {};
+void gsm_7bit_ussd(char *text)
+{
+ uint8_t coded[256];
+ char decoded[256];
+ int y;
+
+ printf("original = %s\n", osmo_hexdump((uint8_t *)text, strlen(text)));
+ gsm_7bit_encode_ussd(coded, text, &y);
+ printf("encoded = %s\n", osmo_hexdump(coded, y));
+ gsm_7bit_decode_ussd(decoded, coded, y * 8 / 7);
+ y = strlen(decoded);
+ printf("decoded = %s\n\n", osmo_hexdump((uint8_t *)decoded, y));
+}
+
int main(int argc, char **argv)
{
struct ussd_request req;
@@ -93,5 +108,12 @@ int main(int argc, char **argv)
printf("Result for %d is %d\n", rc, i);
}
+ printf("<CR> case test for 7 bit encode\n");
+ gsm_7bit_ussd("01234567");
+ gsm_7bit_ussd("0123456");
+ gsm_7bit_ussd("01234567\r");
+ gsm_7bit_ussd("0123456\r");
+ gsm_7bit_ussd("012345\r");
+
return 0;
}
diff --git a/tests/ussd/ussd_test.ok b/tests/ussd/ussd_test.ok
index 1b6316e8..91f2a315 100644
--- a/tests/ussd/ussd_test.ok
+++ b/tests/ussd/ussd_test.ok
@@ -51,3 +51,24 @@ Result for 0 is 8
Result for 0 is 7
Result for 0 is 6
Result for 1 is 5
+<CR> case test for 7 bit encode
+original = 30 31 32 33 34 35 36 37
+encoded = b0 98 6c 46 ab d9 6e
+decoded = 30 31 32 33 34 35 36 37
+
+original = 30 31 32 33 34 35 36
+encoded = b0 98 6c 46 ab d9 1a
+decoded = 30 31 32 33 34 35 36
+
+original = 30 31 32 33 34 35 36 37 0d
+encoded = b0 98 6c 46 ab d9 6e 0d
+decoded = 30 31 32 33 34 35 36 37 0d
+
+original = 30 31 32 33 34 35 36 0d
+encoded = b0 98 6c 46 ab d9 1a 0d
+decoded = 30 31 32 33 34 35 36 0d 0d
+
+original = 30 31 32 33 34 35 0d
+encoded = b0 98 6c 46 ab 35 1a
+decoded = 30 31 32 33 34 35 0d
+