diff --git a/src/channels/chan_voicemngr.c b/src/channels/chan_voicemngr.c index d9c86f5ba82efe50c6be8ff074031c4882765acd..890cad713975086637f79f94b1f861684f225a0b 100644 --- a/src/channels/chan_voicemngr.c +++ b/src/channels/chan_voicemngr.c @@ -4525,6 +4525,8 @@ enum { RTP_STATS_LOSS_RATE, RTP_STATS_MAX_JITTER, RTP_STATS_AVERAGE_ROUND_TRIP_DELAY, + RTP_STATS_OVERRUNS, + RTP_STATS_UNDERRUNS, __MAX_RTP_STATS, }; @@ -4555,6 +4557,8 @@ static const struct blobmsg_policy endpt_rtp_stats_policy[__MAX_RTP_STATS] = { [RTP_STATS_LOSS_RATE] = { .name = "uLossRate", .type = BLOBMSG_TYPE_INT16 }, [RTP_STATS_MAX_JITTER] = { .name = "maxJitter", .type = BLOBMSG_TYPE_INT32 }, [RTP_STATS_AVERAGE_ROUND_TRIP_DELAY] = { .name = "averageRoundTripDelay", .type = BLOBMSG_TYPE_INT32 }, + [RTP_STATS_OVERRUNS] = { .name = "overruns", .type = BLOBMSG_TYPE_INT16 }, + [RTP_STATS_UNDERRUNS] = { .name = "underruns", .type = BLOBMSG_TYPE_INT16 }, }; // Reception of event @@ -4627,6 +4631,8 @@ static void ubus_call_answer_rtp_stats(struct ubus_request *req, int type, struc struct chan_voicemngr_pvt *p = NULL; struct chan_voicemngr_subchannel *sub = NULL; int sip_client_id = -1; + uint16_t overruns = 0; + uint16_t underruns = 0; ast_log(LOG_DEBUG, "thread %d: got answer from voicemngr on rtp_stats ubus call.\n", ast_get_tid()); blobmsg_parse(endpt_rtp_stats_policy, __MAX_RTP_STATS, tb, blob_data(msg), blob_len(msg)); @@ -4701,7 +4707,20 @@ static void ubus_call_answer_rtp_stats(struct ubus_request *req, int type, struc sub->rtp_stats.maxJitter = blobmsg_get_u32(tb[RTP_STATS_MAX_JITTER]); if (tb[RTP_STATS_AVERAGE_ROUND_TRIP_DELAY]) sub->rtp_stats.averageRoundTripDelay = blobmsg_get_u32(tb[RTP_STATS_AVERAGE_ROUND_TRIP_DELAY]); - + if (tb[RTP_STATS_OVERRUNS]) { + overruns = blobmsg_get_u16(tb[RTP_STATS_OVERRUNS]); + sip_client_id = chan_voicemngr_get_sip_client_id(sub); + if (sip_client_id >= 0 && sip_client_id < MAX_SIP_CLIENTS) { + line_stats[sip_client_id].total_overruns += overruns; + } + } + if (tb[RTP_STATS_UNDERRUNS]) { + underruns = blobmsg_get_u16(tb[RTP_STATS_UNDERRUNS]); + sip_client_id = chan_voicemngr_get_sip_client_id(sub); + if (sip_client_id >= 0 && sip_client_id < MAX_SIP_CLIENTS) { + line_stats[sip_client_id].total_underruns += underruns; + } + } sub->rtp_stats.averageFarEndInterarrivalJitter = sub->jitter_count ? (sub->farEndInterrivalJitter / sub->jitter_count) : 0; ast_log(LOG_DEBUG, "RTP stats received:\nlocalBurstDensity: %d, remoteBurstDensity: %d, " @@ -4711,14 +4730,15 @@ static void ubus_call_answer_rtp_stats(struct ubus_request *req, int type, struc "localJbNominal: %d remoteJbNominal: %d, localJbAbsMax: %d, " "remoteJbAbsMax: %d, discarded: %d, lost: %d, rxpkts: %d, txpkts: %d, " "jbAvg: %d, jitter: %d, uLossRate: %d, maxJitter: %d, averageRoundTripDelay: %d, " - "averageFarEndInterarrivalJitter: %d\n", + "averageFarEndInterarrivalJitter: %d, overruns: %d, underruns: %d\n", sub->rtp_stats.localBurstDensity, sub->rtp_stats.remoteBurstDensity, sub->rtp_stats.localBurstDuration, sub->rtp_stats.remoteBurstDuration, sub->rtp_stats.localGapDensity, sub->rtp_stats.remoteGapDensity, sub->rtp_stats.localGapDuration, sub->rtp_stats.remoteGapDuration, sub->rtp_stats.localJbRate, sub->rtp_stats.remoteJbRate, sub->rtp_stats.localJbMax, sub->rtp_stats.remoteJbMax, sub->rtp_stats.localJbNominal, sub->rtp_stats.remoteJbNominal, sub->rtp_stats.localJbAbsMax, sub->rtp_stats.remoteJbAbsMax, sub->rtp_stats.discarded, sub->rtp_stats.lost, sub->rtp_stats.rxpkts, sub->rtp_stats.txpkts, sub->rtp_stats.jbAvg, sub->rtp_stats.jitter, - sub->rtp_stats.uLossRate, sub->rtp_stats.maxJitter, sub->rtp_stats.averageRoundTripDelay, sub->rtp_stats.averageFarEndInterarrivalJitter); + sub->rtp_stats.uLossRate, sub->rtp_stats.maxJitter, sub->rtp_stats.averageRoundTripDelay, + sub->rtp_stats.averageFarEndInterarrivalJitter, overruns, underruns); } static int endpt_get_rtp_stats(int line) { @@ -4864,6 +4884,8 @@ static int asterisk_call_status(struct ubus_context *ctx, struct ubus_object *ob blobmsg_add_u32(&blob, "PacketsLost", line_stats[line].pktslost); blobmsg_add_u32(&blob, "BytesReceived", line_stats[line].rxbytes); blobmsg_add_u32(&blob, "BytesSent", line_stats[line].txbytes); + blobmsg_add_u32(&blob, "Overruns", line_stats[line].total_overruns); + blobmsg_add_u32(&blob, "Underruns", line_stats[line].total_underruns); blobmsg_close_table(&blob, table_rtp); blobmsg_close_table(&blob, table_stats); res = UBUS_STATUS_OK; diff --git a/src/channels/chan_voicemngr.h b/src/channels/chan_voicemngr.h index 6975f5bc29f97b795dbe7b25ae8bc482e2f6021f..f876e38d39ff763f23a6ecd14e13ee062e45964d 100644 --- a/src/channels/chan_voicemngr.h +++ b/src/channels/chan_voicemngr.h @@ -121,6 +121,8 @@ struct line_stats_t { uint32_t rxbytes; uint32_t txbytes; uint32_t pktslost; + uint32_t total_overruns; + uint32_t total_underruns; }; /*