diff options
author | Vadim Yanitskiy <axilirator@gmail.com> | 2018-04-04 10:34:41 +0700 |
---|---|---|
committer | Vadim Yanitskiy <axilirator@gmail.com> | 2018-04-04 20:22:13 +0700 |
commit | a24ead01260b472dcdf5c18190468aac9b9f43cb (patch) | |
tree | 59a96c77226e2fdd543c900450be62fc9bbb0c2b /src | |
parent | 9fb7e3a9fbee8a9cd80f617f634174de8321049a (diff) |
gsm0480: copy the raw USSD data, its DCS and length
As it was already documented before, the 'ss_request' struct has
a rudiment of deprecated 'ussd_request' struct - the 'ussd_text'
field. It represents the data either of an INVOKE component,
either of a RETURN_RESULT component, encoded as ASCII in case
if DCS is 0x0f (i.e. decoded by the code itself), otherwise
raw bytes 'as is'.
Previously, there was no possibility to distinguish between
ASCII and raw bytes with different DCS. Moreover, the payload
decoding is not desired in some cases.
Let's introduce the new fields, which will carry the raw
unmodified payload, its length and DCS (Data Coding Scheme).
Change-Id: Ia193d175021e145bb3b131290231f307dbefc64a
Diffstat (limited to 'src')
-rw-r--r-- | src/gsm/gsm0480.c | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/src/gsm/gsm0480.c b/src/gsm/gsm0480.c index 0072812d..38082b32 100644 --- a/src/gsm/gsm0480.c +++ b/src/gsm/gsm0480.c @@ -557,6 +557,11 @@ static int parse_process_uss_data(const uint8_t *uss_req_data, uint16_t length, memcpy(req->ussd_text, uss_req_data + 2, num_chars); + /* Copy the data 'as is' */ + memcpy(req->ussd_data, uss_req_data + 2, num_chars); + req->ussd_data_len = num_chars; + req->ussd_data_dcs = 0x00; + return 1; } @@ -580,6 +585,17 @@ static int parse_process_uss_req(const uint8_t *uss_req_data, uint16_t length, /* Get DCS (Data Coding Scheme) */ dcs = uss_req_data[4]; + /* Get the amount of bytes */ + num_chars = uss_req_data[6]; + + /* Prevent a mobile-originated buffer-overrun! */ + if (num_chars > GSM0480_USSD_OCTET_STRING_LEN) + num_chars = GSM0480_USSD_OCTET_STRING_LEN; + + /* Copy the data 'as is' */ + memcpy(req->ussd_data, uss_req_data + 7, num_chars); + req->ussd_data_len = num_chars; + req->ussd_data_dcs = dcs; /** * According to GSM 04.08, 4.4.2 "ASN.1 data types": @@ -588,7 +604,7 @@ static int parse_process_uss_req(const uint8_t *uss_req_data, uint16_t length, */ if (dcs == 0x0F) { /* Calculate the amount of 7-bit characters */ - num_chars = (uss_req_data[6] * 8) / 7; + num_chars = (num_chars * 8) / 7; /* Prevent a mobile-originated buffer-overrun! */ if (num_chars > GSM0480_USSD_7BIT_STRING_LEN) @@ -599,15 +615,7 @@ static int parse_process_uss_req(const uint8_t *uss_req_data, uint16_t length, return 1; } else { - /* Get the amount of 8-bit characters */ - num_chars = uss_req_data[6]; - - /* Prevent a mobile-originated buffer-overrun! */ - if (num_chars > GSM0480_USSD_OCTET_STRING_LEN) - num_chars = GSM0480_USSD_OCTET_STRING_LEN; - memcpy(req->ussd_text, &(uss_req_data[7]), num_chars); - return 1; } |