[SMS] implement GSM340_TP_VPF_ABSOLUTE
- Added function "gsm340_scts" to decode the service center time stamp into a UTC/GMT timestamp - in function gsm340_validity_period: can now decode validity period format absolute.
This commit is contained in:
parent
d409be7fae
commit
5727cf4ea7
|
@ -216,10 +216,14 @@ static int gsm411_rp_sendmsg(struct msgb *msg, struct gsm_trans *trans,
|
||||||
return gsm411_cp_sendmsg(msg, trans, GSM411_MT_CP_DATA);
|
return gsm411_cp_sendmsg(msg, trans, GSM411_MT_CP_DATA);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static time_t gsm340_scts(u_int8_t *scts);
|
||||||
|
|
||||||
static unsigned long gsm340_validity_period(u_int8_t sms_vpf, u_int8_t *sms_vp)
|
static unsigned long gsm340_validity_period(u_int8_t sms_vpf, u_int8_t *sms_vp)
|
||||||
{
|
{
|
||||||
u_int8_t vp;
|
u_int8_t vp;
|
||||||
unsigned long minutes;
|
unsigned long minutes;
|
||||||
|
time_t expires;
|
||||||
|
time_t now;
|
||||||
|
|
||||||
switch (sms_vpf) {
|
switch (sms_vpf) {
|
||||||
case GSM340_TP_VPF_RELATIVE:
|
case GSM340_TP_VPF_RELATIVE:
|
||||||
|
@ -236,8 +240,12 @@ static unsigned long gsm340_validity_period(u_int8_t sms_vpf, u_int8_t *sms_vp)
|
||||||
break;
|
break;
|
||||||
case GSM340_TP_VPF_ABSOLUTE:
|
case GSM340_TP_VPF_ABSOLUTE:
|
||||||
/* Chapter 9.2.3.12.2 */
|
/* Chapter 9.2.3.12.2 */
|
||||||
/* FIXME: like service center time stamp */
|
expires = gsm340_scts(sms_vp);
|
||||||
DEBUGP(DSMS, "VPI absolute not implemented yet\n");
|
now = mktime(gmtime(NULL));
|
||||||
|
if (expires <= now)
|
||||||
|
minutes = 0;
|
||||||
|
else
|
||||||
|
minutes = (expires-now)/60;
|
||||||
break;
|
break;
|
||||||
case GSM340_TP_VPF_ENHANCED:
|
case GSM340_TP_VPF_ENHANCED:
|
||||||
/* Chapter 9.2.3.12.3 */
|
/* Chapter 9.2.3.12.3 */
|
||||||
|
@ -317,6 +325,7 @@ static int gsm340_gen_oa(u_int8_t *oa, unsigned int oa_len,
|
||||||
return len_in_bytes;
|
return len_in_bytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Turn int into semi-octet representation: 98 => 0x89 */
|
||||||
static u_int8_t bcdify(u_int8_t value)
|
static u_int8_t bcdify(u_int8_t value)
|
||||||
{
|
{
|
||||||
u_int8_t ret;
|
u_int8_t ret;
|
||||||
|
@ -327,6 +336,21 @@ static u_int8_t bcdify(u_int8_t value)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Turn semi-octet representation into int: 0x89 => 98 */
|
||||||
|
static u_int8_t unbcdify(u_int8_t value)
|
||||||
|
{
|
||||||
|
u_int8_t ret;
|
||||||
|
|
||||||
|
if ((value & 0x0F) > 9 || (value >> 4) > 9)
|
||||||
|
DEBUGP(DSMS, "unbcdify got too big nibble: 0x%02X\n", value);
|
||||||
|
|
||||||
|
ret = (value&0x0F)*10;
|
||||||
|
if (ret > 90)
|
||||||
|
ret += value>>4;
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* Generate 03.40 TP-SCTS */
|
/* Generate 03.40 TP-SCTS */
|
||||||
static void gsm340_gen_scts(u_int8_t *scts, time_t time)
|
static void gsm340_gen_scts(u_int8_t *scts, time_t time)
|
||||||
{
|
{
|
||||||
|
@ -338,7 +362,30 @@ static void gsm340_gen_scts(u_int8_t *scts, time_t time)
|
||||||
*scts++ = bcdify(tm->tm_hour);
|
*scts++ = bcdify(tm->tm_hour);
|
||||||
*scts++ = bcdify(tm->tm_min);
|
*scts++ = bcdify(tm->tm_min);
|
||||||
*scts++ = bcdify(tm->tm_sec);
|
*scts++ = bcdify(tm->tm_sec);
|
||||||
*scts++ = 0; /* FIXME: timezone */
|
*scts++ = bcdify(tm->tm_gmtoff/(60*15));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Decode 03.40 TP-SCTS (into utc/gmt timestamp) */
|
||||||
|
static time_t gsm340_scts(u_int8_t *scts)
|
||||||
|
{
|
||||||
|
struct tm tm;
|
||||||
|
|
||||||
|
u_int8_t yr = unbcdify(*scts++);
|
||||||
|
|
||||||
|
if (yr <= 80)
|
||||||
|
tm.tm_year = 100 + yr;
|
||||||
|
else
|
||||||
|
tm.tm_year = yr;
|
||||||
|
tm.tm_mon = unbcdify(*scts++) - 1;
|
||||||
|
tm.tm_mday = unbcdify(*scts++);
|
||||||
|
tm.tm_hour = unbcdify(*scts++);
|
||||||
|
tm.tm_min = unbcdify(*scts++);
|
||||||
|
tm.tm_sec = unbcdify(*scts++);
|
||||||
|
/* according to gsm 03.40 time zone is
|
||||||
|
"expressed in quarters of an hour" */
|
||||||
|
tm.tm_gmtoff = unbcdify(*scts++) * 15*60;
|
||||||
|
|
||||||
|
return mktime(&tm);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* generate a msgb containing a TPDU derived from struct gsm_sms,
|
/* generate a msgb containing a TPDU derived from struct gsm_sms,
|
||||||
|
|
Loading…
Reference in New Issue