? ChangeLog ? Makefile.jb ? chan_iax2.c.CONFLICT ? chan_iax2.c.jb ? chan_iax2.c.orig2 ? jitterbuf.c ? jitterbuf.h Index: chan_iax2.c =================================================================== RCS file: /usr/cvsroot/asterisk/channels/chan_iax2.c,v retrieving revision 1.229 diff -u -w -r1.229 chan_iax2.c --- chan_iax2.c 26 Dec 2004 22:33:25 -0000 1.229 +++ chan_iax2.c 3 Jan 2005 20:20:13 -0000 @@ -5034,6 +5034,17 @@ return 0; } +static void construct_rr(struct chan_iax2_pvt *pvt, struct iax_ie_data *iep) { + memset(iep, 0, sizeof(*iep)); + iax_ie_append_int(iep,IAX_IE_RR_JITTER, pvt->jitter); + /* don't know, don't send! iax_ie_append_int(&ied,IAX_IE_RR_LOSS, 0); */ + /* don't know, don't send! iax_ie_append_int(&ied,IAX_IE_RR_PKTS, stats.frames_in); */ + /* don't know, don't send! iax_ie_append_short(&ied,IAX_IE_RR_DELAY, stats.current - stats.min); */ + /* don't know, don't send! iax_ie_append_int(&ied,IAX_IE_RR_DROPPED, 0); */ + /* don't know, don't send! iax_ie_append_int(&ied,IAX_IE_RR_OOO, 0); */ + +} + static int socket_read(int *id, int fd, short events, void *cbdata) { struct sockaddr_in sin; @@ -5678,12 +5689,18 @@ /* If we're in a bridged call, just forward this */ forward_command(iaxs[fr.callno], AST_FRAME_IAX, IAX_COMMAND_PING, fr.ts, NULL, 0, -1); } else { + struct iax_ie_data pingied; + construct_rr(iaxs[fr.callno], &pingied); /* Send back a pong packet with the original timestamp */ - send_command(iaxs[fr.callno], AST_FRAME_IAX, IAX_COMMAND_PONG, fr.ts, NULL, 0, -1); + send_command(iaxs[fr.callno], AST_FRAME_IAX, IAX_COMMAND_PONG, fr.ts, pingied.buf, pingied.pos, -1); } #else + { + struct iax_ie_data pingied; + construct_rr(iaxs[fr.callno], &pingied); /* Send back a pong packet with the original timestamp */ - send_command(iaxs[fr.callno], AST_FRAME_IAX, IAX_COMMAND_PONG, fr.ts, NULL, 0, -1); + send_command(iaxs[fr.callno], AST_FRAME_IAX, IAX_COMMAND_PONG, fr.ts, pingied.buf, pingied.pos, -1); + } #endif break; case IAX_COMMAND_PONG: Index: iax2-parser.c =================================================================== RCS file: /usr/cvsroot/asterisk/channels/iax2-parser.c,v retrieving revision 1.32 diff -u -w -r1.32 iax2-parser.c --- iax2-parser.c 26 Dec 2004 22:33:25 -0000 1.32 +++ iax2-parser.c 3 Jan 2005 20:20:14 -0000 @@ -747,6 +747,54 @@ } else ies->calling_tns = ntohs(get_uint16(data + 2)); break; + case IAX_IE_RR_JITTER: + if (len != (int)sizeof(unsigned int)) { + snprintf(tmp, (int)sizeof(tmp), "Expected jitter rr to be %d bytes long but was %d\n", (int)sizeof(unsigned int), len); + errorf(tmp); + } else { + ies->rr_jitter = ntohl(get_uint32(data + 2)); + } + break; + case IAX_IE_RR_LOSS: + if (len != (int)sizeof(unsigned int)) { + snprintf(tmp, (int)sizeof(tmp), "Expected loss rr to be %d bytes long but was %d\n", (int)sizeof(unsigned int), len); + errorf(tmp); + } else { + ies->rr_loss = ntohl(get_uint32(data + 2)); + } + break; + case IAX_IE_RR_PKTS: + if (len != (int)sizeof(unsigned int)) { + snprintf(tmp, (int)sizeof(tmp), "Expected packets rr to be %d bytes long but was %d\n", (int)sizeof(unsigned int), len); + errorf(tmp); + } else { + ies->rr_pkts = ntohl(get_uint32(data + 2)); + } + break; + case IAX_IE_RR_DELAY: + if (len != (int)sizeof(unsigned short)) { + snprintf(tmp, (int)sizeof(tmp), "Expected loss rr to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len); + errorf(tmp); + } else { + ies->rr_delay = ntohs(get_uint16(data + 2)); + } + break; + case IAX_IE_RR_DROPPED: + if (len != (int)sizeof(unsigned int)) { + snprintf(tmp, (int)sizeof(tmp), "Expected packets rr to be %d bytes long but was %d\n", (int)sizeof(unsigned int), len); + errorf(tmp); + } else { + ies->rr_dropped = ntohl(get_uint32(data + 2)); + } + break; + case IAX_IE_RR_OOO: + if (len != (int)sizeof(unsigned int)) { + snprintf(tmp, (int)sizeof(tmp), "Expected packets rr to be %d bytes long but was %d\n", (int)sizeof(unsigned int), len); + errorf(tmp); + } else { + ies->rr_ooo = ntohl(get_uint32(data + 2)); + } + break; default: snprintf(tmp, (int)sizeof(tmp), "Ignoring unknown information element '%s' (%d) of length %d\n", iax_ie2str(ie), ie, len); outputf(tmp); Index: iax2-parser.h =================================================================== RCS file: /usr/cvsroot/asterisk/channels/iax2-parser.h,v retrieving revision 1.12 diff -u -w -r1.12 iax2-parser.h --- iax2-parser.h 26 Dec 2004 22:33:25 -0000 1.12 +++ iax2-parser.h 3 Jan 2005 20:20:14 -0000 @@ -57,6 +57,12 @@ unsigned int provver; unsigned short samprate; int provverpres; + unsigned int rr_jitter; + unsigned int rr_loss; + unsigned int rr_pkts; + unsigned short rr_delay; + unsigned int rr_dropped; + unsigned int rr_ooo; }; #define DIRECTION_INGRESS 1 Index: iax2.h =================================================================== RCS file: /usr/cvsroot/asterisk/channels/iax2.h,v retrieving revision 1.18 diff -u -w -r1.18 iax2.h --- iax2.h 26 Dec 2004 22:33:25 -0000 1.18 +++ iax2.h 3 Jan 2005 20:20:14 -0000 @@ -118,6 +118,14 @@ #define IAX_IE_SAMPLINGRATE 41 /* Supported sampling rates (u16) */ #define IAX_IE_CAUSECODE 42 /* Hangup cause (u8) */ +#define IAX_IE_RR_JITTER 64 /* Received jitter (as in RFC1889) u32 */ +#define IAX_IE_RR_LOSS 65 /* Received loss (high byte loss pct, low 24 bits loss count, as in rfc1889 */ +#define IAX_IE_RR_PKTS 66 /* Received frames (total frames received) u32 */ +#define IAX_IE_RR_DELAY 67 /* Max playout delay for received frames (in ms) u16 */ +#define IAX_IE_RR_DROPPED 68 /* Dropped frames (presumably by jitterbuf) u32 */ +#define IAX_IE_RR_OOO 69 /* Frames received Out of Order u32 */ + + #define IAX_AUTH_PLAINTEXT (1 << 0) #define IAX_AUTH_MD5 (1 << 1) #define IAX_AUTH_RSA (1 << 2)