Change IE_METERING timing information from deciseconds to seconds and milliseconds

This commit is contained in:
Dennis Grunert 2024-01-29 03:37:31 +01:00
parent 88fc70d781
commit 9ff85d6226
2 changed files with 15 additions and 12 deletions

View File

@ -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);

View File

@ -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;
}