aboutsummaryrefslogtreecommitdiffstats
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
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
-rw-r--r--TODO-RELEASE4
-rw-r--r--include/osmocom/gsm/gsm0480.h12
-rw-r--r--src/gsm/gsm0480.c26
3 files changed, 32 insertions, 10 deletions
diff --git a/TODO-RELEASE b/TODO-RELEASE
index 928b18d6..16496d68 100644
--- a/TODO-RELEASE
+++ b/TODO-RELEASE
@@ -10,4 +10,6 @@
core msgb_queue_free() add inline func to msgb.h
coding gsm0503_rach_ext-encode() add func to gsm0503_coding.h
codec ecu.c / ecu.h implement ECU for FR (Error Concealment Unit)
-fsm fsmc / fsm.h added callback for graceful exit => ABI changed \ No newline at end of file
+fsm fsmc / fsm.h added callback for graceful exit => ABI changed
+gsm gsm0480.c / gsm0480.h the 'ss_request' struct extended with ussd_data,
+ ussd_data_len, and ussd_data_dcs => ABI changed
diff --git a/include/osmocom/gsm/gsm0480.h b/include/osmocom/gsm/gsm0480.h
index 05c26dfc..b0b6aa29 100644
--- a/include/osmocom/gsm/gsm0480.h
+++ b/include/osmocom/gsm/gsm0480.h
@@ -67,6 +67,18 @@ struct ss_request {
uint8_t ussd_text[GSM0480_USSD_OCTET_STRING_LEN];
/**
+ * Represents the data of either an INVOKE, either
+ * a RETURN_RESULT component 'as is'. Useful when
+ * decoding is not supported or not desired.
+ *
+ * Shall be always followed by its length (in bytes)
+ * and DCS (Data Coding Scheme).
+ */
+ uint8_t ussd_data[GSM0480_USSD_OCTET_STRING_LEN];
+ uint8_t ussd_data_len; /* Length in bytes */
+ uint8_t ussd_data_dcs; /* Data Coding Scheme */
+
+ /**
* GSM TS 04.80, section 3.3 "Transaction identifier"
* See GSM TS 04.07, section 11.2.3 for details.
*/
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;
}