This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/OpenBSC@lists.osmocom.org/.
Harald Welte laforge at gnumonks.orgDear Steffen,
thanks for your patch, it is most welcome. Sorry for not providing feedback
earlier. Please see my comments below:
> - case GSM340_TP_VPF_ABSOLUTE:
> + case GSM340_TP_VPF_ABSOLUTE: ;
> /* Chapter 9.2.3.12.2 */
> - /* FIXME: like service center time stamp */
> - DEBUGP(DSMS, "VPI absolute not implemented yet\n");
> + time_t expires = gsm340_scts(sms_vp);
> + time_t now = mktime(gmtime(NULL));
> + if (expires <= now)
> + minutes = 0;
> + else
> + minutes = (expires-now)/60;
please declare the variables (expires/now) at the beginning of the section,
e.g. the case statement or even the top of the function.
> +/* Turn semi-octet representation into int: 0x89 => 98 */
> +static u_int8_t unbcdify(u_int8_t value)
> +{
> + u_int8_t ret;
> +
> + ret = (value&0x0F)*10;
> + ret += value>>4;
> +
> + return ret;
> +}
we might want to have some kind of treatment (or at least an error message)
if the input BCD nibbles exceed the 0...9 range.
> static void gsm340_gen_scts(u_int8_t *scts, time_t time)
> {
> - struct tm *tm = localtime(&time);
> + struct tm *tm = gmtime(&time);
>
> *scts++ = bcdify(tm->tm_year % 100);
> *scts++ = bcdify(tm->tm_mon + 1);
> @@ -338,7 +356,30 @@ static void gsm340_gen_scts(u_int8_t *scts, time_t time)
> *scts++ = bcdify(tm->tm_hour);
> *scts++ = bcdify(tm->tm_min);
> *scts++ = bcdify(tm->tm_sec);
> - *scts++ = 0; /* FIXME: timezone */
> + *scts++ = 0; /* FIXME: local timezone */
> +}
mh. We are no wending GMT but no timezone information, which I'm not quite sure
if it is better than we did before. A proper solution would be to use
the signed value of 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++);
> + printf("%i",yr);
> + if (yr <= 60)
> + tm.tm_year = 100 + yr;
> + else
> + tm.tm_year = yr;
is this year '60' specified anywhere in the GSM spec, or did you just introduce
it yourself? In the latter case, I would rather use something like 80, since
GSM was not specified before the eighties.
Thanks again,
Harald
--
- Harald Welte <laforge at gnumonks.org> http://laforge.gnumonks.org/
============================================================================
"Privacy in residential applications is a desirable marketing option."
(ETSI EN 300 175-7 Ch. A6)