diff options
author | Patrick McHardy <kaber@trash.net> | 2010-08-25 20:33:02 +0200 |
---|---|---|
committer | Patrick McHardy <kaber@trash.net> | 2010-08-26 02:13:24 +0200 |
commit | ab287ce143887c28a2326c1cdfb6c09177749464 (patch) | |
tree | f8d543f81a165b1dc8ff92f4e75b08081cb93608 | |
parent | 6a9b663d148354ad698945db8c35fba527b9bba7 (diff) |
ie: add <<TIME-DATE>> IE
Signed-off-by: Patrick McHardy <kaber@trash.net>
-rw-r--r-- | include/dect/ie.h | 30 | ||||
-rw-r--r-- | src/s_msg.c | 76 |
2 files changed, 104 insertions, 2 deletions
diff --git a/include/dect/ie.h b/include/dect/ie.h index f53ae16..410d36e 100644 --- a/include/dect/ie.h +++ b/include/dect/ie.h @@ -1842,12 +1842,38 @@ struct dect_ie_mms_extended_header { /** * @}@} - * @defgroup ie_time_data Time-Date + * @defgroup ie_time_date Time-Date + * + * <<TIME-DATE>> IE specified in ETSI EN 300 175-5 section 7.7.50. + * + * The <<TIME-DATE>> IE is used to provide a time and/or date. + * + * @sa ETSI EN 300 175-5 (Network (NWK) layer), section 7.7.50 * @{ */ +enum dect_time_date_coding { + DECT_TIME_DATE_TIME = 0x1, /**< Time */ + DECT_TIME_DATE_DATE = 0x2, /**< Date */ + DECT_TIME_DATE_TIME_AND_DATE = 0x3, /**< Time and Date */ +}; + +enum dect_time_date_interpretation { + DECT_TIME_DATE_CURRENT = 0x0, /**< The current time/date */ + DECT_TIME_DATE_DURATION = 0x1, /**< Time duration */ +}; + struct dect_ie_time_date { - struct dect_ie_common common; + struct dect_ie_common common; + enum dect_time_date_coding coding; + enum dect_time_date_interpretation interpretation; + uint8_t year; + uint8_t month; + uint8_t day; + uint8_t hour; + uint8_t minute; + uint8_t second; + uint8_t timezone; }; /** diff --git a/src/s_msg.c b/src/s_msg.c index 4e035ef..06d1ca4 100644 --- a/src/s_msg.c +++ b/src/s_msg.c @@ -941,6 +941,79 @@ static int dect_sfmt_build_progress_indicator(struct dect_sfmt_ie *dst, return 0; } +static void dect_sfmt_dump_time_date(const struct dect_ie_common *_ie) +{ + const struct dect_ie_time_date *ie = dect_ie_container(ie, _ie); + + if (ie->coding & 0x2) + sfmt_debug("\tDate: %u%u.%u%u.20%u%u\n", + ie->day >> 4, ie->day & 0x0f, + ie->month >> 4, ie->month & 0x0f, + ie->year >> 4, ie->year & 0xf); + + if (ie->coding & 0x1) + sfmt_debug("\tTime: %u%u:%u%u:%u%u %+dmin\n", + ie->hour >> 4, ie->hour & 0x0f, + ie->minute >> 4, ie->minute & 0x0f, + ie->second >> 4, ie->second & 0xf, + 15 * (ie->timezone & 0x8 ? -1 : 1) * + ((10 * (ie->timezone >> 4) & 0x7) + + (ie->timezone & 0x0f))); +} + +static int dect_sfmt_parse_time_date(const struct dect_handle *dh, + struct dect_ie_common **ie, + const struct dect_sfmt_ie *src) +{ + struct dect_ie_time_date *dst = dect_ie_container(dst, *ie); + unsigned int n; + + dst->coding = src->data[2] >> 6; + dst->interpretation = src->data[2] & 0x3f; + n = 3; + + if (dst->coding & 0x2) { + dst->year = src->data[n++]; + dst->month = src->data[n++]; + dst->day = src->data[n++]; + } + + if (dst->coding & 0x1) { + dst->hour = src->data[n++]; + dst->minute = src->data[n++]; + dst->second = src->data[n++]; + dst->timezone = src->data[n++]; + } + return 0; +} + +static int dect_sfmt_build_time_date(struct dect_sfmt_ie *dst, + const struct dect_ie_common *ie) +{ + struct dect_ie_time_date *src = dect_ie_container(src, ie); + unsigned int n; + + dst->data[2] = src->coding << 6; + dst->data[2] |= src->interpretation; + n = 3; + + if (src->coding & 0x2) { + dst->data[n++] = src->year; + dst->data[n++] = src->month; + dst->data[n++] = src->day; + } + + if (src->coding & 0x1) { + dst->data[n++] = src->hour; + dst->data[n++] = src->minute; + dst->data[n++] = src->second; + dst->data[n++] = src->timezone; + } + + dst->len = n; + return 0; +} + static int dect_sfmt_parse_multi_display(const struct dect_handle *dh, struct dect_ie_common **ie, const struct dect_sfmt_ie *src) @@ -2119,6 +2192,9 @@ static const struct dect_ie_handler { [DECT_IE_TIME_DATE] = { .name = "TIME-DATA", .size = sizeof(struct dect_ie_time_date), + .parse = dect_sfmt_parse_time_date, + .build = dect_sfmt_build_time_date, + .dump = dect_sfmt_dump_time_date, }, [DECT_IE_MULTI_DISPLAY] = { .name = "MULTI-DISPLAY", |