aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorVadim Yanitskiy <axilirator@gmail.com>2018-04-04 10:34:41 +0700
committerVadim Yanitskiy <axilirator@gmail.com>2018-04-04 20:22:13 +0700
commita24ead01260b472dcdf5c18190468aac9b9f43cb (patch)
tree59a96c77226e2fdd543c900450be62fc9bbb0c2b /src
parent9fb7e3a9fbee8a9cd80f617f634174de8321049a (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.c26
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;
}