From 647ae2ff68b4e9a95c62b5837bf7330eb9a9aa2d Mon Sep 17 00:00:00 2001 From: Jacob Erlbeck Date: Mon, 19 Jan 2015 08:27:34 +0100 Subject: gprs: Add GPRS timer conversion functions (TODO) TODO: - commit message - test Ticket: OW#???? Sponsored-by: On-Waves ehf --- openbsc/include/openbsc/gprs_utils.h | 5 +++++ openbsc/include/openbsc/gsm_04_08_gprs.h | 5 ++++- openbsc/src/gprs/gprs_utils.c | 31 +++++++++++++++++++++++++++++++ 3 files changed, 40 insertions(+), 1 deletion(-) diff --git a/openbsc/include/openbsc/gprs_utils.h b/openbsc/include/openbsc/gprs_utils.h index 60b55a178..6880e0587 100644 --- a/openbsc/include/openbsc/gprs_utils.h +++ b/openbsc/include/openbsc/gprs_utils.h @@ -31,6 +31,11 @@ int gprs_msgb_resize_area(struct msgb *msg, uint8_t *area, size_t old_size, size_t new_size); char *gprs_apn_to_str(char *out_str, const uint8_t *apn_enc, size_t rest_chars); int gprs_str_to_apn(uint8_t *apn_enc, size_t max_len, const char *str); + +/* GSM 04.08, 10.5.7.3 GPRS Timer */ +int gprs_tmr_to_secs(uint8_t tmr); +uint8_t gprs_secs_to_tmr_floor(int secs); + int gprs_is_mi_tmsi(const uint8_t *value, size_t value_len); int gprs_is_mi_imsi(const uint8_t *value, size_t value_len); int gprs_parse_mi_tmsi(const uint8_t *value, size_t value_len, uint32_t *tmsi); diff --git a/openbsc/include/openbsc/gsm_04_08_gprs.h b/openbsc/include/openbsc/gsm_04_08_gprs.h index fb30dff96..3eec98365 100644 --- a/openbsc/include/openbsc/gsm_04_08_gprs.h +++ b/openbsc/include/openbsc/gsm_04_08_gprs.h @@ -116,9 +116,12 @@ enum gsm48_gprs_tmr_unit { GPRS_TMR_2SECONDS = 0 << 5, GPRS_TMR_MINUTE = 1 << 5, GPRS_TMR_6MINUTE = 2 << 5, - GPRS_TMR_DEACTIVATED = 3 << 5, + GPRS_TMR_DEACTIVATED = 7 << 5, }; +#define GPRS_TMR_UNIT_MASK (7 << 5) +#define GPRS_TMR_FACT_MASK ((1 << 5)-1) + /* Chapter 9.4.2 / Table 9.4.2 */ struct gsm48_attach_ack { uint8_t att_result:4, /* 10.5.5.7 */ diff --git a/openbsc/src/gprs/gprs_utils.c b/openbsc/src/gprs/gprs_utils.c index 55bc629e8..17059c84b 100644 --- a/openbsc/src/gprs/gprs_utils.c +++ b/openbsc/src/gprs/gprs_utils.c @@ -20,6 +20,7 @@ * */ #include +#include #include #include @@ -172,6 +173,36 @@ int gprs_str_to_apn(uint8_t *apn_enc, size_t max_len, const char *str) return len; } +/* GSM 04.08, 10.5.7.3 GPRS Timer */ +int gprs_tmr_to_secs(uint8_t tmr) +{ + switch (tmr & GPRS_TMR_UNIT_MASK) { + case GPRS_TMR_2SECONDS: + return 2 * (tmr & GPRS_TMR_FACT_MASK); + default: + case GPRS_TMR_MINUTE: + return 60 * (tmr & GPRS_TMR_FACT_MASK); + case GPRS_TMR_6MINUTE: + return 600 * (tmr & GPRS_TMR_FACT_MASK); + case GPRS_TMR_DEACTIVATED: + return -1; + } +} + +uint8_t gprs_secs_to_tmr_floor(int secs) +{ + if (secs < 0) + return GPRS_TMR_DEACTIVATED; + if (secs < 2 * 32) + return GPRS_TMR_2SECONDS | (secs / 2); + if (secs < 60 * 32) + return GPRS_TMR_MINUTE | (secs / 60); + if (secs < 600 * 32) + return GPRS_TMR_6MINUTE | (secs / 600); + + return GPRS_TMR_6MINUTE | 31; +} + /* GSM 04.08, 10.5.1.4 */ int gprs_is_mi_tmsi(const uint8_t *value, size_t value_len) { -- cgit v1.2.3