diff options
author | laforge <laforge@99fdad57-331a-0410-800a-d7fa5415bdb3> | 2007-08-16 04:18:54 +0000 |
---|---|---|
committer | laforge <laforge@99fdad57-331a-0410-800a-d7fa5415bdb3> | 2007-08-16 04:18:54 +0000 |
commit | 66ddffab0a8fe2f517d83859ffb20467acd0cbe6 (patch) | |
tree | f207a43dddc8205763309e8b9b3bb5043f96647e /include | |
parent | 00361c2946aef3975e302d5a5957ae239da21de8 (diff) |
From 294d27e78680d497da22e3a8ad679f50d1ba29e5 Mon Sep 17 00:00:00 2001
From: Andrzej Zaborowski <balrog@zabor.org>
Date: Wed, 11 Jul 2007 16:11:10 +0200
Subject: [PATCH] SMS support in gsmd and in libgsmd.
This adds the proper support for sms related calls in libgsmd and their
implementation in gsmd.
I assumed that conversion between data coding schemes is to be done on the
client side because the {packing,unpacking}* calls were exported. TEXT mode
support is non-functional, but the code only has to be filled in the right
places to make it work, if it is ever needed.
I had been lucky to be able to test with the different kinds of messages with
exotic formats because I just got a bunch of network messages today (urging to
top-up the credit).
I tried to not modify the libgsmd api, although I would prefer to have a
totally different api, possibly with synchronous calls that just return the
result of an operation, for a exmaple a whole list of messages, rather than the
client waiting for an unknown number of events each with one message.
git-svn-id: http://svn.openmoko.org/trunk/src/target/gsm@2710 99fdad57-331a-0410-800a-d7fa5415bdb3
Diffstat (limited to 'include')
-rw-r--r-- | include/gsmd/gsmd.h | 1 | ||||
-rw-r--r-- | include/gsmd/sms.h | 14 | ||||
-rw-r--r-- | include/gsmd/usock.h | 79 | ||||
-rw-r--r-- | include/libgsmd/sms.h | 31 |
4 files changed, 87 insertions, 38 deletions
diff --git a/include/gsmd/gsmd.h b/include/gsmd/gsmd.h index 4362999..9a929b4 100644 --- a/include/gsmd/gsmd.h +++ b/include/gsmd/gsmd.h @@ -63,6 +63,7 @@ struct llparser { struct gsmd; #define GSMD_FLAG_V0 0x0001 /* V0 responses to be expected from TA */ +#define GSMD_FLAG_SMS_FMT_TEXT 0x0002 /* TODO Use TEXT rather than PDU mode */ struct gsmd { unsigned int flags; diff --git a/include/gsmd/sms.h b/include/gsmd/sms.h new file mode 100644 index 0000000..145b585 --- /dev/null +++ b/include/gsmd/sms.h @@ -0,0 +1,14 @@ +#ifndef __GSMD_SMS_H +#define __GSMD_SMS_H + +#ifdef __GSMD__ + +#include <gsmd/gsmd.h> + +int sms_pdu_make_smssubmit(char *dest, const struct gsmd_sms_submit *src); +int sms_pdu_to_msg(struct gsmd_sms_list *dst, const u_int8_t *src, + int pdulen, int len); + +#endif /* __GSMD__ */ + +#endif diff --git a/include/gsmd/usock.h b/include/gsmd/usock.h index 2032230..631238a 100644 --- a/include/gsmd/usock.h +++ b/include/gsmd/usock.h @@ -87,6 +87,23 @@ enum gsmd_msg_sms_fmt { GSMD_SMS_FMT_TEXT = 1, }; +/* Data Coding Scheme, refer to GSM 03.38 Clause 4 */ +#define B5_COMPRESSED (1<<5) +#define B4_CLASSMEANING (1<<4) +enum { + MESSAGE_CLASS_CLASS0 = 0x00, + MESSAGE_CLASS_CLASS1 = 0x01, + MESSAGE_CLASS_CLASS2 = 0x10, + MESSAGE_CLASS_CLASS3 = 0x11, +}; + +enum gsmd_sms_alphabet { + ALPHABET_DEFAULT = (0x00<<2), + ALPHABET_8BIT = (0x01<<2), + ALPHABET_UCS2 = (0x10<<2), + ALPHABET_RESERVED = (0x11<<2), +}; + /* Refer to GSM 03.40 subclause 9.2.3.1 */ enum gsmd_sms_tp_mti { GSMD_SMS_TP_MTI_DELIVER = 0, @@ -139,7 +156,7 @@ enum gsmd_sms_tp_rp { /* for SMS-SUBMIT, SMS-DELIVER */ enum gsmd_sms_tp_udhi { GSMD_SMS_TP_UDHI_NO_HEADER = (0<<6), - GSMD_SMS_TP_UDHI_WTIH_HEADER = (1<<6), + GSMD_SMS_TP_UDHI_WITH_HEADER = (1<<6), }; /* SMS delflg from 3GPP TS 07.05, Clause 3.5.4 */ @@ -160,6 +177,35 @@ enum gsmd_msg_phonebook { GSMD_PHONEBOOK_GET_SUPPORT = 6, }; +/* Type-of-Address, Numbering-Plan-Identification field, GSM 03.40, 9.1.2.5 */ +enum gsmd_toa_npi { + GSMD_TOA_NPI_UNKNOWN = 0x0, + GSMD_TOA_NPI_ISDN = 0x1, + GSMD_TOA_NPI_DATA = 0x3, + GSMD_TOA_NPI_TELEX = 0x4, + GSMD_TOA_NPI_NATIONAL = 0x8, + GSMD_TOA_NPI_PRIVATE = 0x9, + GSMD_TOA_NPI_ERMES = 0xa, + GSMD_TOA_NPI_RESERVED = 0xf, +}; + +/* Type-of-Address, Type-of-Number field, GSM 03.40, Subclause 9.1.2.5 */ +enum gsmd_toa_ton { + GSMD_TOA_TON_UNKNOWN = (0<<4), + GSMD_TOA_TON_INTERNATIONAL = (1<<4), + GSMD_TOA_TON_NATIONAL = (2<<4), + GSMD_TOA_TON_NETWORK = (3<<4), + GSMD_TOA_TON_SUBSCRIBER = (4<<4), + GSMD_TOA_TON_ALPHANUMERIC = (5<<4), + GSMD_TOA_TON_ABBREVIATED = (6<<4), + __GSMD_TOA_TON_MASK = (7<<4), +}; + +/* Type-of-Address, bit 7 always 1 */ +enum gsmd_toa_reserved { + GSMD_TOA_RESERVED = (1<<7), +}; + /* Length from 3GPP TS 04.08, Clause 10.5.4.7 */ #define GSMD_ADDR_MAXLEN 32 @@ -244,30 +290,33 @@ struct gsmd_sms_delete { #define GSMD_SMS_DATA_MAXLEN 164 struct gsmd_sms { u_int8_t length; + u_int8_t coding_scheme; + int has_header; char data[GSMD_SMS_DATA_MAXLEN+1]; } __attribute__ ((packed)); +/* Refer to GSM 03.40 subclause 9.2.2.2 */ +struct gsmd_sms_submit { + struct gsmd_addr addr; + struct gsmd_sms payload; +}; + /* Refer to GSM 07.05 subclause 4.4 */ struct gsmd_sms_write { u_int8_t stat; - struct gsmd_sms sms; -} __attribute__ ((packed)); - -/* Refer to GSM 03.40 subclause 9.2.2.2 */ -struct gsmd_sms_submit { - u_int8_t length; - char data[GSMD_SMS_DATA_MAXLEN+1]; + struct gsmd_sms_submit sms; } __attribute__ ((packed)); /* Refer to GSM 03.40 subclause 9.2.2.1 */ -struct gsmd_sms_deliver { - u_int8_t length; - char origl_addr[12]; - u_int8_t proto_ident; - u_int8_t coding_scheme; +struct gsmd_sms_list { + /* FIXME Defined as in range of location numbers supported by memory */ + u_int8_t index; + enum gsmd_msg_sms_type stat; char time_stamp[7]; - char user_data[140]; -} __attribute__ ((packed)); + struct gsmd_addr addr; + struct gsmd_sms payload; + int is_last; +}; /* Refer to GSM 07.07 subclause 8.12 */ struct gsmd_phonebook_readrg { diff --git a/include/libgsmd/sms.h b/include/libgsmd/sms.h index a07fc74..6a62c38 100644 --- a/include/libgsmd/sms.h +++ b/include/libgsmd/sms.h @@ -5,23 +5,6 @@ /* Short Message Service */ -/* Data Coding Scheme, refer to GSM 03.38 Clause 4 */ -#define B5_COMPRESSED (1<<5) -#define B4_CLASSMEANING (1<<4) -enum { - MESSAGE_CLASS_CLASS0 = 0x00, - MESSAGE_CLASS_CLASS1 = 0x01, - MESSAGE_CLASS_CLASS2 = 0x10, - MESSAGE_CLASS_CLASS3 = 0x11, -}; - -enum { - ALPHABET_DEFAULT = (0x00<<2), - ALPHABET_8BIT = (0x01<<2), - ALPHABET_UCS2 = (0x10<<2), - ALPHABET_RESERVED = (0x11<<2), -}; - /* Coding of Alpha fields in the SIM for UCS2, (3GPP TS 11.11 Annex B) */ //enum { @@ -57,15 +40,17 @@ struct lgsm_sms_delete { #define LGSM_SMS_ADDR_MAXLEN 12 #define LGSM_SMS_DATA_MAXLEN 140 struct lgsm_sms { - /* FIXME: max length of data, - * 7 bit coding - 160(140*8/7); ucs2 coding - 70(140/2) */ char addr[LGSM_SMS_ADDR_MAXLEN+1]; - char data[LGSM_SMS_DATA_MAXLEN+1]; + /* FIXME: max length of data, + * 7 bit coding - 160(140*8/7); ucs2 coding - 70(140/2) */ + enum gsmd_sms_alphabet alpha; + u_int8_t data[LGSM_SMS_DATA_MAXLEN+1]; + int length; }; /* GSM 03.40 subclause 9.2.2.2 and GSM 07.05 subclause 4.4 and subclause 3.1 */ struct lgsm_sms_write { - enum lgsm_msg_sms_stat stat; + enum lgsm_msg_sms_stat stat; struct lgsm_sms sms; }; @@ -87,10 +72,10 @@ extern int lgsmd_sms_write(struct lgsm_handle *lh, const struct lgsm_sms_write *sms_write); /* Packing of 7-bit characters, refer to GSM 03.38 subclause 6.1.2.1.1 */ -extern int packing_7bit_character(char *src, char *dest); +extern int packing_7bit_character(const char *src, struct lgsm_sms *dest); /* Packing of 7-bit characters, refer to GSM 03.38 subclause 6.1.2.1.1 */ -extern int unpacking_7bit_character(char *src, char *dest); +extern int unpacking_7bit_character(const struct gsmd_sms *src, char *dest); /* Refer to 3GPP TS 11.11 Annex B */ extern int packing_UCS2_80(char *src, char *dest); |