diff --git a/include/osmocom/cc/message.h b/include/osmocom/cc/message.h index ef98c0c..8cb7511 100644 --- a/include/osmocom/cc/message.h +++ b/include/osmocom/cc/message.h @@ -442,7 +442,8 @@ struct osmo_cc_ie_display { struct osmo_cc_ie_metering { uint16_t connect_units; - uint16_t unit_period_decisecs; + uint16_t unit_period_sec; + uint16_t unit_period_msec; } __attribute__((packed)); struct osmo_cc_ie_sdp { @@ -519,8 +520,8 @@ int osmo_cc_get_ie_cause(osmo_cc_msg_t *msg, int ie_repeat, uint8_t *location, u uint16_t *sip_cause, uint8_t *socket_cause); void osmo_cc_add_ie_display(osmo_cc_msg_t *msg, const char *text); int osmo_cc_get_ie_display(osmo_cc_msg_t *msg, int ie_repeat, char *text, size_t text_size); -void osmo_cc_add_ie_metering(osmo_cc_msg_t *msg, uint16_t connect_units, uint16_t unit_period_decisecs); -int osmo_cc_get_ie_metering(osmo_cc_msg_t *msg, int ie_repeat, uint16_t *connect_units, uint16_t *unit_period_decisecs); +void osmo_cc_add_ie_metering(osmo_cc_msg_t *msg, uint16_t connect_units, struct timeval *unit_tv); +int osmo_cc_get_ie_metering(osmo_cc_msg_t *msg, int ie_repeat, uint16_t *connect_units, struct timeval *unit_tv); void osmo_cc_add_ie_sdp(osmo_cc_msg_t *msg, const char *sdp); int osmo_cc_get_ie_sdp(osmo_cc_msg_t *msg, int ie_repeat, char *sdp, size_t sdp_size); void osmo_cc_add_ie_socket_address(osmo_cc_msg_t *msg, const char *address); diff --git a/src/message.c b/src/message.c index a046872..5c7ed34 100644 --- a/src/message.c +++ b/src/message.c @@ -445,7 +445,8 @@ void osmo_cc_debug_ie(osmo_cc_msg_t *msg, int level) int ie_repeat[256]; uint8_t type, plan, present, screen, coding, capability, mode, progress, reason, duration_ms, pause_ms, dtmf_mode, location, notify, isdn_cause, socket_cause; - uint16_t sip_cause, metering_connect_units, metering_unit_time_decisecs; + uint16_t sip_cause, metering_connect_units; + struct timeval unit_tv; uint32_t unique; char string[65536]; int i; @@ -609,12 +610,11 @@ void osmo_cc_debug_ie(osmo_cc_msg_t *msg, int level) LOGP(DLCC, level, " %s info='%s'\n", osmo_cc_ie_value2name(ie->type), string); break; case OSMO_CC_IE_METERING: - rc = osmo_cc_get_ie_metering(msg, ie_repeat[ie->type], &metering_connect_units, - &metering_unit_time_decisecs); + rc = osmo_cc_get_ie_metering(msg, ie_repeat[ie->type], &metering_connect_units, &unit_tv); if (rc < 0) break; - LOGP(DLCC, level, " %s connect_units=%d unit_time_decisecs=%d (1/10 sec)\n", - osmo_cc_ie_value2name(ie->type), metering_connect_units, metering_unit_time_decisecs); + LOGP(DLCC, level, " %s connect_units=%d unit_time_sec=%d.%03d\n", + osmo_cc_ie_value2name(ie->type), metering_connect_units, (uint16_t)unit_tv.tv_sec, (uint32_t)unit_tv.tv_usec / 1000); break; case OSMO_CC_IE_SDP: rc = osmo_cc_get_ie_sdp(msg, ie_repeat[ie->type], string, sizeof(string)); @@ -1289,17 +1289,18 @@ int osmo_cc_get_ie_display(osmo_cc_msg_t *msg, int ie_repeat, char *text, size_t } /* helper to encode METERING information */ -void osmo_cc_add_ie_metering(osmo_cc_msg_t *msg, uint16_t connect_units, uint16_t unit_period_decisecs) +void osmo_cc_add_ie_metering(osmo_cc_msg_t *msg, uint16_t connect_units, struct timeval *unit_tv) { struct osmo_cc_ie_metering *ie_metering; ie_metering = osmo_cc_add_ie(msg, OSMO_CC_IE_METERING, sizeof(*ie_metering)); ie_metering->connect_units = htons(connect_units); - ie_metering->unit_period_decisecs = htons(unit_period_decisecs); + ie_metering->unit_period_sec = htons(unit_tv->tv_sec); + ie_metering->unit_period_msec = htons(unit_tv->tv_usec / 1000); } /* helper to decode METERING information */ -int osmo_cc_get_ie_metering(osmo_cc_msg_t *msg, int ie_repeat, uint16_t *connect_units, uint16_t *unit_period_decisecs) +int osmo_cc_get_ie_metering(osmo_cc_msg_t *msg, int ie_repeat, uint16_t *connect_units, struct timeval *unit_tv) { struct osmo_cc_ie_metering *ie_metering; int rc; @@ -1310,7 +1311,8 @@ int osmo_cc_get_ie_metering(osmo_cc_msg_t *msg, int ie_repeat, uint16_t *connect return rc; *connect_units = ntohs(ie_metering->connect_units); - *unit_period_decisecs = ntohs(ie_metering->unit_period_decisecs); + unit_tv->tv_sec = ntohs(ie_metering->unit_period_sec); + unit_tv->tv_usec = ntohs(ie_metering->unit_period_msec) * 1000; return rc; }