summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/pdu.h16
-rw-r--r--src/pdu_decode.c14
-rw-r--r--src/sms_list.c4
3 files changed, 32 insertions, 2 deletions
diff --git a/src/pdu.h b/src/pdu.h
index 5b4eb15..dea429a 100644
--- a/src/pdu.h
+++ b/src/pdu.h
@@ -60,6 +60,21 @@ enum {
PDU_ALPHABET_DEFAULT_MULTI = 9,//no GSM, LVW2 7-bit, multi-part
};
+// CDMA Teleservice Identifiers (what type of message is received in CDMA network)
+// All such identifiers are described in 3GPP2 X.S0004-550-E, section 2.256 SMS_TeleserviceIdentifier
+enum {
+ PDU_TELE_ID_UNUSED = 0, // Not used.
+ // 1 - Reserved for maintenance.
+ // 2 through 4095 - Reserved for assignment by MAP.
+ // ...
+ PDU_TELE_ID_CDMA_PAGE = 4097, // CDMA Cellular Paging Teleservice.
+ PDU_TELE_ID_CDMA_MSG = 4098, // CDMA Cellular Messaging Teleservices.
+ PDU_TELE_ID_CDMA_VOICE_MSG_NOTIF = 4099, // CDMA Voice Mail Notification
+ // ...
+ PDU_TELE_ID_CDMA_WEMT = 4101 // CDMA Wireless Enhanced Messaging Teleservice (WEMT).
+ // ...
+};
+
struct pdu_info {
int msg_len;
struct pdu_addr smsc_addr;
@@ -77,6 +92,7 @@ struct pdu_info {
} type;
uint8_t msg_reference;
uint8_t protocol_id;
+ uint16_t teleservice_id; // CDMA-specific, see 3GPP2 X.S0004-550-E for details
union {
uint8_t data_coding;
struct {
diff --git a/src/pdu_decode.c b/src/pdu_decode.c
index d67d5c3..9c0ced5 100644
--- a/src/pdu_decode.c
+++ b/src/pdu_decode.c
@@ -290,11 +290,15 @@ int pdu_decode_user_data(const char *pdu_str, struct pdu_info *pdu, int *nr_octe
(pdu->data_coding.general.alphabet == PDU_ALPHABET_DEFAULT2) ||
(pdu->data_coding.general.alphabet == PDU_ALPHABET_DEFAULT_MULTI)||
(pdu->data_coding.general.alphabet == PDU_ALPHABET_TE)) {
- // Keep UDH for concatenated SMS.
+ // Keep UDH for concatenated SMS ONLY.
// Otherwise it is impossible to process correctly concatenated SMS.
i = 0;
if (pdu->type.user_data_header ||
- (pdu->data_coding.general.alphabet == PDU_ALPHABET_DEFAULT_MULTI)) {
+ // For LVW3, LNA3 and LVW2 - Save header ONLY when it's actually a multi-part message.
+ // Multi-part messages should use Teleservice ID 4101 (0x1005) in LVW2 7-BIT MULTI-PART format.
+ // See 3GPP2 X.S0004-550-E for details on Teleservice ID.
+ (pdu->data_coding.general.alphabet == PDU_ALPHABET_DEFAULT_MULTI
+ && pdu->teleservice_id == PDU_TELE_ID_CDMA_WEMT)) {
for (i = 0; i <= octets[0]; ++i) {
pdu->user_data[i] = octets[i];
}
@@ -536,11 +540,17 @@ int pdu_decode_cdma(const char *pdu_str, struct pdu_info *pdu)
pdu_str += HEX_BYTE_LEN;
log_debug("tele-id-1: 0x%02X", tmp);
+ pdu->teleservice_id = 0;
+ pdu->teleservice_id |= (tmp << 8); // save upper byte of the Teleservice ID
+
tmp = hex_byte_decode(pdu_str);
DECODE_FAIL(tmp < 0, "tele-id-2", -1);
pdu_str += HEX_BYTE_LEN;
log_debug("tele-id-2: 0x%02X", tmp);
+ pdu->teleservice_id |= (tmp); // save lower byte of the Teleservice ID
+ log_debug("tele-id: 0x%04X", pdu->teleservice_id);
+
//Priority
tmp = hex_byte_decode(pdu_str);
DECODE_FAIL(tmp < 0, "priority", -1);
diff --git a/src/sms_list.c b/src/sms_list.c
index dcad3fe..678c158 100644
--- a/src/sms_list.c
+++ b/src/sms_list.c
@@ -178,6 +178,10 @@ static int print_list_yaml(struct msg_list_info *list_info)
indentf(indent, "protocol-id: 0x%02X\n", msg->pdu.protocol_id);
if (Global.core.verbose) {
+ indentf(indent, "tele-id: 0x%04X\n", msg->pdu.teleservice_id);
+ }
+
+ if (Global.core.verbose) {
indentf(indent, "addr-length: 0x%02X\n", msg->pdu.addr.len);
}
indentf(indent, "addr-type: 0x%02X\n", msg->pdu.addr.type);