diff --git a/daemon/rtcp.c b/daemon/rtcp.c index 56ee0761f..569436317 100644 --- a/daemon/rtcp.c +++ b/daemon/rtcp.c @@ -475,9 +475,9 @@ int rtcp_demux_is_rtcp(const str *s) { return 1; } -static void print_rtcp_common(char** cdrbufcur, const pjmedia_rtcp_common *common) { - if (*cdrbufcur) - *cdrbufcur += sprintf(*cdrbufcur,"version=%u, padding=%u, count=%u, payloadtype=%u, length=%u, ssrc=%u, ", +static void print_rtcp_common(GString *log, const pjmedia_rtcp_common *common) { + if (log) + g_string_append_printf(log,"version=%u, padding=%u, count=%u, payloadtype=%u, length=%u, ssrc=%u, ", common->version, common->p, common->count, @@ -486,9 +486,9 @@ static void print_rtcp_common(char** cdrbufcur, const pjmedia_rtcp_common *commo ntohl(common->ssrc)); } -static void print_rtcp_sr(char** cdrbufcur, const pjmedia_rtcp_sr* sr, GString *json) { - if (*cdrbufcur) - *cdrbufcur += sprintf(*cdrbufcur,"ntp_sec=%u, ntp_fractions=%u, rtp_ts=%u, sender_packets=%u, sender_bytes=%u, ", +static void print_rtcp_sr(GString *log, const pjmedia_rtcp_sr* sr, GString *json) { + if (log) + g_string_append_printf(log,"ntp_sec=%u, ntp_fractions=%u, rtp_ts=%u, sender_packets=%u, sender_bytes=%u, ", ntohl(sr->ntp_sec), ntohl(sr->ntp_frac), ntohl(sr->rtp_ts), @@ -505,15 +505,15 @@ static void print_rtcp_sr(char** cdrbufcur, const pjmedia_rtcp_sr* sr, GString * ntohl(sr->sender_pcount)); } -void print_rtcp_rr(char** cdrbufcur, const pjmedia_rtcp_rr* rr, pjmedia_rtcp_common *common, GString *json) { +void print_rtcp_rr(GString *log, const pjmedia_rtcp_rr* rr, pjmedia_rtcp_common *common, GString *json) { /* Get packet loss */ u_int32_t packet_loss=0; packet_loss = (rr->total_lost_2 << 16) + (rr->total_lost_1 << 8) + rr->total_lost_0; - if (*cdrbufcur) - *cdrbufcur += sprintf(*cdrbufcur,"ssrc=%u, fraction_lost=%u, packet_loss=%u, last_seq=%u, jitter=%u, last_sr=%u, delay_since_last_sr=%u, ", + if (log) + g_string_append_printf(log,"ssrc=%u, fraction_lost=%u, packet_loss=%u, last_seq=%u, jitter=%u, last_sr=%u, delay_since_last_sr=%u, ", ntohl(rr->ssrc), rr->fract_lost, packet_loss, @@ -539,10 +539,7 @@ void print_rtcp_rr(char** cdrbufcur, const pjmedia_rtcp_rr* rr, pjmedia_rtcp_com void parse_and_log_rtcp_report(struct stream_fd *sfd, const str *s, const endpoint_t *src) { - // XXX replace with GString - static const int CDRBUFLENGTH = 1024*1024*1; // 1 MB - char cdrbuffer[CDRBUFLENGTH]; - char* cdrbufcur = cdrbuffer; + GString *log; pjmedia_rtcp_common *common = (pjmedia_rtcp_common*) s->s; const pjmedia_rtcp_rr *rr = NULL; const pjmedia_rtcp_sr *sr = NULL; @@ -553,49 +550,56 @@ void parse_and_log_rtcp_report(struct stream_fd *sfd, const str *s, const endpoi if (s->len < sizeof(*common)) return; - cdrbufcur = _log_facility_rtcp ? cdrbuffer : NULL; + log = _log_facility_rtcp ? g_string_new(NULL) : NULL; json = cm->homer ? g_string_new("{ ") : NULL; // anything to do? - if (!cdrbufcur && !json) + if (!log && !json) return; - if (cdrbufcur) - cdrbufcur += sprintf(cdrbufcur,"["STR_FORMAT"] ", STR_FMT(&sfd->stream->call->callid)); + if (log) + g_string_append_printf(log, "["STR_FORMAT"] ", STR_FMT(&sfd->stream->call->callid)); - print_rtcp_common(&cdrbufcur,common); + print_rtcp_common(log, common); /* Parse RTCP */ if (common->pt == RTCP_PT_SR) { if (s->len < (sizeof(*common) + sizeof(*sr))) - return; + goto out; sr = (pjmedia_rtcp_sr*) ((s->s) + sizeof(pjmedia_rtcp_common)); - print_rtcp_sr(&cdrbufcur,sr, json); + print_rtcp_sr(log, sr, json); if (common->count > 0 && s->len >= (sizeof(pjmedia_rtcp_sr_pkt))) { rr = (pjmedia_rtcp_rr*)((s->s) + (sizeof(pjmedia_rtcp_common) + sizeof(pjmedia_rtcp_sr))); - print_rtcp_rr(&cdrbufcur,rr, common, json); + print_rtcp_rr(log, rr, common, json); } } else if (common->pt == RTCP_PT_RR && common->count > 0) { if (s->len < (sizeof(*common) + sizeof(*rr))) - return; + goto out; rr = (pjmedia_rtcp_rr*)((s->s) + sizeof(pjmedia_rtcp_common)); - print_rtcp_rr(&cdrbufcur,rr, common, json); + print_rtcp_rr(log, rr, common, json); } else if (common->pt == RTCP_PT_XR) { - pjmedia_rtcp_xr_rx_rtcp_xr(&cdrbufcur, s); + pjmedia_rtcp_xr_rx_rtcp_xr(log, s); } // XXX parse/support additional RTCP types - if (cdrbufcur) - rtcplog(cdrbuffer); + if (log) + rtcplog(log->str); if (json) { g_string_append(json, " }"); homer_send(cm->homer, json, &c->callid, src, &sfd->socket.local); + json = NULL; } + +out: + if (json) + g_string_free(json, TRUE); + if (log) + g_string_free(log, TRUE); } diff --git a/daemon/rtcp_xr.c b/daemon/rtcp_xr.c index a87cf161d..5238687f4 100644 --- a/daemon/rtcp_xr.c +++ b/daemon/rtcp_xr.c @@ -4,9 +4,10 @@ * Created on: Mar 29, 2015 * Author: fmetz */ +#include "rtcp_xr.h" #include #include -#include "rtcp_xr.h" +#include /* RTCP XR payload type */ #define RTCP_XR 207 @@ -21,8 +22,8 @@ #define BT_VOIP_METRICS 7 -void print_rtcp_xr_common(char** cdrbufcur,const pjmedia_rtcp_xr_pkt *rtcp_xr) { - *cdrbufcur += sprintf(*cdrbufcur,"version=%u, padding=%u, count=%u, payloadtype=%u, length=%u, ssrc=%u, ", +void print_rtcp_xr_common(GString *log, const pjmedia_rtcp_xr_pkt *rtcp_xr) { + g_string_append_printf(log, "version=%u, padding=%u, count=%u, payloadtype=%u, length=%u, ssrc=%u, ", rtcp_xr->common.version, rtcp_xr->common.p, rtcp_xr->common.count, @@ -31,31 +32,31 @@ void print_rtcp_xr_common(char** cdrbufcur,const pjmedia_rtcp_xr_pkt *rtcp_xr) { ntohl(rtcp_xr->common.ssrc)); } -void print_rtcp_xr_rb_header(char** cdrbufcur,const pjmedia_rtcp_xr_rb_header *rb_header) { - *cdrbufcur += sprintf(*cdrbufcur,"rb_header_blocktype=%u, rb_header_blockspecdata=%u, rb_header_blocklength=%u, ", +void print_rtcp_xr_rb_header(GString *log, const pjmedia_rtcp_xr_rb_header *rb_header) { + g_string_append_printf(log, "rb_header_blocktype=%u, rb_header_blockspecdata=%u, rb_header_blocklength=%u, ", rb_header->bt, rb_header->specific, ntohs(rb_header->length)); } -void print_rtcp_xr_rb_rr_time(char** cdrbufcur,const pjmedia_rtcp_xr_rb_rr_time *rb_rr_time) { - print_rtcp_xr_rb_header(cdrbufcur,&rb_rr_time->header); - *cdrbufcur += sprintf(*cdrbufcur,"rb_rr_time_ntp_sec=%u, rb_rr_time_ntp_frac=%u, ", +void print_rtcp_xr_rb_rr_time(GString *log, const pjmedia_rtcp_xr_rb_rr_time *rb_rr_time) { + print_rtcp_xr_rb_header(log, &rb_rr_time->header); + g_string_append_printf(log, "rb_rr_time_ntp_sec=%u, rb_rr_time_ntp_frac=%u, ", ntohl(rb_rr_time->ntp_sec), ntohl(rb_rr_time->ntp_frac)); } -void print_rtcp_xr_rb_dlrr(char** cdrbufcur,const pjmedia_rtcp_xr_rb_dlrr *rb_dlrr) { - print_rtcp_xr_rb_header(cdrbufcur,&rb_dlrr->header); - *cdrbufcur += sprintf(*cdrbufcur,"rb_dlrr_ssrc=%u, rb_dlrr_lrr=%u, rb_dlrr_dlrr=%u, ", +void print_rtcp_xr_rb_dlrr(GString *log, const pjmedia_rtcp_xr_rb_dlrr *rb_dlrr) { + print_rtcp_xr_rb_header(log, &rb_dlrr->header); + g_string_append_printf(log, "rb_dlrr_ssrc=%u, rb_dlrr_lrr=%u, rb_dlrr_dlrr=%u, ", ntohl(rb_dlrr->item.ssrc), ntohl(rb_dlrr->item.lrr), ntohl(rb_dlrr->item.dlrr)); } -void print_rtcp_xr_rb_stats(char** cdrbufcur,const pjmedia_rtcp_xr_rb_stats *rb_stats) { - print_rtcp_xr_rb_header(cdrbufcur,&rb_stats->header); - *cdrbufcur += sprintf(*cdrbufcur,"rb_stats_ssrc=%u, rb_stats_begin_seq=%u, rb_stats_end_seq=%u, rb_stats_lost_packets=%u, rb_stats_duplicate_packets=%u," +void print_rtcp_xr_rb_stats(GString *log, const pjmedia_rtcp_xr_rb_stats *rb_stats) { + print_rtcp_xr_rb_header(log, &rb_stats->header); + g_string_append_printf(log, "rb_stats_ssrc=%u, rb_stats_begin_seq=%u, rb_stats_end_seq=%u, rb_stats_lost_packets=%u, rb_stats_duplicate_packets=%u," "rb_stats_jitter_min=%u, rb_stats_jitter_max=%u, rb_stats_jitter_mean=%u, rb_stats_jitter_deviation=%u," "rb_stats_toh_min=%u, rb_stats_toh_max=%u, rb_stats_toh_mean=%u, rb_stats_toh_deviation=%u, ", ntohl(rb_stats->ssrc), @@ -73,9 +74,9 @@ void print_rtcp_xr_rb_stats(char** cdrbufcur,const pjmedia_rtcp_xr_rb_stats *rb_ ntohl(rb_stats->toh_dev)); } -void print_rtcp_xr_rb_voip_mtc(char** cdrbufcur,const pjmedia_rtcp_xr_rb_voip_mtc *rb_voip_mtc) { - print_rtcp_xr_rb_header(cdrbufcur,&rb_voip_mtc->header); - *cdrbufcur += sprintf(*cdrbufcur,"rb_voip_mtc_ssrc=%u, rb_voip_mtc_loss_rate=%u, rb_voip_mtc_discard_rate=%u, rb_voip_mtc_burst_den=%u, " +void print_rtcp_xr_rb_voip_mtc(GString *log, const pjmedia_rtcp_xr_rb_voip_mtc *rb_voip_mtc) { + print_rtcp_xr_rb_header(log, &rb_voip_mtc->header); + g_string_append_printf(log, "rb_voip_mtc_ssrc=%u, rb_voip_mtc_loss_rate=%u, rb_voip_mtc_discard_rate=%u, rb_voip_mtc_burst_den=%u, " "rb_voip_mtc_gap_den=%u, rb_voip_mtc_burst_dur=%u, rb_voip_mtc_gap_dur=%u, rb_voip_mtc_rnd_trip_delay=%u, " "rb_voip_mtc_end_sys_delay=%u, rb_voip_mtc_signal_lvl=%u, rb_voip_mtc_noise_lvl=%u, rb_voip_mtc_rerl=%u, " "rb_voip_mtc_gmin=%u, rb_voip_mtc_r_factor=%u, rb_voip_mtc_ext_r_factor=%u, rb_voip_mtc_mos_lq=%u, " @@ -104,7 +105,7 @@ void print_rtcp_xr_rb_voip_mtc(char** cdrbufcur,const pjmedia_rtcp_xr_rb_voip_mt ntohs(rb_voip_mtc->jb_abs_max)); } -void pjmedia_rtcp_xr_rx_rtcp_xr(char** cdrbufcur, const str *s) { +void pjmedia_rtcp_xr_rx_rtcp_xr(GString *log, const str *s) { const pjmedia_rtcp_xr_pkt *rtcp_xr = (pjmedia_rtcp_xr_pkt*) s->s; const pjmedia_rtcp_xr_rb_rr_time *rb_rr_time = NULL; @@ -115,13 +116,16 @@ void pjmedia_rtcp_xr_rx_rtcp_xr(char** cdrbufcur, const str *s) { rtcp_xr->buf; unsigned pkt_len, rb_len; + if (!log) + return; + if (s->len < sizeof(*rtcp_xr)) return; if (rtcp_xr->common.pt != RTCP_XR) return; - print_rtcp_xr_common(cdrbufcur,rtcp_xr); + print_rtcp_xr_common(log, rtcp_xr); pkt_len = ntohs((u_int16_t)rtcp_xr->common.length); @@ -138,19 +142,19 @@ void pjmedia_rtcp_xr_rx_rtcp_xr(char** cdrbufcur, const str *s) { switch (rb_hdr->bt) { case BT_RR_TIME: rb_rr_time = (pjmedia_rtcp_xr_rb_rr_time*) rb_hdr; - print_rtcp_xr_rb_rr_time(cdrbufcur,rb_rr_time); + print_rtcp_xr_rb_rr_time(log, rb_rr_time); break; case BT_DLRR: rb_dlrr = (pjmedia_rtcp_xr_rb_dlrr*) rb_hdr; - print_rtcp_xr_rb_dlrr(cdrbufcur,rb_dlrr); + print_rtcp_xr_rb_dlrr(log, rb_dlrr); break; case BT_STATS: rb_stats = (pjmedia_rtcp_xr_rb_stats*) rb_hdr; - print_rtcp_xr_rb_stats(cdrbufcur,rb_stats); + print_rtcp_xr_rb_stats(log, rb_stats); break; case BT_VOIP_METRICS: rb_voip_mtc = (pjmedia_rtcp_xr_rb_voip_mtc*) rb_hdr; - print_rtcp_xr_rb_voip_mtc(cdrbufcur,rb_voip_mtc); + print_rtcp_xr_rb_voip_mtc(log, rb_voip_mtc); break; default: break; diff --git a/daemon/rtcp_xr.h b/daemon/rtcp_xr.h index a90476568..52fd95e6b 100644 --- a/daemon/rtcp_xr.h +++ b/daemon/rtcp_xr.h @@ -10,6 +10,7 @@ #include #include +#include #include "str.h" @@ -225,7 +226,7 @@ typedef struct pjmedia_rtcp_xr_pkt * @param rtcp_pkt The received RTCP XR packet. * @param size Size of the incoming packet. */ -void pjmedia_rtcp_xr_rx_rtcp_xr( char** cdrbufcur, const str *s); +void pjmedia_rtcp_xr_rx_rtcp_xr(GString *, const str *s); #endif /* RTCP_XR_H_ */