From 4d7e49bc0a094c27352f43cad0a8556a9bd3befa Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Thu, 2 May 2013 22:37:16 +0200 Subject: sms: Implement encoding the address as alphanumeric type The number of digits is the number of used octets times two (two digits per octet). The result has been successfully dissected by wireshark. It has not been tested with real phones. --- src/gsm/gsm0411_utils.c | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/gsm/gsm0411_utils.c b/src/gsm/gsm0411_utils.c index fe69bf41..a8ba810d 100644 --- a/src/gsm/gsm0411_utils.c +++ b/src/gsm/gsm0411_utils.c @@ -4,7 +4,7 @@ /* (C) 2008 by Daniel Willmann * (C) 2009 by Harald Welte - * (C) 2010 by Holger Hans Peter Freyther + * (C) 2010-2013 by Holger Hans Peter Freyther * (C) 2010 by On-Waves * (C) 2011 by Andreas Eversberg * @@ -33,6 +33,8 @@ #include #include +#include +#include #include #define GSM411_ALLOC_SIZE 1024 @@ -269,16 +271,26 @@ int gsm340_gen_oa(uint8_t *oa, unsigned int oa_len, uint8_t type, { int len_in_bytes; - /* prevent buffer overflows */ - if (strlen(number) > 20) - number = ""; - oa[1] = 0x80 | (type << 4) | plan; - len_in_bytes = gsm48_encode_bcd_number(oa, oa_len, 1, number); - - /* GSM 03.40 tells us the length is in 'useful semi-octets' */ - oa[0] = strlen(number) & 0xff; + if (type == GSM340_TYPE_ALPHA_NUMERIC) { + /* + * TODO/FIXME: what is the 'useful semi-octets' excluding any + * semi octet containing only fill bits. + * The current code picks the number of bytes written by the + * 7bit encoding routines and multiplies it by two. + */ + gsm_7bit_encode_n(&oa[2], oa_len - 2, number, &len_in_bytes); + oa[0] = len_in_bytes * 2; + len_in_bytes += 2; + } else { + /* prevent buffer overflows */ + if (strlen(number) > 20) + number = ""; + len_in_bytes = gsm48_encode_bcd_number(oa, oa_len, 1, number); + /* GSM 03.40 tells us the length is in 'useful semi-octets' */ + oa[0] = strlen(number) & 0xff; + } return len_in_bytes; } -- cgit v1.2.3