aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDenis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org>2022-04-18 19:15:42 +0200
committerDenis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org>2022-05-25 03:03:46 +0200
commit77b5959542cb33b7e708df4fa0cbee7467e684c4 (patch)
treef20b76e30273af578ac30e9ab65166ed4817221e
parent271fcda9d9b9652116c6a40c09f3474264410df1 (diff)
downloadhardware_replicant_libsamsung-ipc-77b5959542cb33b7e708df4fa0cbee7467e684c4.tar.gz
hardware_replicant_libsamsung-ipc-77b5959542cb33b7e708df4fa0cbee7467e684c4.tar.bz2
hardware_replicant_libsamsung-ipc-77b5959542cb33b7e708df4fa0cbee7467e684c4.zip
merge
Signed-off-by: Denis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org>
-rw-r--r--tools/ipc-modem/ipc-modem-sms.c73
-rw-r--r--tools/ipc-modem/ipc-modem-sms.h11
-rw-r--r--tools/ipc-modem/ipc-modem.c10
-rw-r--r--tools/ipc-modem/tests/ipc-modem-sms-test.c2
4 files changed, 65 insertions, 31 deletions
diff --git a/tools/ipc-modem/ipc-modem-sms.c b/tools/ipc-modem/ipc-modem-sms.c
index e705332..981e709 100644
--- a/tools/ipc-modem/ipc-modem-sms.c
+++ b/tools/ipc-modem/ipc-modem-sms.c
@@ -27,9 +27,25 @@
#include "ipc-modem-log.h"
#include "ipc-modem-sms.h"
+/* SC address:
+ * +------------+---------------------------------------------------+
+ * | Size | Content |
+ * +------------+---------------------------------------------------+
+ * | 1 byte | SC address number of digits |
+ * | 1 byte | Flags (Extension, type of number, numbering plan) |
+ * | 0+ bytes | SC number |
+ * +------------+---------------------------------------------------+
+ */
+struct sc_address_header_1 {
+ uint8_t length;
+ uint8_t flags;
+};
+
/*
* M: Mandatory, O: Optional
+ * +------------+---+----------------------------------------------+
* | Size | | Content |
+ * +------------+---+----------------------------------------------+
* | 1 byte | M | TP-RP, TP-UDHI, TP-SRI TP-LP, TP-MMS, TP-MTI |
* | 1 byte | M | TP-OA length |
* | 1 byte | M | TP-OA flags |
@@ -39,8 +55,8 @@
* | 7 bytes | M | TP-SCTS |
* | 1 byte | M | TP-UDL |
* | | O | TP-UD |
+ * +------------+---+----------------------------------------------+
*/
-
struct sms_header_1 {
/* TP-RP, TP-UDHI, TP-SRI TP-LP, TP-MMS, TP-MTI */
uint8_t tp_flags;
@@ -64,16 +80,14 @@ size_t ipc_modem_sc_address_size_extract(struct ipc_modem_data *data,
digits_size = (raw_pdu[0] + 1 / 2);
- // TODO: what about flags?
- // 2: TODO: we have 2 bytes after the SC address...
+ // TODO: how does it work if digit_size is 0?
/*
* 1 byte: SC Address length
* 1 byte: extensions / prefixes etc
* [SC address digits]
- * 2 bytes: ? (TODO)
*/
- return digits_size + 2 + 2;
+ return digits_size + 2;
}
// TODO: handle memcpy / free
@@ -87,42 +101,55 @@ void *ipc_modem_ts_03_40_pdu_extract(struct ipc_modem_data *data,
return (void*)(raw_pdu + 1 + sc_address_size);
}
-size_t *ipc_modem_ts_03_40_pdu_size_extract(struct ipc_modem_data *data,
- const char *raw_pdu)
-{
- // return raw_pdu size (sc_address_size + 1);
-}
-
int ipc_modem_parse_sms_pdu(struct ipc_modem_data *data,
- const char *ts_03_40_pdu, size_t ts_03_40_pdu_size,
+ const char *raw_pdu, size_t raw_pdu_size,
struct sms_header **sms_header,
char **sms_text)
{
+ struct sc_address_header_1 *sc_address_header_1;
struct sms_header_1 *header_1;
struct sms_header_2 *header_2;
char *_sms_text;
struct sms_header *_sms_header;
+ const char *ts_03_40_pdu;
+ size_t ts_03_40_pdu_size;
+
uint8_t *tp_ud;
ssize_t pdu_min_header_size;
ssize_t tp_oa_len;
- size_t offset;
+ size_t offset = 0;
int rc;
int i;
- if (sms_header)
- _sms_header = calloc(1, sizeof(struct sms_header));
+#define TEST_03_40 1
- pdu_min_header_size = sizeof(struct sms_header_1) +
- sizeof(struct sms_header_2);
+#if TEST_03_40 == 0
+ sc_address_header_1 = (void*)raw_pdu;
+
+ offset += ipc_modem_sc_address_size_extract(data, raw_pdu);
+
+ // 2: TODO: we have 2 bytes after the SC address...
+ offset += 2;
+
+ ts_03_40_pdu = ipc_modem_ts_03_40_pdu_extract(data, raw_pdu + offset);
+
+#else
+ ts_03_40_pdu = raw_pdu;
- if (ts_03_40_pdu_size < pdu_min_header_size) {
+ if (raw_pdu_size < pdu_min_header_size) {
ipc_modem_log(data->client, MODEM_LOG_INFO,
"%s: SMS PDU size < minimum SMS PDU header size",
__func__);
return -EINVAL;
}
+#endif
+ if (sms_header)
+ _sms_header = calloc(1, sizeof(struct sms_header));
+
+ pdu_min_header_size = sizeof(struct sms_header_1) +
+ sizeof(struct sms_header_2);
header_1 = (void*)ts_03_40_pdu;
tp_oa_len = ((header_1->tp_oa_len) / 2 + (header_1->tp_oa_len % 2));
@@ -207,7 +234,7 @@ int ipc_modem_parse_sms_pdu(struct ipc_modem_data *data,
}
int ipc_modem_print_sms_pdu(struct ipc_modem_data *data,
- const char *ts_03_40_pdu, size_t ts_03_40_pdu_size)
+ const char *raw_pdu, size_t raw_pdu_size)
{
struct sms_header *header;
ssize_t tp_oa_len;
@@ -216,7 +243,7 @@ int ipc_modem_print_sms_pdu(struct ipc_modem_data *data,
char *sms_text;
int i, rc;
- rc = ipc_modem_parse_sms_pdu(data, ts_03_40_pdu, ts_03_40_pdu_size,
+ rc = ipc_modem_parse_sms_pdu(data, raw_pdu, raw_pdu_size,
&header, &sms_text);
if (rc)
return rc;
@@ -267,9 +294,9 @@ int ipc_modem_print_sms_pdu(struct ipc_modem_data *data,
ipc_client_log(
data->client,
"================================= SMS PDU data =================================");
- ipc_data_dump(data->client, (void *) ts_03_40_pdu,
- ts_03_40_pdu_size > 0x100 ?
- 0x100 : ts_03_40_pdu_size);
+ ipc_data_dump(data->client, (void *) raw_pdu,
+ raw_pdu_size > 0x100 ?
+ 0x100 : raw_pdu_size);
ipc_client_log(
data->client,
"================================================================================");
diff --git a/tools/ipc-modem/ipc-modem-sms.h b/tools/ipc-modem/ipc-modem-sms.h
index 08581a7..8eb5766 100644
--- a/tools/ipc-modem/ipc-modem-sms.h
+++ b/tools/ipc-modem/ipc-modem-sms.h
@@ -25,6 +25,17 @@
#include "ipc-modem-sms.h"
struct sms_header {
+ uint8_t sc_address_length;
+ uint8_t sc_address_flags;
+ /* From https://en.wikipedia.org/wiki/E.164: "Plan-conforming
+ * numbers are limited to a maximum of 15 digits, excluding the
+ * international call prefix[1].
+ *
+ * TODO: Some (german) numbers can be longer in practice if I
+ * recall well. Reference: one of the osmocom talks.
+ */
+ uint8_t sc_address[15];
+
/* TP-RP, TP-UDHI, TP-SRI TP-LP, TP-MMS, TP-MTI */
uint8_t tp_flags;
diff --git a/tools/ipc-modem/ipc-modem.c b/tools/ipc-modem/ipc-modem.c
index eaa8d7a..2001b35 100644
--- a/tools/ipc-modem/ipc-modem.c
+++ b/tools/ipc-modem/ipc-modem.c
@@ -297,7 +297,7 @@ static void modem_response_sms(struct ipc_modem_data *data,
break;
raw_pdu_size = ipc_sms_incoming_msg_pdu_size_extract(resp->data,
- resp->size);
+ resp->size);
ipc_modem_log(
data->client,
MODEM_LOG_INFO,
@@ -324,14 +324,10 @@ static void modem_response_sms(struct ipc_modem_data *data,
if (raw_pdu_size < sc_address_size)
break;
- ts_03_40_pdu = ipc_modem_ts_03_40_pdu_extract(data, raw_pdu);
- ts_03_40_pdu_size = ipc_modem_ts_03_40_pdu_size_extract(data,
- raw_pdu);
-
- ipc_modem_print_sms_pdu(data, ts_03_40_pdu, ts_03_40_pdu_size);
+ ipc_modem_print_sms_pdu(data, raw_pdu, raw_pdu_size);
rc = ipc_modem_parse_sms_pdu(data,
- ts_03_40_pdu, ts_03_40_pdu_size,
+ raw_pdu, raw_pdu_size,
NULL, &sms_text);
if (rc < 0)
break;
diff --git a/tools/ipc-modem/tests/ipc-modem-sms-test.c b/tools/ipc-modem/tests/ipc-modem-sms-test.c
index f1ad44a..720202a 100644
--- a/tools/ipc-modem/tests/ipc-modem-sms-test.c
+++ b/tools/ipc-modem/tests/ipc-modem-sms-test.c
@@ -122,7 +122,7 @@ static int run_tests(struct ipc_modem_data *data)
int rc;
rc |= run_test(data, test_gsmtap_osmocombb, "test_gsmtap_osmocombb");
- rc |= run_test(data, test_gammu_pdu_encode, "test_gammu_pdu_encode");
+ // rc |= run_test(data, test_gammu_pdu_encode, "test_gammu_pdu_encode");
return rc;
}