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-2004, 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/channel_pvt.h>
37 #include <asterisk/config.h>
38 #include <asterisk/lock.h>
39 #include <asterisk/utils.h>
40 #include <asterisk/cli.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 checksums = 1;
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 lastrxts;
80 unsigned int lastividtimestamp;
81 unsigned int lastovidtimestamp;
82 unsigned int lasteventseqn;
86 unsigned int dtmfduration;
89 struct sockaddr_in us;
90 struct sockaddr_in them;
91 struct timeval rxcore;
92 struct timeval txcore;
93 struct timeval dtmfmute;
94 struct ast_smoother *smoother;
97 unsigned short rxseqno;
98 struct sched_context *sched;
99 struct io_context *io;
101 ast_rtp_callback callback;
102 struct rtpPayloadType current_RTP_PT[MAX_RTP_PT];
103 int rtp_lookup_code_cache_isAstFormat; /* a cache for the result of rtp_lookup_code(): */
104 int rtp_lookup_code_cache_code;
105 int rtp_lookup_code_cache_result;
106 int rtp_offered_from_local;
107 struct ast_rtcp *rtcp;
112 struct sockaddr_in us;
113 struct sockaddr_in them;
116 static struct ast_rtp_protocol *protos = NULL;
118 int ast_rtp_fd(struct ast_rtp *rtp)
123 int ast_rtcp_fd(struct ast_rtp *rtp)
130 static int g723_len(unsigned char buf)
132 switch(buf & TYPE_MASK) {
146 ast_log(LOG_WARNING, "Badly encoded frame (%d)\n", buf & TYPE_MASK);
151 static int g723_samples(unsigned char *buf, int maxlen)
156 while(pos < maxlen) {
157 res = g723_len(buf[pos]);
166 void ast_rtp_set_data(struct ast_rtp *rtp, void *data)
171 void ast_rtp_set_callback(struct ast_rtp *rtp, ast_rtp_callback callback)
173 rtp->callback = callback;
176 void ast_rtp_setnat(struct ast_rtp *rtp, int nat)
181 static struct ast_frame *send_dtmf(struct ast_rtp *rtp)
184 static struct ast_frame null_frame = { AST_FRAME_NULL, };
185 char iabuf[INET_ADDRSTRLEN];
186 gettimeofday(&tv, NULL);
187 if ((tv.tv_sec < rtp->dtmfmute.tv_sec) ||
188 ((tv.tv_sec == rtp->dtmfmute.tv_sec) && (tv.tv_usec < rtp->dtmfmute.tv_usec))) {
190 ast_log(LOG_DEBUG, "Ignore potential DTMF echo from '%s'\n", ast_inet_ntoa(iabuf, sizeof(iabuf), rtp->them.sin_addr));
192 rtp->dtmfduration = 0;
196 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));
197 if (rtp->resp == 'X') {
198 rtp->f.frametype = AST_FRAME_CONTROL;
199 rtp->f.subclass = AST_CONTROL_FLASH;
201 rtp->f.frametype = AST_FRAME_DTMF;
202 rtp->f.subclass = rtp->resp;
209 rtp->dtmfduration = 0;
214 static inline int rtp_debug_test_addr(struct sockaddr_in *addr)
218 if (rtpdebugaddr.sin_addr.s_addr) {
219 if (((ntohs(rtpdebugaddr.sin_port) != 0)
220 && (rtpdebugaddr.sin_port != addr->sin_port))
221 || (rtpdebugaddr.sin_addr.s_addr != addr->sin_addr.s_addr))
227 static struct ast_frame *process_cisco_dtmf(struct ast_rtp *rtp, unsigned char *data, int len)
231 struct ast_frame *f = NULL;
232 event = ntohl(*((unsigned int *)(data)));
235 printf("Cisco Digit: %08x (len = %d)\n", event, len);
239 } else if (event < 11) {
241 } else if (event < 12) {
243 } else if (event < 16) {
244 resp = 'A' + (event - 12);
245 } else if (event < 17) {
248 if (rtp->resp && (rtp->resp != resp)) {
252 rtp->dtmfcount = dtmftimeout;
256 static struct ast_frame *process_rfc2833(struct ast_rtp *rtp, unsigned char *data, int len)
259 unsigned int event_end;
260 unsigned int duration;
262 struct ast_frame *f = NULL;
263 event = ntohl(*((unsigned int *)(data)));
265 event_end = ntohl(*((unsigned int *)(data)));
268 duration = ntohl(*((unsigned int *)(data)));
271 printf("Event: %08x (len = %d)\n", event, len);
275 } else if (event < 11) {
277 } else if (event < 12) {
279 } else if (event < 16) {
280 resp = 'A' + (event - 12);
281 } else if (event < 17) {
284 if (rtp->resp && (rtp->resp != resp)) {
287 else if(event_end & 0x80)
296 else if(rtp->dtmfduration && (duration < rtp->dtmfduration))
300 if (!(event_end & 0x80))
302 rtp->dtmfcount = dtmftimeout;
303 rtp->dtmfduration = duration;
307 static struct ast_frame *process_rfc3389(struct ast_rtp *rtp, unsigned char *data, int len)
309 struct ast_frame *f = NULL;
310 /* Convert comfort noise into audio with various codecs. Unfortunately this doesn't
311 totally help us out becuase we don't have an engine to keep it going and we are not
312 guaranteed to have it every 20ms or anything */
314 printf("RFC3389: %d bytes, level %d...\n", len, rtp->lastrxformat);
316 if (!(rtp->flags & FLAG_3389_WARNING)) {
317 ast_log(LOG_NOTICE, "RFC3389 support incomplete. Turn off on client if possible\n");
318 rtp->flags |= FLAG_3389_WARNING;
320 /* Must have at least one byte */
324 rtp->f.data = rtp->rawdata + AST_FRIENDLY_OFFSET;
325 rtp->f.datalen = len - 1;
326 rtp->f.offset = AST_FRIENDLY_OFFSET;
327 memcpy(rtp->f.data, data + 1, len - 1);
333 rtp->f.frametype = AST_FRAME_CNG;
334 rtp->f.subclass = data[0] & 0x7f;
335 rtp->f.datalen = len - 1;
337 rtp->f.delivery.tv_usec = rtp->f.delivery.tv_sec = 0;
342 static int rtpread(int *id, int fd, short events, void *cbdata)
344 struct ast_rtp *rtp = cbdata;
346 f = ast_rtp_read(rtp);
349 rtp->callback(rtp, f, rtp->data);
354 struct ast_frame *ast_rtcp_read(struct ast_rtp *rtp)
356 static struct ast_frame null_frame = { AST_FRAME_NULL, };
360 struct sockaddr_in sin;
361 unsigned int rtcpdata[1024];
362 char iabuf[INET_ADDRSTRLEN];
369 res = recvfrom(rtp->rtcp->s, rtcpdata, sizeof(rtcpdata),
370 0, (struct sockaddr *)&sin, &len);
374 ast_log(LOG_NOTICE, "RTP: Received packet with bad UDP checksum\n");
376 ast_log(LOG_WARNING, "RTP Read error: %s\n", strerror(errno));
383 ast_log(LOG_WARNING, "RTP Read too short\n");
388 /* Send to whoever sent to us */
389 if ((rtp->rtcp->them.sin_addr.s_addr != sin.sin_addr.s_addr) ||
390 (rtp->rtcp->them.sin_port != sin.sin_port)) {
391 memcpy(&rtp->them, &sin, sizeof(rtp->them));
394 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));
398 ast_log(LOG_DEBUG, "Got RTCP report of %d bytes\n", res);
402 static void calc_rxstamp(struct timeval *tv, struct ast_rtp *rtp, unsigned int timestamp, int mark)
404 if ((!rtp->rxcore.tv_sec && !rtp->rxcore.tv_usec) || mark) {
405 gettimeofday(&rtp->rxcore, NULL);
406 rtp->rxcore.tv_sec -= timestamp / 8000;
407 rtp->rxcore.tv_usec -= (timestamp % 8000) * 125;
408 /* Round to 20ms for nice, pretty timestamps */
409 rtp->rxcore.tv_usec -= rtp->rxcore.tv_usec % 20000;
410 if (rtp->rxcore.tv_usec < 0) {
411 /* Adjust appropriately if necessary */
412 rtp->rxcore.tv_usec += 1000000;
413 rtp->rxcore.tv_sec -= 1;
416 tv->tv_sec = rtp->rxcore.tv_sec + timestamp / 8000;
417 tv->tv_usec = rtp->rxcore.tv_usec + (timestamp % 8000) * 125;
418 if (tv->tv_usec >= 1000000) {
419 tv->tv_usec -= 1000000;
424 struct ast_frame *ast_rtp_read(struct ast_rtp *rtp)
427 struct sockaddr_in sin;
435 char iabuf[INET_ADDRSTRLEN];
436 unsigned int timestamp;
437 unsigned int *rtpheader;
438 static struct ast_frame *f, null_frame = { AST_FRAME_NULL, };
439 struct rtpPayloadType rtpPT;
443 /* Cache where the header will go */
444 res = recvfrom(rtp->s, rtp->rawdata + AST_FRIENDLY_OFFSET, sizeof(rtp->rawdata) - AST_FRIENDLY_OFFSET,
445 0, (struct sockaddr *)&sin, &len);
448 rtpheader = (unsigned int *)(rtp->rawdata + AST_FRIENDLY_OFFSET);
451 ast_log(LOG_NOTICE, "RTP: Received packet with bad UDP checksum\n");
453 ast_log(LOG_WARNING, "RTP Read error: %s\n", strerror(errno));
459 ast_log(LOG_WARNING, "RTP Read too short\n");
463 /* Ignore if the other side hasn't been given an address
465 if (!rtp->them.sin_addr.s_addr || !rtp->them.sin_port)
469 /* Send to whoever sent to us */
470 if ((rtp->them.sin_addr.s_addr != sin.sin_addr.s_addr) ||
471 (rtp->them.sin_port != sin.sin_port)) {
472 memcpy(&rtp->them, &sin, sizeof(rtp->them));
474 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));
479 seqno = ntohl(rtpheader[0]);
480 payloadtype = (seqno & 0x7f0000) >> 16;
481 mark = seqno & (1 << 23);
482 ext = seqno & (1 << 28);
484 timestamp = ntohl(rtpheader[1]);
486 /* RTP Extension present */
488 hdrlen += (ntohl(rtpheader[3]) & 0xffff) << 2;
492 ast_log(LOG_WARNING, "RTP Read too short (%d, expecting %d)\n", res, hdrlen);
496 if(rtp_debug_test_addr(&sin))
497 ast_verbose("Got RTP packet from %s:%d (type %d, seq %d, ts %d, len %d)\n"
498 , ast_inet_ntoa(iabuf, sizeof(iabuf), sin.sin_addr), ntohs(sin.sin_port), payloadtype, seqno, timestamp,res - hdrlen);
500 rtpPT = ast_rtp_lookup_pt(rtp, payloadtype);
501 if (!rtpPT.isAstFormat) {
502 /* This is special in-band data that's not one of our codecs */
503 if (rtpPT.code == AST_RTP_DTMF) {
504 /* It's special -- rfc2833 process it */
505 if (rtp->lasteventseqn <= seqno || rtp->resp == 0 || (rtp->lasteventseqn >= 65530 && seqno <= 6)) {
506 f = process_rfc2833(rtp, rtp->rawdata + AST_FRIENDLY_OFFSET + hdrlen, res - hdrlen);
507 rtp->lasteventseqn = seqno;
514 } else if (rtpPT.code == AST_RTP_CISCO_DTMF) {
515 /* It's really special -- process it the Cisco way */
516 if (rtp->lasteventseqn <= seqno || rtp->resp == 0 || (rtp->lasteventseqn >= 65530 && seqno <= 6)) {
517 f = process_cisco_dtmf(rtp, rtp->rawdata + AST_FRIENDLY_OFFSET + hdrlen, res - hdrlen);
518 rtp->lasteventseqn = seqno;
525 } else if (rtpPT.code == AST_RTP_CN) {
527 f = process_rfc3389(rtp, rtp->rawdata + AST_FRIENDLY_OFFSET + hdrlen, res - hdrlen);
533 ast_log(LOG_NOTICE, "Unknown RTP codec %d received\n", payloadtype);
537 rtp->f.subclass = rtpPT.code;
538 if (rtp->f.subclass < AST_FORMAT_MAX_AUDIO)
539 rtp->f.frametype = AST_FRAME_VOICE;
541 rtp->f.frametype = AST_FRAME_VIDEO;
542 rtp->lastrxformat = rtp->f.subclass;
545 rtp->lastrxts = timestamp;
548 for (x=rtp->rxseqno + 1; x < seqno; x++) {
549 /* Queue empty frames */
555 rtp->f.src = "RTPMissedFrame";
558 rtp->rxseqno = seqno;
560 if (rtp->dtmfcount) {
562 printf("dtmfcount was %d\n", rtp->dtmfcount);
564 rtp->dtmfcount -= (timestamp - rtp->lastrxts);
565 if (rtp->dtmfcount < 0)
568 if (dtmftimeout != rtp->dtmfcount)
569 printf("dtmfcount is %d\n", rtp->dtmfcount);
572 rtp->lastrxts = timestamp;
574 /* Send any pending DTMF */
575 if (rtp->resp && !rtp->dtmfcount) {
577 ast_log(LOG_DEBUG, "Sending pending DTMF\n");
578 return send_dtmf(rtp);
581 rtp->f.datalen = res - hdrlen;
582 rtp->f.data = rtp->rawdata + hdrlen + AST_FRIENDLY_OFFSET;
583 rtp->f.offset = hdrlen + AST_FRIENDLY_OFFSET;
584 if (rtp->f.subclass < AST_FORMAT_MAX_AUDIO) {
585 switch(rtp->f.subclass) {
586 case AST_FORMAT_ULAW:
587 case AST_FORMAT_ALAW:
588 rtp->f.samples = rtp->f.datalen;
590 case AST_FORMAT_SLINEAR:
591 rtp->f.samples = rtp->f.datalen / 2;
594 rtp->f.samples = 160 * (rtp->f.datalen / 33);
596 case AST_FORMAT_ILBC:
597 rtp->f.samples = 240 * (rtp->f.datalen / 50);
599 case AST_FORMAT_ADPCM:
600 case AST_FORMAT_G726:
601 rtp->f.samples = rtp->f.datalen * 2;
603 case AST_FORMAT_G729A:
604 rtp->f.samples = rtp->f.datalen * 8;
606 case AST_FORMAT_G723_1:
607 rtp->f.samples = g723_samples(rtp->f.data, rtp->f.datalen);
609 case AST_FORMAT_SPEEX:
610 /* assumes that the RTP packet contained one Speex frame */
611 rtp->f.samples = 160;
613 case AST_FORMAT_LPC10:
614 rtp->f.samples = 22 * 8;
615 rtp->f.samples += (((char *)(rtp->f.data))[7] & 0x1) * 8;
618 ast_log(LOG_NOTICE, "Unable to calculate samples for format %s\n", ast_getformatname(rtp->f.subclass));
621 calc_rxstamp(&rtp->f.delivery, rtp, timestamp, mark);
623 /* Video -- samples is # of samples vs. 90000 */
624 if (!rtp->lastividtimestamp)
625 rtp->lastividtimestamp = timestamp;
626 rtp->f.samples = timestamp - rtp->lastividtimestamp;
627 rtp->lastividtimestamp = timestamp;
628 rtp->f.delivery.tv_sec = 0;
629 rtp->f.delivery.tv_usec = 0;
631 rtp->f.subclass |= 0x1;
638 /* The following array defines the MIME Media type (and subtype) for each
639 of our codecs, or RTP-specific data type. */
641 struct rtpPayloadType payloadType;
645 {{1, AST_FORMAT_G723_1}, "audio", "G723"},
646 {{1, AST_FORMAT_GSM}, "audio", "GSM"},
647 {{1, AST_FORMAT_ULAW}, "audio", "PCMU"},
648 {{1, AST_FORMAT_ALAW}, "audio", "PCMA"},
649 {{1, AST_FORMAT_G726}, "audio", "G726-32"},
650 {{1, AST_FORMAT_ADPCM}, "audio", "DVI4"},
651 {{1, AST_FORMAT_SLINEAR}, "audio", "L16"},
652 {{1, AST_FORMAT_LPC10}, "audio", "LPC"},
653 {{1, AST_FORMAT_G729A}, "audio", "G729"},
654 {{1, AST_FORMAT_SPEEX}, "audio", "speex"},
655 {{1, AST_FORMAT_ILBC}, "audio", "iLBC"},
656 {{0, AST_RTP_DTMF}, "audio", "telephone-event"},
657 {{0, AST_RTP_CISCO_DTMF}, "audio", "cisco-telephone-event"},
658 {{0, AST_RTP_CN}, "audio", "CN"},
659 {{1, AST_FORMAT_JPEG}, "video", "JPEG"},
660 {{1, AST_FORMAT_PNG}, "video", "PNG"},
661 {{1, AST_FORMAT_H261}, "video", "H261"},
662 {{1, AST_FORMAT_H263}, "video", "H263"},
665 /* Static (i.e., well-known) RTP payload types for our "AST_FORMAT..."s:
666 also, our own choices for dynamic payload types. This is our master
667 table for transmission */
668 static struct rtpPayloadType static_RTP_PT[MAX_RTP_PT] = {
669 [0] = {1, AST_FORMAT_ULAW},
670 [2] = {1, AST_FORMAT_G726}, /* Technically this is G.721, but if Cisco can do it, so can we... */
671 [3] = {1, AST_FORMAT_GSM},
672 [4] = {1, AST_FORMAT_G723_1},
673 [5] = {1, AST_FORMAT_ADPCM}, /* 8 kHz */
674 [6] = {1, AST_FORMAT_ADPCM}, /* 16 kHz */
675 [7] = {1, AST_FORMAT_LPC10},
676 [8] = {1, AST_FORMAT_ALAW},
677 [10] = {1, AST_FORMAT_SLINEAR}, /* 2 channels */
678 [11] = {1, AST_FORMAT_SLINEAR}, /* 1 channel */
679 [13] = {0, AST_RTP_CN},
680 [16] = {1, AST_FORMAT_ADPCM}, /* 11.025 kHz */
681 [17] = {1, AST_FORMAT_ADPCM}, /* 22.050 kHz */
682 [18] = {1, AST_FORMAT_G729A},
683 [19] = {0, AST_RTP_CN}, /* Also used for CN */
684 [26] = {1, AST_FORMAT_JPEG},
685 [31] = {1, AST_FORMAT_H261},
686 [34] = {1, AST_FORMAT_H263},
687 [97] = {1, AST_FORMAT_ILBC},
688 [101] = {0, AST_RTP_DTMF},
689 [110] = {1, AST_FORMAT_SPEEX},
690 [121] = {0, AST_RTP_CISCO_DTMF}, /* Must be type 121 */
693 void ast_rtp_pt_clear(struct ast_rtp* rtp)
697 for (i = 0; i < MAX_RTP_PT; ++i) {
698 rtp->current_RTP_PT[i].isAstFormat = 0;
699 rtp->current_RTP_PT[i].code = 0;
702 rtp->rtp_lookup_code_cache_isAstFormat = 0;
703 rtp->rtp_lookup_code_cache_code = 0;
704 rtp->rtp_lookup_code_cache_result = 0;
707 void ast_rtp_pt_default(struct ast_rtp* rtp)
711 /* Initialize to default payload types */
712 for (i = 0; i < MAX_RTP_PT; ++i) {
713 rtp->current_RTP_PT[i].isAstFormat = static_RTP_PT[i].isAstFormat;
714 rtp->current_RTP_PT[i].code = static_RTP_PT[i].code;
717 rtp->rtp_lookup_code_cache_isAstFormat = 0;
718 rtp->rtp_lookup_code_cache_code = 0;
719 rtp->rtp_lookup_code_cache_result = 0;
722 /* Make a note of a RTP payload type that was seen in a SDP "m=" line. */
723 /* By default, use the well-known value for this type (although it may */
724 /* still be set to a different value by a subsequent "a=rtpmap:" line): */
725 void ast_rtp_set_m_type(struct ast_rtp* rtp, int pt) {
726 if (pt < 0 || pt > MAX_RTP_PT)
727 return; /* bogus payload type */
729 if (static_RTP_PT[pt].code != 0) {
730 rtp->current_RTP_PT[pt] = static_RTP_PT[pt];
734 /* Make a note of a RTP payload type (with MIME type) that was seen in */
735 /* a SDP "a=rtpmap:" line. */
736 void ast_rtp_set_rtpmap_type(struct ast_rtp* rtp, int pt,
737 char* mimeType, char* mimeSubtype) {
740 if (pt < 0 || pt > MAX_RTP_PT)
741 return; /* bogus payload type */
743 for (i = 0; i < sizeof mimeTypes/sizeof mimeTypes[0]; ++i) {
744 if (strcasecmp(mimeSubtype, mimeTypes[i].subtype) == 0 &&
745 strcasecmp(mimeType, mimeTypes[i].type) == 0) {
746 rtp->current_RTP_PT[pt] = mimeTypes[i].payloadType;
752 /* Return the union of all of the codecs that were set by rtp_set...() calls */
753 /* They're returned as two distinct sets: AST_FORMATs, and AST_RTPs */
754 void ast_rtp_get_current_formats(struct ast_rtp* rtp,
755 int* astFormats, int* nonAstFormats) {
758 *astFormats = *nonAstFormats = 0;
759 for (pt = 0; pt < MAX_RTP_PT; ++pt) {
760 if (rtp->current_RTP_PT[pt].isAstFormat) {
761 *astFormats |= rtp->current_RTP_PT[pt].code;
763 *nonAstFormats |= rtp->current_RTP_PT[pt].code;
768 void ast_rtp_offered_from_local(struct ast_rtp* rtp, int local) {
770 rtp->rtp_offered_from_local = local;
772 ast_log(LOG_WARNING, "rtp structure is null\n");
775 struct rtpPayloadType ast_rtp_lookup_pt(struct ast_rtp* rtp, int pt)
777 struct rtpPayloadType result;
779 result.isAstFormat = result.code = 0;
780 if (pt < 0 || pt > MAX_RTP_PT)
781 return result; /* bogus payload type */
783 /* Start with the negotiated codecs */
784 if (!rtp->rtp_offered_from_local)
785 result = rtp->current_RTP_PT[pt];
787 /* If it doesn't exist, check our static RTP type list, just in case */
789 result = static_RTP_PT[pt];
793 /* Looks up an RTP code out of our *static* outbound list */
794 int ast_rtp_lookup_code(struct ast_rtp* rtp, int isAstFormat, int code) {
798 if (isAstFormat == rtp->rtp_lookup_code_cache_isAstFormat &&
799 code == rtp->rtp_lookup_code_cache_code) {
801 /* Use our cached mapping, to avoid the overhead of the loop below */
802 return rtp->rtp_lookup_code_cache_result;
805 /* Check the dynamic list first */
806 for (pt = 0; pt < MAX_RTP_PT; ++pt) {
807 if (rtp->current_RTP_PT[pt].code == code && rtp->current_RTP_PT[pt].isAstFormat == isAstFormat) {
808 rtp->rtp_lookup_code_cache_isAstFormat = isAstFormat;
809 rtp->rtp_lookup_code_cache_code = code;
810 rtp->rtp_lookup_code_cache_result = pt;
815 /* Then the static list */
816 for (pt = 0; pt < MAX_RTP_PT; ++pt) {
817 if (static_RTP_PT[pt].code == code && static_RTP_PT[pt].isAstFormat == isAstFormat) {
818 rtp->rtp_lookup_code_cache_isAstFormat = isAstFormat;
819 rtp->rtp_lookup_code_cache_code = code;
820 rtp->rtp_lookup_code_cache_result = pt;
827 char* ast_rtp_lookup_mime_subtype(int isAstFormat, int code) {
831 for (i = 0; i < sizeof mimeTypes/sizeof mimeTypes[0]; ++i) {
832 if (mimeTypes[i].payloadType.code == code && mimeTypes[i].payloadType.isAstFormat == isAstFormat) {
833 return mimeTypes[i].subtype;
839 static int rtp_socket(void)
843 s = socket(AF_INET, SOCK_DGRAM, 0);
845 flags = fcntl(s, F_GETFL);
846 fcntl(s, F_SETFL, flags | O_NONBLOCK);
849 setsockopt(s, SOL_SOCKET, SO_NO_CHECK, &checksums, sizeof(checksums));
856 static struct ast_rtcp *ast_rtcp_new(void)
858 struct ast_rtcp *rtcp;
859 rtcp = malloc(sizeof(struct ast_rtcp));
862 memset(rtcp, 0, sizeof(struct ast_rtcp));
863 rtcp->s = rtp_socket();
864 rtcp->us.sin_family = AF_INET;
867 ast_log(LOG_WARNING, "Unable to allocate socket: %s\n", strerror(errno));
873 struct ast_rtp *ast_rtp_new_with_bindaddr(struct sched_context *sched, struct io_context *io, int rtcpenable, int callbackmode, struct in_addr addr)
879 rtp = malloc(sizeof(struct ast_rtp));
882 memset(rtp, 0, sizeof(struct ast_rtp));
883 rtp->them.sin_family = AF_INET;
884 rtp->us.sin_family = AF_INET;
885 rtp->s = rtp_socket();
887 rtp->seqno = rand() & 0xffff;
890 ast_log(LOG_ERROR, "Unable to allocate socket: %s\n", strerror(errno));
893 if (sched && rtcpenable) {
895 rtp->rtcp = ast_rtcp_new();
897 /* Find us a place */
898 x = (rand() % (rtpend-rtpstart)) + rtpstart;
902 /* Must be an even port number by RTP spec */
903 rtp->us.sin_port = htons(x);
904 rtp->us.sin_addr = addr;
906 rtp->rtcp->us.sin_port = htons(x + 1);
907 if (!(first = bind(rtp->s, (struct sockaddr *)&rtp->us, sizeof(rtp->us))) &&
908 (!rtp->rtcp || !bind(rtp->rtcp->s, (struct sockaddr *)&rtp->rtcp->us, sizeof(rtp->rtcp->us))))
911 /* Primary bind succeeded! Gotta recreate it */
913 rtp->s = rtp_socket();
915 if (errno != EADDRINUSE) {
916 ast_log(LOG_ERROR, "Unexpected bind error: %s\n", strerror(errno));
927 x = (rtpstart + 1) & ~1;
928 if (x == startplace) {
929 ast_log(LOG_ERROR, "No RTP ports remaining\n");
939 if (io && sched && callbackmode) {
940 /* Operate this one in a callback mode */
943 rtp->ioid = ast_io_add(rtp->io, rtp->s, rtpread, AST_IO_IN, rtp);
945 ast_rtp_pt_default(rtp);
949 struct ast_rtp *ast_rtp_new(struct sched_context *sched, struct io_context *io, int rtcpenable, int callbackmode)
953 memset(&ia, 0, sizeof(ia));
954 return ast_rtp_new_with_bindaddr(sched, io, rtcpenable, callbackmode, ia);
957 int ast_rtp_settos(struct ast_rtp *rtp, int tos)
961 if ((res = setsockopt(rtp->s, IPPROTO_IP, IP_TOS, &tos, sizeof(tos))))
962 ast_log(LOG_WARNING, "Unable to set TOS to %d\n", tos);
966 void ast_rtp_set_peer(struct ast_rtp *rtp, struct sockaddr_in *them)
968 rtp->them.sin_port = them->sin_port;
969 rtp->them.sin_addr = them->sin_addr;
971 rtp->rtcp->them.sin_port = htons(ntohs(them->sin_port) + 1);
972 rtp->rtcp->them.sin_addr = them->sin_addr;
977 void ast_rtp_get_peer(struct ast_rtp *rtp, struct sockaddr_in *them)
979 them->sin_family = AF_INET;
980 them->sin_port = rtp->them.sin_port;
981 them->sin_addr = rtp->them.sin_addr;
984 void ast_rtp_get_us(struct ast_rtp *rtp, struct sockaddr_in *us)
986 memcpy(us, &rtp->us, sizeof(rtp->us));
989 void ast_rtp_stop(struct ast_rtp *rtp)
991 memset(&rtp->them.sin_addr, 0, sizeof(rtp->them.sin_addr));
992 memset(&rtp->them.sin_port, 0, sizeof(rtp->them.sin_port));
994 memset(&rtp->rtcp->them.sin_addr, 0, sizeof(rtp->them.sin_addr));
995 memset(&rtp->rtcp->them.sin_port, 0, sizeof(rtp->them.sin_port));
999 void ast_rtp_reset(struct ast_rtp *rtp)
1001 memset(&rtp->rxcore, 0, sizeof(rtp->rxcore));
1002 memset(&rtp->txcore, 0, sizeof(rtp->txcore));
1003 memset(&rtp->dtmfmute, 0, sizeof(rtp->dtmfmute));
1006 rtp->lastividtimestamp = 0;
1007 rtp->lastovidtimestamp = 0;
1008 rtp->lasteventseqn = 0;
1009 rtp->lasttxformat = 0;
1010 rtp->lastrxformat = 0;
1012 rtp->dtmfduration = 0;
1017 void ast_rtp_destroy(struct ast_rtp *rtp)
1020 ast_smoother_free(rtp->smoother);
1022 ast_io_remove(rtp->io, rtp->ioid);
1026 close(rtp->rtcp->s);
1032 static unsigned int calc_txstamp(struct ast_rtp *rtp, struct timeval *delivery)
1036 if (!rtp->txcore.tv_sec && !rtp->txcore.tv_usec) {
1037 gettimeofday(&rtp->txcore, NULL);
1038 /* Round to 20ms for nice, pretty timestamps */
1039 rtp->txcore.tv_usec -= rtp->txcore.tv_usec % 20000;
1041 if (delivery && (delivery->tv_sec || delivery->tv_usec)) {
1042 /* Use previous txcore */
1043 ms = (delivery->tv_sec - rtp->txcore.tv_sec) * 1000;
1044 ms += (1000000 + delivery->tv_usec - rtp->txcore.tv_usec) / 1000 - 1000;
1045 rtp->txcore.tv_sec = delivery->tv_sec;
1046 rtp->txcore.tv_usec = delivery->tv_usec;
1048 gettimeofday(&now, NULL);
1049 ms = (now.tv_sec - rtp->txcore.tv_sec) * 1000;
1050 ms += (1000000 + now.tv_usec - rtp->txcore.tv_usec) / 1000 - 1000;
1051 /* Use what we just got for next time */
1052 rtp->txcore.tv_sec = now.tv_sec;
1053 rtp->txcore.tv_usec = now.tv_usec;
1058 int ast_rtp_senddigit(struct ast_rtp *rtp, char digit)
1060 unsigned int *rtpheader;
1066 char iabuf[INET_ADDRSTRLEN];
1068 if ((digit <= '9') && (digit >= '0'))
1070 else if (digit == '*')
1072 else if (digit == '#')
1074 else if ((digit >= 'A') && (digit <= 'D'))
1075 digit = digit - 'A' + 12;
1076 else if ((digit >= 'a') && (digit <= 'd'))
1077 digit = digit - 'a' + 12;
1079 ast_log(LOG_WARNING, "Don't know how to represent '%c'\n", digit);
1082 payload = ast_rtp_lookup_code(rtp, 0, AST_RTP_DTMF);
1084 /* If we have no peer, return immediately */
1085 if (!rtp->them.sin_addr.s_addr)
1088 gettimeofday(&rtp->dtmfmute, NULL);
1089 rtp->dtmfmute.tv_usec += (500 * 1000);
1090 if (rtp->dtmfmute.tv_usec > 1000000) {
1091 rtp->dtmfmute.tv_usec -= 1000000;
1092 rtp->dtmfmute.tv_sec += 1;
1095 /* Get a pointer to the header */
1096 rtpheader = (unsigned int *)data;
1097 rtpheader[0] = htonl((2 << 30) | (1 << 23) | (payload << 16) | (rtp->seqno++));
1098 rtpheader[1] = htonl(rtp->lastts);
1099 rtpheader[2] = htonl(rtp->ssrc);
1100 rtpheader[3] = htonl((digit << 24) | (0xa << 16) | (0));
1102 if (rtp->them.sin_port && rtp->them.sin_addr.s_addr) {
1103 res = sendto(rtp->s, (void *)rtpheader, hdrlen + 4, 0, (struct sockaddr *)&rtp->them, sizeof(rtp->them));
1105 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));
1106 if(rtp_debug_test_addr(&rtp->them))
1107 ast_verbose("Sent RTP packet to %s:%d (type %d, seq %d, ts %d, len %d)\n"
1108 , ast_inet_ntoa(iabuf, sizeof(iabuf), rtp->them.sin_addr), ntohs(rtp->them.sin_port), payload, rtp->seqno, rtp->lastts,res - hdrlen);
1112 /* Clear marker bit and increment seqno */
1113 rtpheader[0] = htonl((2 << 30) | (payload << 16) | (rtp->seqno++));
1114 /* Make duration 800 (100ms) */
1115 rtpheader[3] |= htonl((800));
1116 /* Set the End bit for the last 3 */
1117 rtpheader[3] |= htonl((1 << 23));
1118 } else if ( x < 3) {
1119 rtpheader[0] = htonl((2 << 30) | (payload << 16) | (rtp->seqno++));
1126 static void put_uint32(unsigned char *buf, int i)
1128 unsigned char *c = (unsigned char *)&i;
1130 buf[0] = (i>>24) & 0xff;
1131 buf[1] = (i>>16) & 0xff;
1132 buf[2] = (i>>8) & 0xff;
1136 #define put_uint32(p,v) ((*((unsigned int *)(p))) = (v))
1139 static int ast_rtp_raw_write(struct ast_rtp *rtp, struct ast_frame *f, int codec)
1141 unsigned char *rtpheader;
1142 char iabuf[INET_ADDRSTRLEN];
1149 ms = calc_txstamp(rtp, &f->delivery);
1150 /* Default prediction */
1151 if (f->subclass < AST_FORMAT_MAX_AUDIO) {
1152 pred = rtp->lastts + ms * 8;
1154 switch(f->subclass) {
1155 case AST_FORMAT_ULAW:
1156 case AST_FORMAT_ALAW:
1157 /* If we're within +/- 20ms from when where we
1158 predict we should be, use that */
1159 pred = rtp->lastts + f->datalen;
1161 case AST_FORMAT_ADPCM:
1162 case AST_FORMAT_G726:
1163 /* If we're within +/- 20ms from when where we
1164 predict we should be, use that */
1165 pred = rtp->lastts + f->datalen * 2;
1167 case AST_FORMAT_G729A:
1168 pred = rtp->lastts + f->datalen * 8;
1170 case AST_FORMAT_GSM:
1171 pred = rtp->lastts + (f->datalen * 160 / 33);
1173 case AST_FORMAT_ILBC:
1174 pred = rtp->lastts + (f->datalen * 240 / 50);
1176 case AST_FORMAT_G723_1:
1177 pred = rtp->lastts + g723_samples(f->data, f->datalen);
1179 case AST_FORMAT_SPEEX:
1180 pred = rtp->lastts + 160;
1181 /* assumes that the RTP packet contains one Speex frame */
1183 case AST_FORMAT_LPC10:
1184 /* assumes that the RTP packet contains one LPC10 frame */
1185 pred = rtp->lastts + 22 * 8;
1186 pred += (((char *)(f->data))[7] & 0x1) * 8;
1189 ast_log(LOG_WARNING, "Not sure about timestamp format for codec format %s\n", ast_getformatname(f->subclass));
1191 /* Re-calculate last TS */
1192 rtp->lastts = rtp->lastts + ms * 8;
1193 if (!f->delivery.tv_sec && !f->delivery.tv_usec) {
1194 /* If this isn't an absolute delivery time, Check if it is close to our prediction,
1195 and if so, go with our prediction */
1196 if (abs(rtp->lastts - pred) < MAX_TIMESTAMP_SKEW)
1199 if (option_debug > 2)
1200 ast_log(LOG_DEBUG, "Difference is %d, ms is %d\n", abs(rtp->lastts - pred), ms);
1205 mark = f->subclass & 0x1;
1206 pred = rtp->lastovidtimestamp + f->samples;
1207 /* Re-calculate last TS */
1208 rtp->lastts = rtp->lastts + ms * 90;
1209 /* If it's close to our prediction, go for it */
1210 if (!f->delivery.tv_sec && !f->delivery.tv_usec) {
1211 if (abs(rtp->lastts - pred) < 7200) {
1213 rtp->lastovidtimestamp += f->samples;
1215 if (option_debug > 2)
1216 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);
1217 rtp->lastovidtimestamp = rtp->lastts;
1221 /* Get a pointer to the header */
1222 rtpheader = (unsigned char *)(f->data - hdrlen);
1224 put_uint32(rtpheader, htonl((2 << 30) | (codec << 16) | (rtp->seqno) | (mark << 23)));
1225 put_uint32(rtpheader + 4, htonl(rtp->lastts));
1226 put_uint32(rtpheader + 8, htonl(rtp->ssrc));
1230 if (rtp->them.sin_port && rtp->them.sin_addr.s_addr) {
1231 res = sendto(rtp->s, (void *)rtpheader, f->datalen + hdrlen, 0, (struct sockaddr *)&rtp->them, sizeof(rtp->them));
1233 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));
1234 if(rtp_debug_test_addr(&rtp->them))
1235 ast_verbose("Sent RTP packet to %s:%d (type %d, seq %d, ts %d, len %d)\n"
1236 , ast_inet_ntoa(iabuf, sizeof(iabuf), rtp->them.sin_addr), ntohs(rtp->them.sin_port), codec, rtp->seqno, rtp->lastts,res - hdrlen);
1241 int ast_rtp_write(struct ast_rtp *rtp, struct ast_frame *_f)
1243 struct ast_frame *f;
1249 /* If we have no peer, return immediately */
1250 if (!rtp->them.sin_addr.s_addr)
1253 /* If there is no data length, return immediately */
1257 /* Make sure we have enough space for RTP header */
1258 if ((_f->frametype != AST_FRAME_VOICE) && (_f->frametype != AST_FRAME_VIDEO)) {
1259 ast_log(LOG_WARNING, "RTP can only send voice\n");
1263 subclass = _f->subclass;
1264 if (_f->frametype == AST_FRAME_VIDEO)
1267 codec = ast_rtp_lookup_code(rtp, 1, subclass);
1269 ast_log(LOG_WARNING, "Don't know how to send format %s packets with RTP\n", ast_getformatname(_f->subclass));
1273 if (rtp->lasttxformat != subclass) {
1274 /* New format, reset the smoother */
1276 ast_log(LOG_DEBUG, "Ooh, format changed from %s to %s\n", ast_getformatname(rtp->lasttxformat), ast_getformatname(subclass));
1277 rtp->lasttxformat = subclass;
1279 ast_smoother_free(rtp->smoother);
1280 rtp->smoother = NULL;
1285 case AST_FORMAT_ULAW:
1286 case AST_FORMAT_ALAW:
1287 if (!rtp->smoother) {
1288 rtp->smoother = ast_smoother_new(160);
1290 if (!rtp->smoother) {
1291 ast_log(LOG_WARNING, "Unable to create smoother :(\n");
1294 ast_smoother_feed(rtp->smoother, _f);
1296 while((f = ast_smoother_read(rtp->smoother)))
1297 ast_rtp_raw_write(rtp, f, codec);
1299 case AST_FORMAT_ADPCM:
1300 case AST_FORMAT_G726:
1301 if (!rtp->smoother) {
1302 rtp->smoother = ast_smoother_new(80);
1304 if (!rtp->smoother) {
1305 ast_log(LOG_WARNING, "Unable to create smoother :(\n");
1308 ast_smoother_feed(rtp->smoother, _f);
1310 while((f = ast_smoother_read(rtp->smoother)))
1311 ast_rtp_raw_write(rtp, f, codec);
1313 case AST_FORMAT_G729A:
1314 if (!rtp->smoother) {
1315 rtp->smoother = ast_smoother_new(20);
1317 ast_smoother_set_flags(rtp->smoother, AST_SMOOTHER_FLAG_G729);
1319 if (!rtp->smoother) {
1320 ast_log(LOG_WARNING, "Unable to create g729 smoother :(\n");
1323 ast_smoother_feed(rtp->smoother, _f);
1325 while((f = ast_smoother_read(rtp->smoother)))
1326 ast_rtp_raw_write(rtp, f, codec);
1328 case AST_FORMAT_GSM:
1329 if (!rtp->smoother) {
1330 rtp->smoother = ast_smoother_new(33);
1332 if (!rtp->smoother) {
1333 ast_log(LOG_WARNING, "Unable to create GSM smoother :(\n");
1336 ast_smoother_feed(rtp->smoother, _f);
1337 while((f = ast_smoother_read(rtp->smoother)))
1338 ast_rtp_raw_write(rtp, f, codec);
1340 case AST_FORMAT_ILBC:
1341 if (!rtp->smoother) {
1342 rtp->smoother = ast_smoother_new(50);
1344 if (!rtp->smoother) {
1345 ast_log(LOG_WARNING, "Unable to create ILBC smoother :(\n");
1348 ast_smoother_feed(rtp->smoother, _f);
1349 while((f = ast_smoother_read(rtp->smoother)))
1350 ast_rtp_raw_write(rtp, f, codec);
1353 ast_log(LOG_WARNING, "Not sure about sending format %s packets\n", ast_getformatname(subclass));
1354 /* fall through to... */
1355 case AST_FORMAT_H261:
1356 case AST_FORMAT_H263:
1357 case AST_FORMAT_G723_1:
1358 case AST_FORMAT_LPC10:
1359 case AST_FORMAT_SPEEX:
1360 /* Don't buffer outgoing frames; send them one-per-packet: */
1361 if (_f->offset < hdrlen) {
1366 ast_rtp_raw_write(rtp, f, codec);
1372 void ast_rtp_proto_unregister(struct ast_rtp_protocol *proto)
1374 struct ast_rtp_protocol *cur, *prev;
1381 prev->next = proto->next;
1383 protos = proto->next;
1391 int ast_rtp_proto_register(struct ast_rtp_protocol *proto)
1393 struct ast_rtp_protocol *cur;
1396 if (cur->type == proto->type) {
1397 ast_log(LOG_WARNING, "Tried to register same protocol '%s' twice\n", cur->type);
1402 proto->next = protos;
1407 static struct ast_rtp_protocol *get_proto(struct ast_channel *chan)
1409 struct ast_rtp_protocol *cur;
1412 if (cur->type == chan->type) {
1420 int ast_rtp_bridge(struct ast_channel *c0, struct ast_channel *c1, int flags, struct ast_frame **fo, struct ast_channel **rc)
1422 struct ast_frame *f;
1423 struct ast_channel *who, *cs[3];
1424 struct ast_rtp *p0, *p1;
1425 struct ast_rtp *vp0, *vp1;
1426 struct ast_rtp_protocol *pr0, *pr1;
1427 struct sockaddr_in ac0, ac1;
1428 struct sockaddr_in vac0, vac1;
1429 struct sockaddr_in t0, t1;
1430 struct sockaddr_in vt0, vt1;
1431 char iabuf[INET_ADDRSTRLEN];
1435 int codec0,codec1, oldcodec0, oldcodec1;
1437 memset(&vt0, 0, sizeof(vt0));
1438 memset(&vt1, 0, sizeof(vt1));
1439 memset(&vac0, 0, sizeof(vac0));
1440 memset(&vac1, 0, sizeof(vac1));
1442 /* if need DTMF, cant native bridge */
1443 if (flags & (AST_BRIDGE_DTMF_CHANNEL_0 | AST_BRIDGE_DTMF_CHANNEL_1))
1445 ast_mutex_lock(&c0->lock);
1446 while(ast_mutex_trylock(&c1->lock)) {
1447 ast_mutex_unlock(&c0->lock);
1449 ast_mutex_lock(&c0->lock);
1451 pr0 = get_proto(c0);
1452 pr1 = get_proto(c1);
1454 ast_log(LOG_WARNING, "Can't find native functions for channel '%s'\n", c0->name);
1455 ast_mutex_unlock(&c0->lock);
1456 ast_mutex_unlock(&c1->lock);
1460 ast_log(LOG_WARNING, "Can't find native functions for channel '%s'\n", c1->name);
1461 ast_mutex_unlock(&c0->lock);
1462 ast_mutex_unlock(&c1->lock);
1465 pvt0 = c0->pvt->pvt;
1466 pvt1 = c1->pvt->pvt;
1467 p0 = pr0->get_rtp_info(c0);
1468 if (pr0->get_vrtp_info)
1469 vp0 = pr0->get_vrtp_info(c0);
1472 p1 = pr1->get_rtp_info(c1);
1473 if (pr1->get_vrtp_info)
1474 vp1 = pr1->get_vrtp_info(c1);
1478 /* Somebody doesn't want to play... */
1479 ast_mutex_unlock(&c0->lock);
1480 ast_mutex_unlock(&c1->lock);
1484 codec0 = pr0->get_codec(c0);
1488 codec1 = pr1->get_codec(c1);
1491 if (pr0->get_codec && pr1->get_codec) {
1492 /* Hey, we can't do reinvite if both parties speak diffrent codecs */
1493 if (!(codec0 & codec1)) {
1494 ast_log(LOG_WARNING, "codec0 = %d is not codec1 = %d, cannot native bridge.\n",codec0,codec1);
1495 ast_mutex_unlock(&c0->lock);
1496 ast_mutex_unlock(&c1->lock);
1500 if (pr0->set_rtp_peer(c0, p1, vp1, codec1))
1501 ast_log(LOG_WARNING, "Channel '%s' failed to talk to '%s'\n", c0->name, c1->name);
1503 /* Store RTP peer */
1504 ast_rtp_get_peer(p1, &ac1);
1506 ast_rtp_get_peer(vp1, &vac1);
1508 if (pr1->set_rtp_peer(c1, p0, vp0, codec0))
1509 ast_log(LOG_WARNING, "Channel '%s' failed to talk back to '%s'\n", c1->name, c0->name);
1511 /* Store RTP peer */
1512 ast_rtp_get_peer(p0, &ac0);
1514 ast_rtp_get_peer(vp0, &vac0);
1516 ast_mutex_unlock(&c0->lock);
1517 ast_mutex_unlock(&c1->lock);
1524 if ((c0->pvt->pvt != pvt0) ||
1525 (c1->pvt->pvt != pvt1) ||
1526 (c0->masq || c0->masqr || c1->masq || c1->masqr)) {
1527 ast_log(LOG_WARNING, "Oooh, something is weird, backing out\n");
1528 if (c0->pvt->pvt == pvt0) {
1529 if (pr0->set_rtp_peer(c0, NULL, NULL, 0))
1530 ast_log(LOG_WARNING, "Channel '%s' failed to revert\n", c0->name);
1532 if (c1->pvt->pvt == pvt1) {
1533 if (pr1->set_rtp_peer(c1, NULL, NULL, 0))
1534 ast_log(LOG_WARNING, "Channel '%s' failed to revert back\n", c1->name);
1536 /* Tell it to try again later */
1540 ast_rtp_get_peer(p1, &t1);
1541 ast_rtp_get_peer(p0, &t0);
1543 codec0 = pr0->get_codec(c0);
1545 codec1 = pr1->get_codec(c1);
1547 ast_rtp_get_peer(vp1, &vt1);
1549 ast_rtp_get_peer(vp0, &vt0);
1550 if (inaddrcmp(&t1, &ac1) || (vp1 && inaddrcmp(&vt1, &vac1)) || (codec1 != oldcodec1)) {
1552 ast_log(LOG_DEBUG, "Oooh, '%s' changed end address to %s:%d (format %d)\n",
1553 c1->name, ast_inet_ntoa(iabuf, sizeof(iabuf), t1.sin_addr), ntohs(t1.sin_port), codec1);
1554 ast_log(LOG_DEBUG, "Oooh, '%s' changed end vaddress to %s:%d (format %d)\n",
1555 c1->name, ast_inet_ntoa(iabuf, sizeof(iabuf), vt1.sin_addr), ntohs(vt1.sin_port), codec1);
1556 ast_log(LOG_DEBUG, "Oooh, '%s' was %s:%d/(format %d)\n",
1557 c1->name, ast_inet_ntoa(iabuf, sizeof(iabuf), ac1.sin_addr), ntohs(ac1.sin_port), oldcodec1);
1558 ast_log(LOG_DEBUG, "Oooh, '%s' wasv %s:%d/(format %d)\n",
1559 c1->name, ast_inet_ntoa(iabuf, sizeof(iabuf), vac1.sin_addr), ntohs(vac1.sin_port), oldcodec1);
1561 if (pr0->set_rtp_peer(c0, t1.sin_addr.s_addr ? p1 : NULL, vt1.sin_addr.s_addr ? vp1 : NULL, codec1))
1562 ast_log(LOG_WARNING, "Channel '%s' failed to update to '%s'\n", c0->name, c1->name);
1563 memcpy(&ac1, &t1, sizeof(ac1));
1564 memcpy(&vac1, &vt1, sizeof(vac1));
1567 if (inaddrcmp(&t0, &ac0) || (vp0 && inaddrcmp(&vt0, &vac0))) {
1569 ast_log(LOG_DEBUG, "Oooh, '%s' changed end address to %s:%d (format %d)\n",
1570 c0->name, ast_inet_ntoa(iabuf, sizeof(iabuf), t0.sin_addr), ntohs(t0.sin_port), codec0);
1571 ast_log(LOG_DEBUG, "Oooh, '%s' was %s:%d/(format %d)\n",
1572 c0->name, ast_inet_ntoa(iabuf, sizeof(iabuf), ac0.sin_addr), ntohs(ac0.sin_port), oldcodec0);
1574 if (pr1->set_rtp_peer(c1, t0.sin_addr.s_addr ? p0 : NULL, vt0.sin_addr.s_addr ? vp0 : NULL, codec0))
1575 ast_log(LOG_WARNING, "Channel '%s' failed to update to '%s'\n", c1->name, c0->name);
1576 memcpy(&ac0, &t0, sizeof(ac0));
1577 memcpy(&vac0, &vt0, sizeof(vac0));
1580 who = ast_waitfor_n(cs, 2, &to);
1583 ast_log(LOG_DEBUG, "Ooh, empty read...\n");
1584 /* check for hagnup / whentohangup */
1585 if (ast_check_hangup(c0) || ast_check_hangup(c1))
1590 if (!f || ((f->frametype == AST_FRAME_DTMF) &&
1591 (((who == c0) && (flags & AST_BRIDGE_DTMF_CHANNEL_0)) ||
1592 ((who == c1) && (flags & AST_BRIDGE_DTMF_CHANNEL_1))))) {
1596 ast_log(LOG_DEBUG, "Oooh, got a %s\n", f ? "digit" : "hangup");
1597 if ((c0->pvt->pvt == pvt0) && (!c0->_softhangup)) {
1598 if (pr0->set_rtp_peer(c0, NULL, NULL, 0))
1599 ast_log(LOG_WARNING, "Channel '%s' failed to revert\n", c0->name);
1601 if ((c1->pvt->pvt == pvt1) && (!c1->_softhangup)) {
1602 if (pr1->set_rtp_peer(c1, NULL, NULL, 0))
1603 ast_log(LOG_WARNING, "Channel '%s' failed to revert back\n", c1->name);
1605 /* That's all we needed */
1608 if ((f->frametype == AST_FRAME_DTMF) ||
1609 (f->frametype == AST_FRAME_VOICE) ||
1610 (f->frametype == AST_FRAME_VIDEO)) {
1611 /* Forward voice or DTMF frames if they happen upon us */
1614 } else if (who == c1) {
1620 /* Swap priority not that it's a big deal at this point */
1629 static int rtp_do_debug_ip(int fd, int argc, char *argv[])
1632 struct ast_hostent ahp;
1633 char iabuf[INET_ADDRSTRLEN];
1638 return RESULT_SHOWUSAGE;
1640 p = strstr(arg, ":");
1646 hp = ast_gethostbyname(arg, &ahp);
1648 return RESULT_SHOWUSAGE;
1649 rtpdebugaddr.sin_family = AF_INET;
1650 memcpy(&rtpdebugaddr.sin_addr, hp->h_addr, sizeof(rtpdebugaddr.sin_addr));
1651 rtpdebugaddr.sin_port = htons(port);
1653 ast_cli(fd, "RTP Debugging Enabled for IP: %s\n", ast_inet_ntoa(iabuf, sizeof(iabuf), rtpdebugaddr.sin_addr));
1655 ast_cli(fd, "RTP Debugging Enabled for IP: %s:%d\n", ast_inet_ntoa(iabuf, sizeof(iabuf), rtpdebugaddr.sin_addr), port);
1657 return RESULT_SUCCESS;
1660 static int rtp_do_debug(int fd, int argc, char *argv[])
1664 return RESULT_SHOWUSAGE;
1665 return rtp_do_debug_ip(fd, argc, argv);
1668 memset(&rtpdebugaddr,0,sizeof(rtpdebugaddr));
1669 ast_cli(fd, "RTP Debugging Enabled\n");
1670 return RESULT_SUCCESS;
1673 static int rtp_no_debug(int fd, int argc, char *argv[])
1676 return RESULT_SHOWUSAGE;
1678 ast_cli(fd,"RTP Debugging Disabled\n");
1679 return RESULT_SUCCESS;
1682 static char debug_usage[] =
1683 "Usage: rtp debug [ip host[:port]]\n"
1684 " Enable dumping of all RTP packets to and from host.\n";
1686 static char no_debug_usage[] =
1687 "Usage: rtp no debug\n"
1688 " Disable all RTP debugging\n";
1690 static struct ast_cli_entry cli_debug_ip =
1691 {{ "rtp", "debug", "ip", NULL } , rtp_do_debug, "Enable RTP debugging on IP", debug_usage };
1693 static struct ast_cli_entry cli_debug =
1694 {{ "rtp", "debug", NULL } , rtp_do_debug, "Enable RTP debugging", debug_usage };
1696 static struct ast_cli_entry cli_no_debug =
1697 {{ "rtp", "no", "debug", NULL } , rtp_no_debug, "Disable RTP debugging", no_debug_usage };
1699 void ast_rtp_reload(void)
1701 struct ast_config *cfg;
1709 cfg = ast_load("rtp.conf");
1711 if ((s = ast_variable_retrieve(cfg, "general", "rtpstart"))) {
1713 if (rtpstart < 1024)
1715 if (rtpstart > 65535)
1718 if ((s = ast_variable_retrieve(cfg, "general", "rtpend"))) {
1725 if ((s = ast_variable_retrieve(cfg, "general", "rtpchecksums"))) {
1733 ast_log(LOG_WARNING, "Disabling RTP checksums is not supported on this operating system!\n");
1738 if (rtpstart >= rtpend) {
1739 ast_log(LOG_WARNING, "Unreasonable values for RTP start in rtp.conf/end\n");
1743 if (option_verbose > 1)
1744 ast_verbose(VERBOSE_PREFIX_2 "RTP Allocating from port range %d -> %d\n", rtpstart, rtpend);
1748 void ast_rtp_init(void)
1750 ast_cli_register(&cli_debug);
1751 ast_cli_register(&cli_debug_ip);
1752 ast_cli_register(&cli_no_debug);