Browse Source

MT#18599 use glib GString for RTCP logging

Change-Id: I32f2759c9a2aabae484715f1fec09616b66107da
changes/48/5548/1
Richard Fuchs 10 years ago
parent
commit
8267966569
3 changed files with 59 additions and 50 deletions
  1. +30
    -26
      daemon/rtcp.c
  2. +27
    -23
      daemon/rtcp_xr.c
  3. +2
    -1
      daemon/rtcp_xr.h

+ 30
- 26
daemon/rtcp.c View File

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

+ 27
- 23
daemon/rtcp_xr.c View File

@ -4,9 +4,10 @@
* Created on: Mar 29, 2015
* Author: fmetz
*/
#include "rtcp_xr.h"
#include <stdio.h>
#include <arpa/inet.h>
#include "rtcp_xr.h"
#include <glib.h>
/* 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;


+ 2
- 1
daemon/rtcp_xr.h View File

@ -10,6 +10,7 @@
#include <stdint.h>
#include <sys/types.h>
#include <glib.h>
#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_ */

Loading…
Cancel
Save