2 * Asterisk -- A telephony toolkit for Linux.
4 * Real-time Protocol Support
5 * Supports RTP and RTCP with Symmetric RTP support for NAT
8 * Copyright (C) 1999 - 2005, Digium, Inc.
10 * Mark Spencer <markster@digium.com>
12 * This program is free software, distributed under the terms of
13 * the GNU General Public License
23 #include <netinet/in.h>
25 #include <sys/socket.h>
26 #include <arpa/inet.h>
29 #include <asterisk/rtp.h>
30 #include <asterisk/frame.h>
31 #include <asterisk/logger.h>
32 #include <asterisk/options.h>
33 #include <asterisk/channel.h>
34 #include <asterisk/acl.h>
35 #include <asterisk/channel.h>
36 #include <asterisk/config.h>
37 #include <asterisk/lock.h>
38 #include <asterisk/utils.h>
39 #include <asterisk/cli.h>
40 #include <asterisk/unaligned.h>
42 #define MAX_TIMESTAMP_SKEW 640
48 #define TYPE_SILENCE 0x2
49 #define TYPE_DONTSEND 0x3
52 static int dtmftimeout = 3000; /* 3000 samples */
54 static int rtpstart = 0;
55 static int rtpend = 0;
56 static int rtpdebug = 0; /* Are we debugging? */
57 static struct sockaddr_in rtpdebugaddr; /* Debug packets to/from this host */
59 static int nochecksums = 0;
62 /* The value of each payload format mapping: */
63 struct rtpPayloadType {
64 int isAstFormat; /* whether the following code is an AST_FORMAT */
68 #define MAX_RTP_PT 256
70 #define FLAG_3389_WARNING (1 << 0)
76 unsigned char rawdata[8192 + AST_FRIENDLY_OFFSET];
79 unsigned int lastdigitts;
80 unsigned int lastrxts;
81 unsigned int lastividtimestamp;
82 unsigned int lastovidtimestamp;
83 unsigned int lasteventseqn;
87 unsigned int dtmfduration;
90 struct sockaddr_in us;
91 struct sockaddr_in them;
92 struct timeval rxcore;
93 struct timeval txcore;
94 struct timeval dtmfmute;
95 struct ast_smoother *smoother;
98 unsigned short rxseqno;
99 struct sched_context *sched;
100 struct io_context *io;
102 ast_rtp_callback callback;
103 struct rtpPayloadType current_RTP_PT[MAX_RTP_PT];
104 int rtp_lookup_code_cache_isAstFormat; /* a cache for the result of rtp_lookup_code(): */
105 int rtp_lookup_code_cache_code;
106 int rtp_lookup_code_cache_result;
107 int rtp_offered_from_local;
108 struct ast_rtcp *rtcp;
113 struct sockaddr_in us;
114 struct sockaddr_in them;
117 static struct ast_rtp_protocol *protos = NULL;
119 int ast_rtp_fd(struct ast_rtp *rtp)
124 int ast_rtcp_fd(struct ast_rtp *rtp)
131 static int g723_len(unsigned char buf)
133 switch(buf & TYPE_MASK) {
147 ast_log(LOG_WARNING, "Badly encoded frame (%d)\n", buf & TYPE_MASK);
152 static int g723_samples(unsigned char *buf, int maxlen)
157 while(pos < maxlen) {
158 res = g723_len(buf[pos]);
167 void ast_rtp_set_data(struct ast_rtp *rtp, void *data)
172 void ast_rtp_set_callback(struct ast_rtp *rtp, ast_rtp_callback callback)
174 rtp->callback = callback;
177 void ast_rtp_setnat(struct ast_rtp *rtp, int nat)
182 static struct ast_frame *send_dtmf(struct ast_rtp *rtp)
185 static struct ast_frame null_frame = { AST_FRAME_NULL, };
186 char iabuf[INET_ADDRSTRLEN];
187 gettimeofday(&tv, NULL);
188 if ((tv.tv_sec < rtp->dtmfmute.tv_sec) ||
189 ((tv.tv_sec == rtp->dtmfmute.tv_sec) && (tv.tv_usec < rtp->dtmfmute.tv_usec))) {
191 ast_log(LOG_DEBUG, "Ignore potential DTMF echo from '%s'\n", ast_inet_ntoa(iabuf, sizeof(iabuf), rtp->them.sin_addr));
193 rtp->dtmfduration = 0;
197 ast_log(LOG_DEBUG, "Sending dtmf: %d (%c), at %s\n", rtp->resp, rtp->resp, ast_inet_ntoa(iabuf, sizeof(iabuf), rtp->them.sin_addr));
198 if (rtp->resp == 'X') {
199 rtp->f.frametype = AST_FRAME_CONTROL;
200 rtp->f.subclass = AST_CONTROL_FLASH;
202 rtp->f.frametype = AST_FRAME_DTMF;
203 rtp->f.subclass = rtp->resp;
210 rtp->dtmfduration = 0;
215 static inline int rtp_debug_test_addr(struct sockaddr_in *addr)
219 if (rtpdebugaddr.sin_addr.s_addr) {
220 if (((ntohs(rtpdebugaddr.sin_port) != 0)
221 && (rtpdebugaddr.sin_port != addr->sin_port))
222 || (rtpdebugaddr.sin_addr.s_addr != addr->sin_addr.s_addr))
228 static struct ast_frame *process_cisco_dtmf(struct ast_rtp *rtp, unsigned char *data, int len)
232 struct ast_frame *f = NULL;
233 event = ntohl(*((unsigned int *)(data)));
236 printf("Cisco Digit: %08x (len = %d)\n", event, len);
240 } else if (event < 11) {
242 } else if (event < 12) {
244 } else if (event < 16) {
245 resp = 'A' + (event - 12);
246 } else if (event < 17) {
249 if (rtp->resp && (rtp->resp != resp)) {
253 rtp->dtmfcount = dtmftimeout;
257 static struct ast_frame *process_rfc2833(struct ast_rtp *rtp, unsigned char *data, int len)
260 unsigned int event_end;
261 unsigned int duration;
263 struct ast_frame *f = NULL;
264 event = ntohl(*((unsigned int *)(data)));
266 event_end = ntohl(*((unsigned int *)(data)));
269 duration = ntohl(*((unsigned int *)(data)));
272 printf("Event: %08x (len = %d)\n", event, len);
276 } else if (event < 11) {
278 } else if (event < 12) {
280 } else if (event < 16) {
281 resp = 'A' + (event - 12);
282 } else if (event < 17) {
285 if (rtp->resp && (rtp->resp != resp)) {
288 else if(event_end & 0x80)
297 else if(rtp->dtmfduration && (duration < rtp->dtmfduration))
301 if (!(event_end & 0x80))
303 rtp->dtmfcount = dtmftimeout;
304 rtp->dtmfduration = duration;
308 static struct ast_frame *process_rfc3389(struct ast_rtp *rtp, unsigned char *data, int len)
310 struct ast_frame *f = NULL;
311 /* Convert comfort noise into audio with various codecs. Unfortunately this doesn't
312 totally help us out becuase we don't have an engine to keep it going and we are not
313 guaranteed to have it every 20ms or anything */
315 printf("RFC3389: %d bytes, level %d...\n", len, rtp->lastrxformat);
317 if (!(rtp->flags & FLAG_3389_WARNING)) {
318 ast_log(LOG_NOTICE, "RFC3389 support incomplete. Turn off on client if possible\n");
319 rtp->flags |= FLAG_3389_WARNING;
321 /* Must have at least one byte */
325 rtp->f.data = rtp->rawdata + AST_FRIENDLY_OFFSET;
326 rtp->f.datalen = len - 1;
327 rtp->f.offset = AST_FRIENDLY_OFFSET;
328 memcpy(rtp->f.data, data + 1, len - 1);
334 rtp->f.frametype = AST_FRAME_CNG;
335 rtp->f.subclass = data[0] & 0x7f;
336 rtp->f.datalen = len - 1;
338 rtp->f.delivery.tv_usec = rtp->f.delivery.tv_sec = 0;
343 static int rtpread(int *id, int fd, short events, void *cbdata)
345 struct ast_rtp *rtp = cbdata;
347 f = ast_rtp_read(rtp);
350 rtp->callback(rtp, f, rtp->data);
355 struct ast_frame *ast_rtcp_read(struct ast_rtp *rtp)
357 static struct ast_frame null_frame = { AST_FRAME_NULL, };
361 struct sockaddr_in sin;
362 unsigned int rtcpdata[1024];
363 char iabuf[INET_ADDRSTRLEN];
370 res = recvfrom(rtp->rtcp->s, rtcpdata, sizeof(rtcpdata),
371 0, (struct sockaddr *)&sin, &len);
375 ast_log(LOG_NOTICE, "RTP: Received packet with bad UDP checksum\n");
377 ast_log(LOG_WARNING, "RTP Read error: %s\n", strerror(errno));
384 ast_log(LOG_WARNING, "RTP Read too short\n");
389 /* Send to whoever sent to us */
390 if ((rtp->rtcp->them.sin_addr.s_addr != sin.sin_addr.s_addr) ||
391 (rtp->rtcp->them.sin_port != sin.sin_port)) {
392 memcpy(&rtp->them, &sin, sizeof(rtp->them));
395 ast_log(LOG_DEBUG, "RTP NAT: Using address %s:%d\n", ast_inet_ntoa(iabuf, sizeof(iabuf), rtp->rtcp->them.sin_addr), ntohs(rtp->rtcp->them.sin_port));
399 ast_log(LOG_DEBUG, "Got RTCP report of %d bytes\n", res);
403 static void calc_rxstamp(struct timeval *tv, struct ast_rtp *rtp, unsigned int timestamp, int mark)
405 if ((!rtp->rxcore.tv_sec && !rtp->rxcore.tv_usec) || mark) {
406 gettimeofday(&rtp->rxcore, NULL);
407 rtp->rxcore.tv_sec -= timestamp / 8000;
408 rtp->rxcore.tv_usec -= (timestamp % 8000) * 125;
409 /* Round to 20ms for nice, pretty timestamps */
410 rtp->rxcore.tv_usec -= rtp->rxcore.tv_usec % 20000;
411 if (rtp->rxcore.tv_usec < 0) {
412 /* Adjust appropriately if necessary */
413 rtp->rxcore.tv_usec += 1000000;
414 rtp->rxcore.tv_sec -= 1;
417 tv->tv_sec = rtp->rxcore.tv_sec + timestamp / 8000;
418 tv->tv_usec = rtp->rxcore.tv_usec + (timestamp % 8000) * 125;
419 if (tv->tv_usec >= 1000000) {
420 tv->tv_usec -= 1000000;
425 struct ast_frame *ast_rtp_read(struct ast_rtp *rtp)
428 struct sockaddr_in sin;
437 char iabuf[INET_ADDRSTRLEN];
438 unsigned int timestamp;
439 unsigned int *rtpheader;
440 static struct ast_frame *f, null_frame = { AST_FRAME_NULL, };
441 struct rtpPayloadType rtpPT;
445 /* Cache where the header will go */
446 res = recvfrom(rtp->s, rtp->rawdata + AST_FRIENDLY_OFFSET, sizeof(rtp->rawdata) - AST_FRIENDLY_OFFSET,
447 0, (struct sockaddr *)&sin, &len);
450 rtpheader = (unsigned int *)(rtp->rawdata + AST_FRIENDLY_OFFSET);
453 ast_log(LOG_NOTICE, "RTP: Received packet with bad UDP checksum\n");
455 ast_log(LOG_WARNING, "RTP Read error: %s\n", strerror(errno));
461 ast_log(LOG_WARNING, "RTP Read too short\n");
465 /* Ignore if the other side hasn't been given an address
467 if (!rtp->them.sin_addr.s_addr || !rtp->them.sin_port)
471 /* Send to whoever sent to us */
472 if ((rtp->them.sin_addr.s_addr != sin.sin_addr.s_addr) ||
473 (rtp->them.sin_port != sin.sin_port)) {
474 memcpy(&rtp->them, &sin, sizeof(rtp->them));
476 ast_log(LOG_DEBUG, "RTP NAT: Using address %s:%d\n", ast_inet_ntoa(iabuf, sizeof(iabuf), rtp->them.sin_addr), ntohs(rtp->them.sin_port));
481 seqno = ntohl(rtpheader[0]);
483 /* Check RTP version */
484 version = (seqno & 0xC0000000) >> 30;
488 payloadtype = (seqno & 0x7f0000) >> 16;
489 mark = seqno & (1 << 23);
490 ext = seqno & (1 << 28);
492 timestamp = ntohl(rtpheader[1]);
494 /* RTP Extension present */
496 hdrlen += (ntohl(rtpheader[3]) & 0xffff) << 2;
500 ast_log(LOG_WARNING, "RTP Read too short (%d, expecting %d)\n", res, hdrlen);
504 if(rtp_debug_test_addr(&sin))
505 ast_verbose("Got RTP packet from %s:%d (type %d, seq %d, ts %d, len %d)\n"
506 , ast_inet_ntoa(iabuf, sizeof(iabuf), sin.sin_addr), ntohs(sin.sin_port), payloadtype, seqno, timestamp,res - hdrlen);
508 rtpPT = ast_rtp_lookup_pt(rtp, payloadtype);
509 if (!rtpPT.isAstFormat) {
510 /* This is special in-band data that's not one of our codecs */
511 if (rtpPT.code == AST_RTP_DTMF) {
512 /* It's special -- rfc2833 process it */
513 if (rtp->lasteventseqn <= seqno || rtp->resp == 0 || (rtp->lasteventseqn >= 65530 && seqno <= 6)) {
514 f = process_rfc2833(rtp, rtp->rawdata + AST_FRIENDLY_OFFSET + hdrlen, res - hdrlen);
515 rtp->lasteventseqn = seqno;
522 } else if (rtpPT.code == AST_RTP_CISCO_DTMF) {
523 /* It's really special -- process it the Cisco way */
524 if (rtp->lasteventseqn <= seqno || rtp->resp == 0 || (rtp->lasteventseqn >= 65530 && seqno <= 6)) {
525 f = process_cisco_dtmf(rtp, rtp->rawdata + AST_FRIENDLY_OFFSET + hdrlen, res - hdrlen);
526 rtp->lasteventseqn = seqno;
533 } else if (rtpPT.code == AST_RTP_CN) {
535 f = process_rfc3389(rtp, rtp->rawdata + AST_FRIENDLY_OFFSET + hdrlen, res - hdrlen);
541 ast_log(LOG_NOTICE, "Unknown RTP codec %d received\n", payloadtype);
545 rtp->f.subclass = rtpPT.code;
546 if (rtp->f.subclass < AST_FORMAT_MAX_AUDIO)
547 rtp->f.frametype = AST_FRAME_VOICE;
549 rtp->f.frametype = AST_FRAME_VIDEO;
550 rtp->lastrxformat = rtp->f.subclass;
553 rtp->lastrxts = timestamp;
556 for (x=rtp->rxseqno + 1; x < seqno; x++) {
557 /* Queue empty frames */
563 rtp->f.src = "RTPMissedFrame";
566 rtp->rxseqno = seqno;
568 if (rtp->dtmfcount) {
570 printf("dtmfcount was %d\n", rtp->dtmfcount);
572 rtp->dtmfcount -= (timestamp - rtp->lastrxts);
573 if (rtp->dtmfcount < 0)
576 if (dtmftimeout != rtp->dtmfcount)
577 printf("dtmfcount is %d\n", rtp->dtmfcount);
580 rtp->lastrxts = timestamp;
582 /* Send any pending DTMF */
583 if (rtp->resp && !rtp->dtmfcount) {
585 ast_log(LOG_DEBUG, "Sending pending DTMF\n");
586 return send_dtmf(rtp);
589 rtp->f.datalen = res - hdrlen;
590 rtp->f.data = rtp->rawdata + hdrlen + AST_FRIENDLY_OFFSET;
591 rtp->f.offset = hdrlen + AST_FRIENDLY_OFFSET;
592 if (rtp->f.subclass < AST_FORMAT_MAX_AUDIO) {
593 switch(rtp->f.subclass) {
594 case AST_FORMAT_ULAW:
595 case AST_FORMAT_ALAW:
596 rtp->f.samples = rtp->f.datalen;
598 case AST_FORMAT_SLINEAR:
599 rtp->f.samples = rtp->f.datalen / 2;
600 ast_frame_byteswap_be(&rtp->f);
603 rtp->f.samples = 160 * (rtp->f.datalen / 33);
605 case AST_FORMAT_ILBC:
606 rtp->f.samples = 240 * (rtp->f.datalen / 50);
608 case AST_FORMAT_ADPCM:
609 case AST_FORMAT_G726:
610 rtp->f.samples = rtp->f.datalen * 2;
612 case AST_FORMAT_G729A:
613 rtp->f.samples = rtp->f.datalen * 8;
615 case AST_FORMAT_G723_1:
616 rtp->f.samples = g723_samples(rtp->f.data, rtp->f.datalen);
618 case AST_FORMAT_SPEEX:
619 /* assumes that the RTP packet contained one Speex frame */
620 rtp->f.samples = 160;
622 case AST_FORMAT_LPC10:
623 rtp->f.samples = 22 * 8;
624 rtp->f.samples += (((char *)(rtp->f.data))[7] & 0x1) * 8;
627 ast_log(LOG_NOTICE, "Unable to calculate samples for format %s\n", ast_getformatname(rtp->f.subclass));
630 calc_rxstamp(&rtp->f.delivery, rtp, timestamp, mark);
632 /* Video -- samples is # of samples vs. 90000 */
633 if (!rtp->lastividtimestamp)
634 rtp->lastividtimestamp = timestamp;
635 rtp->f.samples = timestamp - rtp->lastividtimestamp;
636 rtp->lastividtimestamp = timestamp;
637 rtp->f.delivery.tv_sec = 0;
638 rtp->f.delivery.tv_usec = 0;
640 rtp->f.subclass |= 0x1;
647 /* The following array defines the MIME Media type (and subtype) for each
648 of our codecs, or RTP-specific data type. */
650 struct rtpPayloadType payloadType;
654 {{1, AST_FORMAT_G723_1}, "audio", "G723"},
655 {{1, AST_FORMAT_GSM}, "audio", "GSM"},
656 {{1, AST_FORMAT_ULAW}, "audio", "PCMU"},
657 {{1, AST_FORMAT_ALAW}, "audio", "PCMA"},
658 {{1, AST_FORMAT_G726}, "audio", "G726-32"},
659 {{1, AST_FORMAT_ADPCM}, "audio", "DVI4"},
660 {{1, AST_FORMAT_SLINEAR}, "audio", "L16"},
661 {{1, AST_FORMAT_LPC10}, "audio", "LPC"},
662 {{1, AST_FORMAT_G729A}, "audio", "G729"},
663 {{1, AST_FORMAT_SPEEX}, "audio", "speex"},
664 {{1, AST_FORMAT_ILBC}, "audio", "iLBC"},
665 {{0, AST_RTP_DTMF}, "audio", "telephone-event"},
666 {{0, AST_RTP_CISCO_DTMF}, "audio", "cisco-telephone-event"},
667 {{0, AST_RTP_CN}, "audio", "CN"},
668 {{1, AST_FORMAT_JPEG}, "video", "JPEG"},
669 {{1, AST_FORMAT_PNG}, "video", "PNG"},
670 {{1, AST_FORMAT_H261}, "video", "H261"},
671 {{1, AST_FORMAT_H263}, "video", "H263"},
672 {{1, AST_FORMAT_H263_PLUS}, "video", "h263-1998"},
675 /* Static (i.e., well-known) RTP payload types for our "AST_FORMAT..."s:
676 also, our own choices for dynamic payload types. This is our master
677 table for transmission */
678 static struct rtpPayloadType static_RTP_PT[MAX_RTP_PT] = {
679 [0] = {1, AST_FORMAT_ULAW},
680 #ifdef USE_DEPRECATED_G726
681 [2] = {1, AST_FORMAT_G726}, /* Technically this is G.721, but if Cisco can do it, so can we... */
683 [3] = {1, AST_FORMAT_GSM},
684 [4] = {1, AST_FORMAT_G723_1},
685 [5] = {1, AST_FORMAT_ADPCM}, /* 8 kHz */
686 [6] = {1, AST_FORMAT_ADPCM}, /* 16 kHz */
687 [7] = {1, AST_FORMAT_LPC10},
688 [8] = {1, AST_FORMAT_ALAW},
689 [10] = {1, AST_FORMAT_SLINEAR}, /* 2 channels */
690 [11] = {1, AST_FORMAT_SLINEAR}, /* 1 channel */
691 [13] = {0, AST_RTP_CN},
692 [16] = {1, AST_FORMAT_ADPCM}, /* 11.025 kHz */
693 [17] = {1, AST_FORMAT_ADPCM}, /* 22.050 kHz */
694 [18] = {1, AST_FORMAT_G729A},
695 [19] = {0, AST_RTP_CN}, /* Also used for CN */
696 [26] = {1, AST_FORMAT_JPEG},
697 [31] = {1, AST_FORMAT_H261},
698 [34] = {1, AST_FORMAT_H263},
699 [103] = {1, AST_FORMAT_H263_PLUS},
700 [97] = {1, AST_FORMAT_ILBC},
701 [101] = {0, AST_RTP_DTMF},
702 [110] = {1, AST_FORMAT_SPEEX},
703 [111] = {1, AST_FORMAT_G726},
704 [121] = {0, AST_RTP_CISCO_DTMF}, /* Must be type 121 */
707 void ast_rtp_pt_clear(struct ast_rtp* rtp)
711 for (i = 0; i < MAX_RTP_PT; ++i) {
712 rtp->current_RTP_PT[i].isAstFormat = 0;
713 rtp->current_RTP_PT[i].code = 0;
716 rtp->rtp_lookup_code_cache_isAstFormat = 0;
717 rtp->rtp_lookup_code_cache_code = 0;
718 rtp->rtp_lookup_code_cache_result = 0;
721 void ast_rtp_pt_default(struct ast_rtp* rtp)
725 /* Initialize to default payload types */
726 for (i = 0; i < MAX_RTP_PT; ++i) {
727 rtp->current_RTP_PT[i].isAstFormat = static_RTP_PT[i].isAstFormat;
728 rtp->current_RTP_PT[i].code = static_RTP_PT[i].code;
731 rtp->rtp_lookup_code_cache_isAstFormat = 0;
732 rtp->rtp_lookup_code_cache_code = 0;
733 rtp->rtp_lookup_code_cache_result = 0;
736 /* Make a note of a RTP payload type that was seen in a SDP "m=" line. */
737 /* By default, use the well-known value for this type (although it may */
738 /* still be set to a different value by a subsequent "a=rtpmap:" line): */
739 void ast_rtp_set_m_type(struct ast_rtp* rtp, int pt) {
740 if (pt < 0 || pt > MAX_RTP_PT)
741 return; /* bogus payload type */
743 if (static_RTP_PT[pt].code != 0) {
744 rtp->current_RTP_PT[pt] = static_RTP_PT[pt];
748 /* Make a note of a RTP payload type (with MIME type) that was seen in */
749 /* a SDP "a=rtpmap:" line. */
750 void ast_rtp_set_rtpmap_type(struct ast_rtp* rtp, int pt,
751 char* mimeType, char* mimeSubtype) {
754 if (pt < 0 || pt > MAX_RTP_PT)
755 return; /* bogus payload type */
757 for (i = 0; i < sizeof mimeTypes/sizeof mimeTypes[0]; ++i) {
758 if (strcasecmp(mimeSubtype, mimeTypes[i].subtype) == 0 &&
759 strcasecmp(mimeType, mimeTypes[i].type) == 0) {
760 rtp->current_RTP_PT[pt] = mimeTypes[i].payloadType;
766 /* Return the union of all of the codecs that were set by rtp_set...() calls */
767 /* They're returned as two distinct sets: AST_FORMATs, and AST_RTPs */
768 void ast_rtp_get_current_formats(struct ast_rtp* rtp,
769 int* astFormats, int* nonAstFormats) {
772 *astFormats = *nonAstFormats = 0;
773 for (pt = 0; pt < MAX_RTP_PT; ++pt) {
774 if (rtp->current_RTP_PT[pt].isAstFormat) {
775 *astFormats |= rtp->current_RTP_PT[pt].code;
777 *nonAstFormats |= rtp->current_RTP_PT[pt].code;
782 void ast_rtp_offered_from_local(struct ast_rtp* rtp, int local) {
784 rtp->rtp_offered_from_local = local;
786 ast_log(LOG_WARNING, "rtp structure is null\n");
789 struct rtpPayloadType ast_rtp_lookup_pt(struct ast_rtp* rtp, int pt)
791 struct rtpPayloadType result;
793 result.isAstFormat = result.code = 0;
794 if (pt < 0 || pt > MAX_RTP_PT)
795 return result; /* bogus payload type */
797 /* Start with the negotiated codecs */
798 if (!rtp->rtp_offered_from_local)
799 result = rtp->current_RTP_PT[pt];
801 /* If it doesn't exist, check our static RTP type list, just in case */
803 result = static_RTP_PT[pt];
807 /* Looks up an RTP code out of our *static* outbound list */
808 int ast_rtp_lookup_code(struct ast_rtp* rtp, const int isAstFormat, const int code) {
812 if (isAstFormat == rtp->rtp_lookup_code_cache_isAstFormat &&
813 code == rtp->rtp_lookup_code_cache_code) {
815 /* Use our cached mapping, to avoid the overhead of the loop below */
816 return rtp->rtp_lookup_code_cache_result;
819 /* Check the dynamic list first */
820 for (pt = 0; pt < MAX_RTP_PT; ++pt) {
821 if (rtp->current_RTP_PT[pt].code == code && rtp->current_RTP_PT[pt].isAstFormat == isAstFormat) {
822 rtp->rtp_lookup_code_cache_isAstFormat = isAstFormat;
823 rtp->rtp_lookup_code_cache_code = code;
824 rtp->rtp_lookup_code_cache_result = pt;
829 /* Then the static list */
830 for (pt = 0; pt < MAX_RTP_PT; ++pt) {
831 if (static_RTP_PT[pt].code == code && static_RTP_PT[pt].isAstFormat == isAstFormat) {
832 rtp->rtp_lookup_code_cache_isAstFormat = isAstFormat;
833 rtp->rtp_lookup_code_cache_code = code;
834 rtp->rtp_lookup_code_cache_result = pt;
841 char* ast_rtp_lookup_mime_subtype(const int isAstFormat, const int code) {
845 for (i = 0; i < sizeof mimeTypes/sizeof mimeTypes[0]; ++i) {
846 if (mimeTypes[i].payloadType.code == code && mimeTypes[i].payloadType.isAstFormat == isAstFormat) {
847 return mimeTypes[i].subtype;
853 char *ast_rtp_lookup_mime_multiple(char *buf, int size, const int capability, const int isAstFormat)
863 snprintf(end, size, "0x%x (", capability);
870 for (format = 1; format < AST_RTP_MAX; format <<= 1) {
871 if (capability & format) {
872 const char *name = ast_rtp_lookup_mime_subtype(isAstFormat, format);
873 snprintf(end, size, "%s|", name);
881 snprintf(start, size, "nothing)");
888 static int rtp_socket(void)
892 s = socket(AF_INET, SOCK_DGRAM, 0);
894 flags = fcntl(s, F_GETFL);
895 fcntl(s, F_SETFL, flags | O_NONBLOCK);
898 setsockopt(s, SOL_SOCKET, SO_NO_CHECK, &nochecksums, sizeof(nochecksums));
904 static struct ast_rtcp *ast_rtcp_new(void)
906 struct ast_rtcp *rtcp;
907 rtcp = malloc(sizeof(struct ast_rtcp));
910 memset(rtcp, 0, sizeof(struct ast_rtcp));
911 rtcp->s = rtp_socket();
912 rtcp->us.sin_family = AF_INET;
915 ast_log(LOG_WARNING, "Unable to allocate socket: %s\n", strerror(errno));
921 struct ast_rtp *ast_rtp_new_with_bindaddr(struct sched_context *sched, struct io_context *io, int rtcpenable, int callbackmode, struct in_addr addr)
927 rtp = malloc(sizeof(struct ast_rtp));
930 memset(rtp, 0, sizeof(struct ast_rtp));
931 rtp->them.sin_family = AF_INET;
932 rtp->us.sin_family = AF_INET;
933 rtp->s = rtp_socket();
935 rtp->seqno = rand() & 0xffff;
938 ast_log(LOG_ERROR, "Unable to allocate socket: %s\n", strerror(errno));
941 if (sched && rtcpenable) {
943 rtp->rtcp = ast_rtcp_new();
945 /* Find us a place */
946 x = (rand() % (rtpend-rtpstart)) + rtpstart;
950 /* Must be an even port number by RTP spec */
951 rtp->us.sin_port = htons(x);
952 rtp->us.sin_addr = addr;
954 rtp->rtcp->us.sin_port = htons(x + 1);
955 if (!(first = bind(rtp->s, (struct sockaddr *)&rtp->us, sizeof(rtp->us))) &&
956 (!rtp->rtcp || !bind(rtp->rtcp->s, (struct sockaddr *)&rtp->rtcp->us, sizeof(rtp->rtcp->us))))
959 /* Primary bind succeeded! Gotta recreate it */
961 rtp->s = rtp_socket();
963 if (errno != EADDRINUSE) {
964 ast_log(LOG_ERROR, "Unexpected bind error: %s\n", strerror(errno));
975 x = (rtpstart + 1) & ~1;
976 if (x == startplace) {
977 ast_log(LOG_ERROR, "No RTP ports remaining\n");
987 if (io && sched && callbackmode) {
988 /* Operate this one in a callback mode */
991 rtp->ioid = ast_io_add(rtp->io, rtp->s, rtpread, AST_IO_IN, rtp);
993 ast_rtp_pt_default(rtp);
997 struct ast_rtp *ast_rtp_new(struct sched_context *sched, struct io_context *io, int rtcpenable, int callbackmode)
1001 memset(&ia, 0, sizeof(ia));
1002 return ast_rtp_new_with_bindaddr(sched, io, rtcpenable, callbackmode, ia);
1005 int ast_rtp_settos(struct ast_rtp *rtp, int tos)
1009 if ((res = setsockopt(rtp->s, IPPROTO_IP, IP_TOS, &tos, sizeof(tos))))
1010 ast_log(LOG_WARNING, "Unable to set TOS to %d\n", tos);
1014 void ast_rtp_set_peer(struct ast_rtp *rtp, struct sockaddr_in *them)
1016 rtp->them.sin_port = them->sin_port;
1017 rtp->them.sin_addr = them->sin_addr;
1019 rtp->rtcp->them.sin_port = htons(ntohs(them->sin_port) + 1);
1020 rtp->rtcp->them.sin_addr = them->sin_addr;
1025 void ast_rtp_get_peer(struct ast_rtp *rtp, struct sockaddr_in *them)
1027 them->sin_family = AF_INET;
1028 them->sin_port = rtp->them.sin_port;
1029 them->sin_addr = rtp->them.sin_addr;
1032 void ast_rtp_get_us(struct ast_rtp *rtp, struct sockaddr_in *us)
1034 memcpy(us, &rtp->us, sizeof(rtp->us));
1037 void ast_rtp_stop(struct ast_rtp *rtp)
1039 memset(&rtp->them.sin_addr, 0, sizeof(rtp->them.sin_addr));
1040 memset(&rtp->them.sin_port, 0, sizeof(rtp->them.sin_port));
1042 memset(&rtp->rtcp->them.sin_addr, 0, sizeof(rtp->them.sin_addr));
1043 memset(&rtp->rtcp->them.sin_port, 0, sizeof(rtp->them.sin_port));
1047 void ast_rtp_reset(struct ast_rtp *rtp)
1049 memset(&rtp->rxcore, 0, sizeof(rtp->rxcore));
1050 memset(&rtp->txcore, 0, sizeof(rtp->txcore));
1051 memset(&rtp->dtmfmute, 0, sizeof(rtp->dtmfmute));
1053 rtp->lastdigitts = 0;
1055 rtp->lastividtimestamp = 0;
1056 rtp->lastovidtimestamp = 0;
1057 rtp->lasteventseqn = 0;
1058 rtp->lasttxformat = 0;
1059 rtp->lastrxformat = 0;
1061 rtp->dtmfduration = 0;
1066 void ast_rtp_destroy(struct ast_rtp *rtp)
1069 ast_smoother_free(rtp->smoother);
1071 ast_io_remove(rtp->io, rtp->ioid);
1075 close(rtp->rtcp->s);
1081 static unsigned int calc_txstamp(struct ast_rtp *rtp, struct timeval *delivery)
1085 if (!rtp->txcore.tv_sec && !rtp->txcore.tv_usec) {
1086 gettimeofday(&rtp->txcore, NULL);
1087 /* Round to 20ms for nice, pretty timestamps */
1088 rtp->txcore.tv_usec -= rtp->txcore.tv_usec % 20000;
1090 if (delivery && (delivery->tv_sec || delivery->tv_usec)) {
1091 /* Use previous txcore */
1092 ms = (delivery->tv_sec - rtp->txcore.tv_sec) * 1000;
1093 ms += (1000000 + delivery->tv_usec - rtp->txcore.tv_usec) / 1000 - 1000;
1094 rtp->txcore.tv_sec = delivery->tv_sec;
1095 rtp->txcore.tv_usec = delivery->tv_usec;
1097 gettimeofday(&now, NULL);
1098 ms = (now.tv_sec - rtp->txcore.tv_sec) * 1000;
1099 ms += (1000000 + now.tv_usec - rtp->txcore.tv_usec) / 1000 - 1000;
1100 /* Use what we just got for next time */
1101 rtp->txcore.tv_sec = now.tv_sec;
1102 rtp->txcore.tv_usec = now.tv_usec;
1107 int ast_rtp_senddigit(struct ast_rtp *rtp, char digit)
1109 unsigned int *rtpheader;
1115 char iabuf[INET_ADDRSTRLEN];
1117 if ((digit <= '9') && (digit >= '0'))
1119 else if (digit == '*')
1121 else if (digit == '#')
1123 else if ((digit >= 'A') && (digit <= 'D'))
1124 digit = digit - 'A' + 12;
1125 else if ((digit >= 'a') && (digit <= 'd'))
1126 digit = digit - 'a' + 12;
1128 ast_log(LOG_WARNING, "Don't know how to represent '%c'\n", digit);
1131 payload = ast_rtp_lookup_code(rtp, 0, AST_RTP_DTMF);
1133 /* If we have no peer, return immediately */
1134 if (!rtp->them.sin_addr.s_addr)
1137 gettimeofday(&rtp->dtmfmute, NULL);
1138 rtp->dtmfmute.tv_usec += (500 * 1000);
1139 if (rtp->dtmfmute.tv_usec > 1000000) {
1140 rtp->dtmfmute.tv_usec -= 1000000;
1141 rtp->dtmfmute.tv_sec += 1;
1144 /* Get a pointer to the header */
1145 rtpheader = (unsigned int *)data;
1146 rtpheader[0] = htonl((2 << 30) | (1 << 23) | (payload << 16) | (rtp->seqno++));
1147 rtpheader[1] = htonl(rtp->lastdigitts);
1148 rtpheader[2] = htonl(rtp->ssrc);
1149 rtpheader[3] = htonl((digit << 24) | (0xa << 16) | (0));
1151 if (rtp->them.sin_port && rtp->them.sin_addr.s_addr) {
1152 res = sendto(rtp->s, (void *)rtpheader, hdrlen + 4, 0, (struct sockaddr *)&rtp->them, sizeof(rtp->them));
1154 ast_log(LOG_ERROR, "RTP Transmission error to %s:%d: %s\n", ast_inet_ntoa(iabuf, sizeof(iabuf), rtp->them.sin_addr), ntohs(rtp->them.sin_port), strerror(errno));
1155 if(rtp_debug_test_addr(&rtp->them))
1156 ast_verbose("Sent RTP packet to %s:%d (type %d, seq %d, ts %d, len %d)\n"
1157 , ast_inet_ntoa(iabuf, sizeof(iabuf), rtp->them.sin_addr), ntohs(rtp->them.sin_port), payload, rtp->seqno, rtp->lastdigitts, res - hdrlen);
1160 /* Clear marker bit and increment seqno */
1161 rtpheader[0] = htonl((2 << 30) | (payload << 16) | (rtp->seqno++));
1162 /* For the last three packets, set the duration and the end bit */
1164 /* Make duration 800 (100ms) */
1165 rtpheader[3] |= htonl((800));
1166 /* Set the End bit for the last 3 */
1167 rtpheader[3] |= htonl((1 << 23));
1170 /* Increment the digit timestamp by 100ms, to ensure that digits
1171 sent sequentially with no intervening non-digit packets do not
1172 get sent with the same timestamp.
1174 rtp->lastdigitts += 800;
1178 int ast_rtp_sendcng(struct ast_rtp *rtp, int level)
1180 unsigned int *rtpheader;
1185 char iabuf[INET_ADDRSTRLEN];
1186 level = 127 - (level & 0x7f);
1187 payload = ast_rtp_lookup_code(rtp, 0, AST_RTP_CN);
1189 /* If we have no peer, return immediately */
1190 if (!rtp->them.sin_addr.s_addr)
1193 gettimeofday(&rtp->dtmfmute, NULL);
1194 rtp->dtmfmute.tv_usec += (500 * 1000);
1195 if (rtp->dtmfmute.tv_usec > 1000000) {
1196 rtp->dtmfmute.tv_usec -= 1000000;
1197 rtp->dtmfmute.tv_sec += 1;
1200 /* Get a pointer to the header */
1201 rtpheader = (unsigned int *)data;
1202 rtpheader[0] = htonl((2 << 30) | (1 << 23) | (payload << 16) | (rtp->seqno++));
1203 rtpheader[1] = htonl(rtp->lastts);
1204 rtpheader[2] = htonl(rtp->ssrc);
1206 if (rtp->them.sin_port && rtp->them.sin_addr.s_addr) {
1207 res = sendto(rtp->s, (void *)rtpheader, hdrlen + 1, 0, (struct sockaddr *)&rtp->them, sizeof(rtp->them));
1209 ast_log(LOG_ERROR, "RTP Comfort Noise Transmission error to %s:%d: %s\n", ast_inet_ntoa(iabuf, sizeof(iabuf), rtp->them.sin_addr), ntohs(rtp->them.sin_port), strerror(errno));
1210 if(rtp_debug_test_addr(&rtp->them))
1211 ast_verbose("Sent Comfort Noise RTP packet to %s:%d (type %d, seq %d, ts %d, len %d)\n"
1212 , ast_inet_ntoa(iabuf, sizeof(iabuf), rtp->them.sin_addr), ntohs(rtp->them.sin_port), payload, rtp->seqno, rtp->lastts,res - hdrlen);
1218 static int ast_rtp_raw_write(struct ast_rtp *rtp, struct ast_frame *f, int codec)
1220 unsigned char *rtpheader;
1221 char iabuf[INET_ADDRSTRLEN];
1228 ms = calc_txstamp(rtp, &f->delivery);
1229 /* Default prediction */
1230 if (f->subclass < AST_FORMAT_MAX_AUDIO) {
1231 pred = rtp->lastts + ms * 8;
1233 switch(f->subclass) {
1234 case AST_FORMAT_ULAW:
1235 case AST_FORMAT_ALAW:
1236 /* If we're within +/- 20ms from when where we
1237 predict we should be, use that */
1238 pred = rtp->lastts + f->datalen;
1240 case AST_FORMAT_ADPCM:
1241 case AST_FORMAT_G726:
1242 /* If we're within +/- 20ms from when where we
1243 predict we should be, use that */
1244 pred = rtp->lastts + f->datalen * 2;
1246 case AST_FORMAT_G729A:
1247 pred = rtp->lastts + f->datalen * 8;
1249 case AST_FORMAT_GSM:
1250 pred = rtp->lastts + (f->datalen * 160 / 33);
1252 case AST_FORMAT_ILBC:
1253 pred = rtp->lastts + (f->datalen * 240 / 50);
1255 case AST_FORMAT_G723_1:
1256 pred = rtp->lastts + g723_samples(f->data, f->datalen);
1258 case AST_FORMAT_SPEEX:
1259 pred = rtp->lastts + 160;
1260 /* assumes that the RTP packet contains one Speex frame */
1262 case AST_FORMAT_LPC10:
1263 /* assumes that the RTP packet contains one LPC10 frame */
1264 pred = rtp->lastts + 22 * 8;
1265 pred += (((char *)(f->data))[7] & 0x1) * 8;
1268 ast_log(LOG_WARNING, "Not sure about timestamp format for codec format %s\n", ast_getformatname(f->subclass));
1270 /* Re-calculate last TS */
1271 rtp->lastts = rtp->lastts + ms * 8;
1272 if (!f->delivery.tv_sec && !f->delivery.tv_usec) {
1273 /* If this isn't an absolute delivery time, Check if it is close to our prediction,
1274 and if so, go with our prediction */
1275 if (abs(rtp->lastts - pred) < MAX_TIMESTAMP_SKEW)
1278 if (option_debug > 2)
1279 ast_log(LOG_DEBUG, "Difference is %d, ms is %d\n", abs(rtp->lastts - pred), ms);
1284 mark = f->subclass & 0x1;
1285 pred = rtp->lastovidtimestamp + f->samples;
1286 /* Re-calculate last TS */
1287 rtp->lastts = rtp->lastts + ms * 90;
1288 /* If it's close to our prediction, go for it */
1289 if (!f->delivery.tv_sec && !f->delivery.tv_usec) {
1290 if (abs(rtp->lastts - pred) < 7200) {
1292 rtp->lastovidtimestamp += f->samples;
1294 if (option_debug > 2)
1295 ast_log(LOG_DEBUG, "Difference is %d, ms is %d (%d), pred/ts/samples %d/%d/%d\n", abs(rtp->lastts - pred), ms, ms * 90, rtp->lastts, pred, f->samples);
1296 rtp->lastovidtimestamp = rtp->lastts;
1300 /* If the timestamp for non-digit packets has moved beyond the timestamp
1301 for digits, update the digit timestamp.
1303 if (rtp->lastts > rtp->lastdigitts)
1304 rtp->lastdigitts = rtp->lastts;
1306 /* Get a pointer to the header */
1307 rtpheader = (unsigned char *)(f->data - hdrlen);
1309 put_unaligned_uint32(rtpheader, htonl((2 << 30) | (codec << 16) | (rtp->seqno) | (mark << 23)));
1310 put_unaligned_uint32(rtpheader + 4, htonl(rtp->lastts));
1311 put_unaligned_uint32(rtpheader + 8, htonl(rtp->ssrc));
1313 if (rtp->them.sin_port && rtp->them.sin_addr.s_addr) {
1314 res = sendto(rtp->s, (void *)rtpheader, f->datalen + hdrlen, 0, (struct sockaddr *)&rtp->them, sizeof(rtp->them));
1316 ast_log(LOG_NOTICE, "RTP Transmission error to %s:%d: %s\n", ast_inet_ntoa(iabuf, sizeof(iabuf), rtp->them.sin_addr), ntohs(rtp->them.sin_port), strerror(errno));
1317 if(rtp_debug_test_addr(&rtp->them))
1318 ast_verbose("Sent RTP packet to %s:%d (type %d, seq %d, ts %d, len %d)\n"
1319 , ast_inet_ntoa(iabuf, sizeof(iabuf), rtp->them.sin_addr), ntohs(rtp->them.sin_port), codec, rtp->seqno, rtp->lastts,res - hdrlen);
1327 int ast_rtp_write(struct ast_rtp *rtp, struct ast_frame *_f)
1329 struct ast_frame *f;
1335 /* If we have no peer, return immediately */
1336 if (!rtp->them.sin_addr.s_addr)
1339 /* If there is no data length, return immediately */
1343 /* Make sure we have enough space for RTP header */
1344 if ((_f->frametype != AST_FRAME_VOICE) && (_f->frametype != AST_FRAME_VIDEO)) {
1345 ast_log(LOG_WARNING, "RTP can only send voice\n");
1349 subclass = _f->subclass;
1350 if (_f->frametype == AST_FRAME_VIDEO)
1353 codec = ast_rtp_lookup_code(rtp, 1, subclass);
1355 ast_log(LOG_WARNING, "Don't know how to send format %s packets with RTP\n", ast_getformatname(_f->subclass));
1359 if (rtp->lasttxformat != subclass) {
1360 /* New format, reset the smoother */
1362 ast_log(LOG_DEBUG, "Ooh, format changed from %s to %s\n", ast_getformatname(rtp->lasttxformat), ast_getformatname(subclass));
1363 rtp->lasttxformat = subclass;
1365 ast_smoother_free(rtp->smoother);
1366 rtp->smoother = NULL;
1371 case AST_FORMAT_SLINEAR:
1372 if (!rtp->smoother) {
1373 rtp->smoother = ast_smoother_new(320);
1375 if (!rtp->smoother) {
1376 ast_log(LOG_WARNING, "Unable to create smoother :(\n");
1379 ast_smoother_feed_be(rtp->smoother, _f);
1381 while((f = ast_smoother_read(rtp->smoother)))
1382 ast_rtp_raw_write(rtp, f, codec);
1384 case AST_FORMAT_ULAW:
1385 case AST_FORMAT_ALAW:
1386 if (!rtp->smoother) {
1387 rtp->smoother = ast_smoother_new(160);
1389 if (!rtp->smoother) {
1390 ast_log(LOG_WARNING, "Unable to create smoother :(\n");
1393 ast_smoother_feed(rtp->smoother, _f);
1395 while((f = ast_smoother_read(rtp->smoother)))
1396 ast_rtp_raw_write(rtp, f, codec);
1398 case AST_FORMAT_ADPCM:
1399 case AST_FORMAT_G726:
1400 if (!rtp->smoother) {
1401 rtp->smoother = ast_smoother_new(80);
1403 if (!rtp->smoother) {
1404 ast_log(LOG_WARNING, "Unable to create smoother :(\n");
1407 ast_smoother_feed(rtp->smoother, _f);
1409 while((f = ast_smoother_read(rtp->smoother)))
1410 ast_rtp_raw_write(rtp, f, codec);
1412 case AST_FORMAT_G729A:
1413 if (!rtp->smoother) {
1414 rtp->smoother = ast_smoother_new(20);
1416 ast_smoother_set_flags(rtp->smoother, AST_SMOOTHER_FLAG_G729);
1418 if (!rtp->smoother) {
1419 ast_log(LOG_WARNING, "Unable to create g729 smoother :(\n");
1422 ast_smoother_feed(rtp->smoother, _f);
1424 while((f = ast_smoother_read(rtp->smoother)))
1425 ast_rtp_raw_write(rtp, f, codec);
1427 case AST_FORMAT_GSM:
1428 if (!rtp->smoother) {
1429 rtp->smoother = ast_smoother_new(33);
1431 if (!rtp->smoother) {
1432 ast_log(LOG_WARNING, "Unable to create GSM smoother :(\n");
1435 ast_smoother_feed(rtp->smoother, _f);
1436 while((f = ast_smoother_read(rtp->smoother)))
1437 ast_rtp_raw_write(rtp, f, codec);
1439 case AST_FORMAT_ILBC:
1440 if (!rtp->smoother) {
1441 rtp->smoother = ast_smoother_new(50);
1443 if (!rtp->smoother) {
1444 ast_log(LOG_WARNING, "Unable to create ILBC smoother :(\n");
1447 ast_smoother_feed(rtp->smoother, _f);
1448 while((f = ast_smoother_read(rtp->smoother)))
1449 ast_rtp_raw_write(rtp, f, codec);
1452 ast_log(LOG_WARNING, "Not sure about sending format %s packets\n", ast_getformatname(subclass));
1453 /* fall through to... */
1454 case AST_FORMAT_H261:
1455 case AST_FORMAT_H263:
1456 case AST_FORMAT_H263_PLUS:
1457 case AST_FORMAT_G723_1:
1458 case AST_FORMAT_LPC10:
1459 case AST_FORMAT_SPEEX:
1460 /* Don't buffer outgoing frames; send them one-per-packet: */
1461 if (_f->offset < hdrlen) {
1466 ast_rtp_raw_write(rtp, f, codec);
1472 void ast_rtp_proto_unregister(struct ast_rtp_protocol *proto)
1474 struct ast_rtp_protocol *cur, *prev;
1481 prev->next = proto->next;
1483 protos = proto->next;
1491 int ast_rtp_proto_register(struct ast_rtp_protocol *proto)
1493 struct ast_rtp_protocol *cur;
1496 if (cur->type == proto->type) {
1497 ast_log(LOG_WARNING, "Tried to register same protocol '%s' twice\n", cur->type);
1502 proto->next = protos;
1507 static struct ast_rtp_protocol *get_proto(struct ast_channel *chan)
1509 struct ast_rtp_protocol *cur;
1512 if (cur->type == chan->type) {
1520 int ast_rtp_bridge(struct ast_channel *c0, struct ast_channel *c1, int flags, struct ast_frame **fo, struct ast_channel **rc)
1522 struct ast_frame *f;
1523 struct ast_channel *who, *cs[3];
1524 struct ast_rtp *p0, *p1;
1525 struct ast_rtp *vp0, *vp1;
1526 struct ast_rtp_protocol *pr0, *pr1;
1527 struct sockaddr_in ac0, ac1;
1528 struct sockaddr_in vac0, vac1;
1529 struct sockaddr_in t0, t1;
1530 struct sockaddr_in vt0, vt1;
1531 char iabuf[INET_ADDRSTRLEN];
1535 int codec0,codec1, oldcodec0, oldcodec1;
1537 memset(&vt0, 0, sizeof(vt0));
1538 memset(&vt1, 0, sizeof(vt1));
1539 memset(&vac0, 0, sizeof(vac0));
1540 memset(&vac1, 0, sizeof(vac1));
1542 /* if need DTMF, cant native bridge */
1543 if (flags & (AST_BRIDGE_DTMF_CHANNEL_0 | AST_BRIDGE_DTMF_CHANNEL_1))
1545 ast_mutex_lock(&c0->lock);
1546 while(ast_mutex_trylock(&c1->lock)) {
1547 ast_mutex_unlock(&c0->lock);
1549 ast_mutex_lock(&c0->lock);
1551 pr0 = get_proto(c0);
1552 pr1 = get_proto(c1);
1554 ast_log(LOG_WARNING, "Can't find native functions for channel '%s'\n", c0->name);
1555 ast_mutex_unlock(&c0->lock);
1556 ast_mutex_unlock(&c1->lock);
1560 ast_log(LOG_WARNING, "Can't find native functions for channel '%s'\n", c1->name);
1561 ast_mutex_unlock(&c0->lock);
1562 ast_mutex_unlock(&c1->lock);
1565 pvt0 = c0->tech_pvt;
1566 pvt1 = c1->tech_pvt;
1567 p0 = pr0->get_rtp_info(c0);
1568 if (pr0->get_vrtp_info)
1569 vp0 = pr0->get_vrtp_info(c0);
1572 p1 = pr1->get_rtp_info(c1);
1573 if (pr1->get_vrtp_info)
1574 vp1 = pr1->get_vrtp_info(c1);
1578 /* Somebody doesn't want to play... */
1579 ast_mutex_unlock(&c0->lock);
1580 ast_mutex_unlock(&c1->lock);
1584 codec0 = pr0->get_codec(c0);
1588 codec1 = pr1->get_codec(c1);
1591 if (pr0->get_codec && pr1->get_codec) {
1592 /* Hey, we can't do reinvite if both parties speak diffrent codecs */
1593 if (!(codec0 & codec1)) {
1594 ast_log(LOG_WARNING, "codec0 = %d is not codec1 = %d, cannot native bridge.\n",codec0,codec1);
1595 ast_mutex_unlock(&c0->lock);
1596 ast_mutex_unlock(&c1->lock);
1600 if (pr0->set_rtp_peer(c0, p1, vp1, codec1))
1601 ast_log(LOG_WARNING, "Channel '%s' failed to talk to '%s'\n", c0->name, c1->name);
1603 /* Store RTP peer */
1604 ast_rtp_get_peer(p1, &ac1);
1606 ast_rtp_get_peer(vp1, &vac1);
1608 if (pr1->set_rtp_peer(c1, p0, vp0, codec0))
1609 ast_log(LOG_WARNING, "Channel '%s' failed to talk back to '%s'\n", c1->name, c0->name);
1611 /* Store RTP peer */
1612 ast_rtp_get_peer(p0, &ac0);
1614 ast_rtp_get_peer(vp0, &vac0);
1616 ast_mutex_unlock(&c0->lock);
1617 ast_mutex_unlock(&c1->lock);
1624 if ((c0->tech_pvt != pvt0) ||
1625 (c1->tech_pvt != pvt1) ||
1626 (c0->masq || c0->masqr || c1->masq || c1->masqr)) {
1627 ast_log(LOG_DEBUG, "Oooh, something is weird, backing out\n");
1628 if (c0->tech_pvt == pvt0) {
1629 if (pr0->set_rtp_peer(c0, NULL, NULL, 0))
1630 ast_log(LOG_WARNING, "Channel '%s' failed to revert\n", c0->name);
1632 if (c1->tech_pvt == pvt1) {
1633 if (pr1->set_rtp_peer(c1, NULL, NULL, 0))
1634 ast_log(LOG_WARNING, "Channel '%s' failed to revert back\n", c1->name);
1636 /* Tell it to try again later */
1640 ast_rtp_get_peer(p1, &t1);
1641 ast_rtp_get_peer(p0, &t0);
1643 codec0 = pr0->get_codec(c0);
1645 codec1 = pr1->get_codec(c1);
1647 ast_rtp_get_peer(vp1, &vt1);
1649 ast_rtp_get_peer(vp0, &vt0);
1650 if (inaddrcmp(&t1, &ac1) || (vp1 && inaddrcmp(&vt1, &vac1)) || (codec1 != oldcodec1)) {
1652 ast_log(LOG_DEBUG, "Oooh, '%s' changed end address to %s:%d (format %d)\n",
1653 c1->name, ast_inet_ntoa(iabuf, sizeof(iabuf), t1.sin_addr), ntohs(t1.sin_port), codec1);
1654 ast_log(LOG_DEBUG, "Oooh, '%s' changed end vaddress to %s:%d (format %d)\n",
1655 c1->name, ast_inet_ntoa(iabuf, sizeof(iabuf), vt1.sin_addr), ntohs(vt1.sin_port), codec1);
1656 ast_log(LOG_DEBUG, "Oooh, '%s' was %s:%d/(format %d)\n",
1657 c1->name, ast_inet_ntoa(iabuf, sizeof(iabuf), ac1.sin_addr), ntohs(ac1.sin_port), oldcodec1);
1658 ast_log(LOG_DEBUG, "Oooh, '%s' wasv %s:%d/(format %d)\n",
1659 c1->name, ast_inet_ntoa(iabuf, sizeof(iabuf), vac1.sin_addr), ntohs(vac1.sin_port), oldcodec1);
1661 if (pr0->set_rtp_peer(c0, t1.sin_addr.s_addr ? p1 : NULL, vt1.sin_addr.s_addr ? vp1 : NULL, codec1))
1662 ast_log(LOG_WARNING, "Channel '%s' failed to update to '%s'\n", c0->name, c1->name);
1663 memcpy(&ac1, &t1, sizeof(ac1));
1664 memcpy(&vac1, &vt1, sizeof(vac1));
1667 if (inaddrcmp(&t0, &ac0) || (vp0 && inaddrcmp(&vt0, &vac0))) {
1669 ast_log(LOG_DEBUG, "Oooh, '%s' changed end address to %s:%d (format %d)\n",
1670 c0->name, ast_inet_ntoa(iabuf, sizeof(iabuf), t0.sin_addr), ntohs(t0.sin_port), codec0);
1671 ast_log(LOG_DEBUG, "Oooh, '%s' was %s:%d/(format %d)\n",
1672 c0->name, ast_inet_ntoa(iabuf, sizeof(iabuf), ac0.sin_addr), ntohs(ac0.sin_port), oldcodec0);
1674 if (pr1->set_rtp_peer(c1, t0.sin_addr.s_addr ? p0 : NULL, vt0.sin_addr.s_addr ? vp0 : NULL, codec0))
1675 ast_log(LOG_WARNING, "Channel '%s' failed to update to '%s'\n", c1->name, c0->name);
1676 memcpy(&ac0, &t0, sizeof(ac0));
1677 memcpy(&vac0, &vt0, sizeof(vac0));
1680 who = ast_waitfor_n(cs, 2, &to);
1683 ast_log(LOG_DEBUG, "Ooh, empty read...\n");
1684 /* check for hagnup / whentohangup */
1685 if (ast_check_hangup(c0) || ast_check_hangup(c1))
1690 if (!f || ((f->frametype == AST_FRAME_DTMF) &&
1691 (((who == c0) && (flags & AST_BRIDGE_DTMF_CHANNEL_0)) ||
1692 ((who == c1) && (flags & AST_BRIDGE_DTMF_CHANNEL_1))))) {
1696 ast_log(LOG_DEBUG, "Oooh, got a %s\n", f ? "digit" : "hangup");
1697 if ((c0->tech_pvt == pvt0) && (!c0->_softhangup)) {
1698 if (pr0->set_rtp_peer(c0, NULL, NULL, 0))
1699 ast_log(LOG_WARNING, "Channel '%s' failed to revert\n", c0->name);
1701 if ((c1->tech_pvt == pvt1) && (!c1->_softhangup)) {
1702 if (pr1->set_rtp_peer(c1, NULL, NULL, 0))
1703 ast_log(LOG_WARNING, "Channel '%s' failed to revert back\n", c1->name);
1705 /* That's all we needed */
1708 if ((f->frametype == AST_FRAME_DTMF) ||
1709 (f->frametype == AST_FRAME_VOICE) ||
1710 (f->frametype == AST_FRAME_VIDEO)) {
1711 /* Forward voice or DTMF frames if they happen upon us */
1714 } else if (who == c1) {
1720 /* Swap priority not that it's a big deal at this point */
1729 static int rtp_do_debug_ip(int fd, int argc, char *argv[])
1732 struct ast_hostent ahp;
1733 char iabuf[INET_ADDRSTRLEN];
1738 return RESULT_SHOWUSAGE;
1740 p = strstr(arg, ":");
1746 hp = ast_gethostbyname(arg, &ahp);
1748 return RESULT_SHOWUSAGE;
1749 rtpdebugaddr.sin_family = AF_INET;
1750 memcpy(&rtpdebugaddr.sin_addr, hp->h_addr, sizeof(rtpdebugaddr.sin_addr));
1751 rtpdebugaddr.sin_port = htons(port);
1753 ast_cli(fd, "RTP Debugging Enabled for IP: %s\n", ast_inet_ntoa(iabuf, sizeof(iabuf), rtpdebugaddr.sin_addr));
1755 ast_cli(fd, "RTP Debugging Enabled for IP: %s:%d\n", ast_inet_ntoa(iabuf, sizeof(iabuf), rtpdebugaddr.sin_addr), port);
1757 return RESULT_SUCCESS;
1760 static int rtp_do_debug(int fd, int argc, char *argv[])
1764 return RESULT_SHOWUSAGE;
1765 return rtp_do_debug_ip(fd, argc, argv);
1768 memset(&rtpdebugaddr,0,sizeof(rtpdebugaddr));
1769 ast_cli(fd, "RTP Debugging Enabled\n");
1770 return RESULT_SUCCESS;
1773 static int rtp_no_debug(int fd, int argc, char *argv[])
1776 return RESULT_SHOWUSAGE;
1778 ast_cli(fd,"RTP Debugging Disabled\n");
1779 return RESULT_SUCCESS;
1782 static char debug_usage[] =
1783 "Usage: rtp debug [ip host[:port]]\n"
1784 " Enable dumping of all RTP packets to and from host.\n";
1786 static char no_debug_usage[] =
1787 "Usage: rtp no debug\n"
1788 " Disable all RTP debugging\n";
1790 static struct ast_cli_entry cli_debug_ip =
1791 {{ "rtp", "debug", "ip", NULL } , rtp_do_debug, "Enable RTP debugging on IP", debug_usage };
1793 static struct ast_cli_entry cli_debug =
1794 {{ "rtp", "debug", NULL } , rtp_do_debug, "Enable RTP debugging", debug_usage };
1796 static struct ast_cli_entry cli_no_debug =
1797 {{ "rtp", "no", "debug", NULL } , rtp_no_debug, "Disable RTP debugging", no_debug_usage };
1799 void ast_rtp_reload(void)
1801 struct ast_config *cfg;
1806 cfg = ast_config_load("rtp.conf");
1808 if ((s = ast_variable_retrieve(cfg, "general", "rtpstart"))) {
1810 if (rtpstart < 1024)
1812 if (rtpstart > 65535)
1815 if ((s = ast_variable_retrieve(cfg, "general", "rtpend"))) {
1822 if ((s = ast_variable_retrieve(cfg, "general", "rtpchecksums"))) {
1830 ast_log(LOG_WARNING, "Disabling RTP checksums is not supported on this operating system!\n");
1833 ast_config_destroy(cfg);
1835 if (rtpstart >= rtpend) {
1836 ast_log(LOG_WARNING, "Unreasonable values for RTP start in rtp.conf/end\n");
1840 if (option_verbose > 1)
1841 ast_verbose(VERBOSE_PREFIX_2 "RTP Allocating from port range %d -> %d\n", rtpstart, rtpend);
1845 void ast_rtp_init(void)
1847 ast_cli_register(&cli_debug);
1848 ast_cli_register(&cli_debug_ip);
1849 ast_cli_register(&cli_no_debug);