00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #include "asterisk.h"
00036
00037 ASTERISK_FILE_VERSION(__FILE__, "$Revision: 373702 $")
00038
00039 #include <sys/time.h>
00040 #include <signal.h>
00041 #include <fcntl.h>
00042
00043 #include "asterisk/stun.h"
00044 #include "asterisk/pbx.h"
00045 #include "asterisk/frame.h"
00046 #include "asterisk/channel.h"
00047 #include "asterisk/acl.h"
00048 #include "asterisk/config.h"
00049 #include "asterisk/lock.h"
00050 #include "asterisk/utils.h"
00051 #include "asterisk/cli.h"
00052 #include "asterisk/manager.h"
00053 #include "asterisk/unaligned.h"
00054 #include "asterisk/module.h"
00055 #include "asterisk/rtp_engine.h"
00056
00057 #define MAX_TIMESTAMP_SKEW 640
00058
00059 #define RTP_SEQ_MOD (1<<16)
00060 #define RTCP_DEFAULT_INTERVALMS 5000
00061 #define RTCP_MIN_INTERVALMS 500
00062 #define RTCP_MAX_INTERVALMS 60000
00063
00064 #define DEFAULT_RTP_START 5000
00065 #define DEFAULT_RTP_END 31000
00066
00067 #define MINIMUM_RTP_PORT 1024
00068 #define MAXIMUM_RTP_PORT 65535
00069
00070 #define RTCP_PT_FUR 192
00071 #define RTCP_PT_SR 200
00072 #define RTCP_PT_RR 201
00073 #define RTCP_PT_SDES 202
00074 #define RTCP_PT_BYE 203
00075 #define RTCP_PT_APP 204
00076
00077 #define RTP_MTU 1200
00078
00079 #define DEFAULT_DTMF_TIMEOUT (150 * (8000 / 1000))
00080
00081 #define ZFONE_PROFILE_ID 0x505a
00082
00083 #define DEFAULT_LEARNING_MIN_SEQUENTIAL 4
00084
00085 extern struct ast_srtp_res *res_srtp;
00086 static int dtmftimeout = DEFAULT_DTMF_TIMEOUT;
00087
00088 static int rtpstart = DEFAULT_RTP_START;
00089 static int rtpend = DEFAULT_RTP_END;
00090 static int rtpdebug;
00091 static int rtcpdebug;
00092 static int rtcpstats;
00093 static int rtcpinterval = RTCP_DEFAULT_INTERVALMS;
00094 static struct ast_sockaddr rtpdebugaddr;
00095 static struct ast_sockaddr rtcpdebugaddr;
00096 static int rtpdebugport;
00097 static int rtcpdebugport;
00098 #ifdef SO_NO_CHECK
00099 static int nochecksums;
00100 #endif
00101 static int strictrtp;
00102 static int learning_min_sequential;
00103
00104 enum strict_rtp_state {
00105 STRICT_RTP_OPEN = 0,
00106 STRICT_RTP_LEARN,
00107 STRICT_RTP_CLOSED,
00108 };
00109
00110 #define FLAG_3389_WARNING (1 << 0)
00111 #define FLAG_NAT_ACTIVE (3 << 1)
00112 #define FLAG_NAT_INACTIVE (0 << 1)
00113 #define FLAG_NAT_INACTIVE_NOWARN (1 << 1)
00114 #define FLAG_NEED_MARKER_BIT (1 << 3)
00115 #define FLAG_DTMF_COMPENSATE (1 << 4)
00116
00117
00118 struct ast_rtp {
00119 int s;
00120 struct ast_frame f;
00121 unsigned char rawdata[8192 + AST_FRIENDLY_OFFSET];
00122 unsigned int ssrc;
00123 unsigned int themssrc;
00124 unsigned int rxssrc;
00125 unsigned int lastts;
00126 unsigned int lastrxts;
00127 unsigned int lastividtimestamp;
00128 unsigned int lastovidtimestamp;
00129 unsigned int lastitexttimestamp;
00130 unsigned int lastotexttimestamp;
00131 unsigned int lasteventseqn;
00132 int lastrxseqno;
00133 unsigned short seedrxseqno;
00134 unsigned int seedrxts;
00135 unsigned int rxcount;
00136 unsigned int rxoctetcount;
00137 unsigned int txcount;
00138 unsigned int txoctetcount;
00139 unsigned int cycles;
00140 double rxjitter;
00141 double rxtransit;
00142 format_t lasttxformat;
00143 format_t lastrxformat;
00144
00145 int rtptimeout;
00146 int rtpholdtimeout;
00147 int rtpkeepalive;
00148
00149
00150 char resp;
00151 unsigned int last_seqno;
00152 unsigned int last_end_timestamp;
00153 unsigned int dtmf_duration;
00154 unsigned int dtmf_timeout;
00155 unsigned int dtmfsamples;
00156 enum ast_rtp_dtmf_mode dtmfmode;
00157
00158 unsigned int lastdigitts;
00159 char sending_digit;
00160 char send_digit;
00161 int send_payload;
00162 int send_duration;
00163 unsigned int flags;
00164 struct timeval rxcore;
00165 struct timeval txcore;
00166 double drxcore;
00167 struct timeval lastrx;
00168 struct timeval dtmfmute;
00169 struct ast_smoother *smoother;
00170 int *ioid;
00171 unsigned short seqno;
00172 unsigned short rxseqno;
00173 struct sched_context *sched;
00174 struct io_context *io;
00175 void *data;
00176 struct ast_rtcp *rtcp;
00177 struct ast_rtp *bridged;
00178
00179 enum strict_rtp_state strict_rtp_state;
00180 struct ast_sockaddr strict_rtp_address;
00181 struct ast_sockaddr alt_rtp_address;
00182
00183
00184
00185
00186
00187 uint16_t learning_max_seq;
00188 int learning_probation;
00189
00190 struct rtp_red *red;
00191 };
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203 struct ast_rtcp {
00204 int rtcp_info;
00205 int s;
00206 struct ast_sockaddr us;
00207 struct ast_sockaddr them;
00208 unsigned int soc;
00209 unsigned int spc;
00210 unsigned int themrxlsr;
00211 struct timeval rxlsr;
00212 struct timeval txlsr;
00213 unsigned int expected_prior;
00214 unsigned int received_prior;
00215 int schedid;
00216 unsigned int rr_count;
00217 unsigned int sr_count;
00218 unsigned int lastsrtxcount;
00219 double accumulated_transit;
00220 double rtt;
00221 unsigned int reported_jitter;
00222 unsigned int reported_lost;
00223
00224 double reported_maxjitter;
00225 double reported_minjitter;
00226 double reported_normdev_jitter;
00227 double reported_stdev_jitter;
00228 unsigned int reported_jitter_count;
00229
00230 double reported_maxlost;
00231 double reported_minlost;
00232 double reported_normdev_lost;
00233 double reported_stdev_lost;
00234
00235 double rxlost;
00236 double maxrxlost;
00237 double minrxlost;
00238 double normdev_rxlost;
00239 double stdev_rxlost;
00240 unsigned int rxlost_count;
00241
00242 double maxrxjitter;
00243 double minrxjitter;
00244 double normdev_rxjitter;
00245 double stdev_rxjitter;
00246 unsigned int rxjitter_count;
00247 double maxrtt;
00248 double minrtt;
00249 double normdevrtt;
00250 double stdevrtt;
00251 unsigned int rtt_count;
00252 };
00253
00254 struct rtp_red {
00255 struct ast_frame t140;
00256 struct ast_frame t140red;
00257 unsigned char pt[AST_RED_MAX_GENERATION];
00258 unsigned char ts[AST_RED_MAX_GENERATION];
00259 unsigned char len[AST_RED_MAX_GENERATION];
00260 int num_gen;
00261 int schedid;
00262 int ti;
00263 unsigned char t140red_data[64000];
00264 unsigned char buf_data[64000];
00265 int hdrlen;
00266 long int prev_ts;
00267 };
00268
00269 AST_LIST_HEAD_NOLOCK(frame_list, ast_frame);
00270
00271
00272 static int ast_rtp_new(struct ast_rtp_instance *instance, struct sched_context *sched, struct ast_sockaddr *addr, void *data);
00273 static int ast_rtp_destroy(struct ast_rtp_instance *instance);
00274 static int ast_rtp_dtmf_begin(struct ast_rtp_instance *instance, char digit);
00275 static int ast_rtp_dtmf_end(struct ast_rtp_instance *instance, char digit);
00276 static int ast_rtp_dtmf_end_with_duration(struct ast_rtp_instance *instance, char digit, unsigned int duration);
00277 static int ast_rtp_dtmf_mode_set(struct ast_rtp_instance *instance, enum ast_rtp_dtmf_mode dtmf_mode);
00278 static enum ast_rtp_dtmf_mode ast_rtp_dtmf_mode_get(struct ast_rtp_instance *instance);
00279 static void ast_rtp_update_source(struct ast_rtp_instance *instance);
00280 static void ast_rtp_change_source(struct ast_rtp_instance *instance);
00281 static int ast_rtp_write(struct ast_rtp_instance *instance, struct ast_frame *frame);
00282 static struct ast_frame *ast_rtp_read(struct ast_rtp_instance *instance, int rtcp);
00283 static void ast_rtp_prop_set(struct ast_rtp_instance *instance, enum ast_rtp_property property, int value);
00284 static int ast_rtp_fd(struct ast_rtp_instance *instance, int rtcp);
00285 static void ast_rtp_remote_address_set(struct ast_rtp_instance *instance, struct ast_sockaddr *addr);
00286 static void ast_rtp_alt_remote_address_set(struct ast_rtp_instance *instance, struct ast_sockaddr *addr);
00287 static int rtp_red_init(struct ast_rtp_instance *instance, int buffer_time, int *payloads, int generations);
00288 static int rtp_red_buffer(struct ast_rtp_instance *instance, struct ast_frame *frame);
00289 static int ast_rtp_local_bridge(struct ast_rtp_instance *instance0, struct ast_rtp_instance *instance1);
00290 static int ast_rtp_get_stat(struct ast_rtp_instance *instance, struct ast_rtp_instance_stats *stats, enum ast_rtp_instance_stat stat);
00291 static int ast_rtp_dtmf_compatible(struct ast_channel *chan0, struct ast_rtp_instance *instance0, struct ast_channel *chan1, struct ast_rtp_instance *instance1);
00292 static void ast_rtp_stun_request(struct ast_rtp_instance *instance, struct ast_sockaddr *suggestion, const char *username);
00293 static void ast_rtp_stop(struct ast_rtp_instance *instance);
00294 static int ast_rtp_qos_set(struct ast_rtp_instance *instance, int tos, int cos, const char* desc);
00295 static int ast_rtp_sendcng(struct ast_rtp_instance *instance, int level);
00296
00297
00298 static struct ast_rtp_engine asterisk_rtp_engine = {
00299 .name = "asterisk",
00300 .new = ast_rtp_new,
00301 .destroy = ast_rtp_destroy,
00302 .dtmf_begin = ast_rtp_dtmf_begin,
00303 .dtmf_end = ast_rtp_dtmf_end,
00304 .dtmf_end_with_duration = ast_rtp_dtmf_end_with_duration,
00305 .dtmf_mode_set = ast_rtp_dtmf_mode_set,
00306 .dtmf_mode_get = ast_rtp_dtmf_mode_get,
00307 .update_source = ast_rtp_update_source,
00308 .change_source = ast_rtp_change_source,
00309 .write = ast_rtp_write,
00310 .read = ast_rtp_read,
00311 .prop_set = ast_rtp_prop_set,
00312 .fd = ast_rtp_fd,
00313 .remote_address_set = ast_rtp_remote_address_set,
00314 .alt_remote_address_set = ast_rtp_alt_remote_address_set,
00315 .red_init = rtp_red_init,
00316 .red_buffer = rtp_red_buffer,
00317 .local_bridge = ast_rtp_local_bridge,
00318 .get_stat = ast_rtp_get_stat,
00319 .dtmf_compatible = ast_rtp_dtmf_compatible,
00320 .stun_request = ast_rtp_stun_request,
00321 .stop = ast_rtp_stop,
00322 .qos = ast_rtp_qos_set,
00323 .sendcng = ast_rtp_sendcng,
00324 };
00325
00326 static inline int rtp_debug_test_addr(struct ast_sockaddr *addr)
00327 {
00328 if (!rtpdebug) {
00329 return 0;
00330 }
00331 if (!ast_sockaddr_isnull(&rtpdebugaddr)) {
00332 if (rtpdebugport) {
00333 return (ast_sockaddr_cmp(&rtpdebugaddr, addr) == 0);
00334 } else {
00335 return (ast_sockaddr_cmp_addr(&rtpdebugaddr, addr) == 0);
00336 }
00337 }
00338
00339 return 1;
00340 }
00341
00342 static inline int rtcp_debug_test_addr(struct ast_sockaddr *addr)
00343 {
00344 if (!rtcpdebug) {
00345 return 0;
00346 }
00347 if (!ast_sockaddr_isnull(&rtcpdebugaddr)) {
00348 if (rtcpdebugport) {
00349 return (ast_sockaddr_cmp(&rtcpdebugaddr, addr) == 0);
00350 } else {
00351 return (ast_sockaddr_cmp_addr(&rtcpdebugaddr, addr) == 0);
00352 }
00353 }
00354
00355 return 1;
00356 }
00357
00358 static int __rtp_recvfrom(struct ast_rtp_instance *instance, void *buf, size_t size, int flags, struct ast_sockaddr *sa, int rtcp)
00359 {
00360 int len;
00361 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
00362 struct ast_srtp *srtp = ast_rtp_instance_get_srtp(instance);
00363
00364 if ((len = ast_recvfrom(rtcp ? rtp->rtcp->s : rtp->s, buf, size, flags, sa)) < 0) {
00365 return len;
00366 }
00367
00368 if (res_srtp && srtp && res_srtp->unprotect(srtp, buf, &len, rtcp) < 0) {
00369 return -1;
00370 }
00371
00372 return len;
00373 }
00374
00375 static int rtcp_recvfrom(struct ast_rtp_instance *instance, void *buf, size_t size, int flags, struct ast_sockaddr *sa)
00376 {
00377 return __rtp_recvfrom(instance, buf, size, flags, sa, 1);
00378 }
00379
00380 static int rtp_recvfrom(struct ast_rtp_instance *instance, void *buf, size_t size, int flags, struct ast_sockaddr *sa)
00381 {
00382 return __rtp_recvfrom(instance, buf, size, flags, sa, 0);
00383 }
00384
00385 static int __rtp_sendto(struct ast_rtp_instance *instance, void *buf, size_t size, int flags, struct ast_sockaddr *sa, int rtcp)
00386 {
00387 int len = size;
00388 void *temp = buf;
00389 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
00390 struct ast_srtp *srtp = ast_rtp_instance_get_srtp(instance);
00391
00392 if (res_srtp && srtp && res_srtp->protect(srtp, &temp, &len, rtcp) < 0) {
00393 return -1;
00394 }
00395
00396 return ast_sendto(rtcp ? rtp->rtcp->s : rtp->s, temp, len, flags, sa);
00397 }
00398
00399 static int rtcp_sendto(struct ast_rtp_instance *instance, void *buf, size_t size, int flags, struct ast_sockaddr *sa)
00400 {
00401 return __rtp_sendto(instance, buf, size, flags, sa, 1);
00402 }
00403
00404 static int rtp_sendto(struct ast_rtp_instance *instance, void *buf, size_t size, int flags, struct ast_sockaddr *sa)
00405 {
00406 return __rtp_sendto(instance, buf, size, flags, sa, 0);
00407 }
00408
00409 static int rtp_get_rate(format_t subclass)
00410 {
00411 return (subclass == AST_FORMAT_G722) ? 8000 : ast_format_rate(subclass);
00412 }
00413
00414 static unsigned int ast_rtcp_calc_interval(struct ast_rtp *rtp)
00415 {
00416 unsigned int interval;
00417
00418
00419 interval = rtcpinterval;
00420 return interval;
00421 }
00422
00423
00424 static double normdev_compute(double normdev, double sample, unsigned int sample_count)
00425 {
00426 normdev = normdev * sample_count + sample;
00427 sample_count++;
00428
00429 return normdev / sample_count;
00430 }
00431
00432 static double stddev_compute(double stddev, double sample, double normdev, double normdev_curent, unsigned int sample_count)
00433 {
00434
00435
00436
00437
00438
00439
00440 #define SQUARE(x) ((x) * (x))
00441
00442 stddev = sample_count * stddev;
00443 sample_count++;
00444
00445 return stddev +
00446 ( sample_count * SQUARE( (sample - normdev) / sample_count ) ) +
00447 ( SQUARE(sample - normdev_curent) / sample_count );
00448
00449 #undef SQUARE
00450 }
00451
00452 static int create_new_socket(const char *type, int af)
00453 {
00454 int sock = socket(af, SOCK_DGRAM, 0);
00455
00456 if (sock < 0) {
00457 if (!type) {
00458 type = "RTP/RTCP";
00459 }
00460 ast_log(LOG_WARNING, "Unable to allocate %s socket: %s\n", type, strerror(errno));
00461 } else {
00462 long flags = fcntl(sock, F_GETFL);
00463 fcntl(sock, F_SETFL, flags | O_NONBLOCK);
00464 #ifdef SO_NO_CHECK
00465 if (nochecksums) {
00466 setsockopt(sock, SOL_SOCKET, SO_NO_CHECK, &nochecksums, sizeof(nochecksums));
00467 }
00468 #endif
00469 }
00470
00471 return sock;
00472 }
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482 static void rtp_learning_seq_init(struct ast_rtp *rtp, uint16_t seq)
00483 {
00484 rtp->learning_max_seq = seq - 1;
00485 rtp->learning_probation = learning_min_sequential;
00486 }
00487
00488
00489
00490
00491
00492
00493
00494
00495
00496
00497 static int rtp_learning_rtp_seq_update(struct ast_rtp *rtp, uint16_t seq)
00498 {
00499 int probation = 1;
00500
00501 ast_debug(1, "%p -- probation = %d, seq = %d\n", rtp, rtp->learning_probation, seq);
00502
00503 if (seq == rtp->learning_max_seq + 1) {
00504
00505 rtp->learning_probation--;
00506 rtp->learning_max_seq = seq;
00507 if (rtp->learning_probation == 0) {
00508 probation = 0;
00509 }
00510 } else {
00511 rtp->learning_probation = learning_min_sequential - 1;
00512 rtp->learning_max_seq = seq;
00513 }
00514
00515 return probation;
00516 }
00517
00518 static int ast_rtp_new(struct ast_rtp_instance *instance,
00519 struct sched_context *sched, struct ast_sockaddr *addr,
00520 void *data)
00521 {
00522 struct ast_rtp *rtp = NULL;
00523 int x, startplace;
00524
00525
00526 if (!(rtp = ast_calloc(1, sizeof(*rtp)))) {
00527 return -1;
00528 }
00529
00530
00531 rtp->ssrc = ast_random();
00532 rtp->seqno = ast_random() & 0xffff;
00533 rtp->strict_rtp_state = (strictrtp ? STRICT_RTP_LEARN : STRICT_RTP_OPEN);
00534 if (strictrtp) {
00535 rtp_learning_seq_init(rtp, (uint16_t)rtp->seqno);
00536 }
00537
00538
00539 if ((rtp->s =
00540 create_new_socket("RTP",
00541 ast_sockaddr_is_ipv4(addr) ? AF_INET :
00542 ast_sockaddr_is_ipv6(addr) ? AF_INET6 : -1)) < 0) {
00543 ast_debug(1, "Failed to create a new socket for RTP instance '%p'\n", instance);
00544 ast_free(rtp);
00545 return -1;
00546 }
00547
00548
00549 x = (rtpend == rtpstart) ? rtpstart : (ast_random() % (rtpend - rtpstart)) + rtpstart;
00550 x = x & ~1;
00551 startplace = x;
00552
00553 for (;;) {
00554 ast_sockaddr_set_port(addr, x);
00555
00556 if (!ast_bind(rtp->s, addr)) {
00557 ast_debug(1, "Allocated port %d for RTP instance '%p'\n", x, instance);
00558 ast_rtp_instance_set_local_address(instance, addr);
00559 break;
00560 }
00561
00562 x += 2;
00563 if (x > rtpend) {
00564 x = (rtpstart + 1) & ~1;
00565 }
00566
00567
00568 if (x == startplace || errno != EADDRINUSE) {
00569 ast_log(LOG_ERROR, "Oh dear... we couldn't allocate a port for RTP instance '%p'\n", instance);
00570 close(rtp->s);
00571 ast_free(rtp);
00572 return -1;
00573 }
00574 }
00575
00576
00577 rtp->sched = sched;
00578
00579
00580 ast_rtp_instance_set_data(instance, rtp);
00581
00582 return 0;
00583 }
00584
00585 static int ast_rtp_destroy(struct ast_rtp_instance *instance)
00586 {
00587 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
00588
00589
00590 if (rtp->smoother) {
00591 ast_smoother_free(rtp->smoother);
00592 }
00593
00594
00595 if (rtp->s > -1) {
00596 close(rtp->s);
00597 }
00598
00599
00600 if (rtp->rtcp) {
00601
00602
00603
00604
00605
00606 close(rtp->rtcp->s);
00607 ast_free(rtp->rtcp);
00608 }
00609
00610
00611 if (rtp->red) {
00612 AST_SCHED_DEL(rtp->sched, rtp->red->schedid);
00613 ast_free(rtp->red);
00614 }
00615
00616
00617 ast_free(rtp);
00618
00619 return 0;
00620 }
00621
00622 static int ast_rtp_dtmf_mode_set(struct ast_rtp_instance *instance, enum ast_rtp_dtmf_mode dtmf_mode)
00623 {
00624 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
00625 rtp->dtmfmode = dtmf_mode;
00626 return 0;
00627 }
00628
00629 static enum ast_rtp_dtmf_mode ast_rtp_dtmf_mode_get(struct ast_rtp_instance *instance)
00630 {
00631 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
00632 return rtp->dtmfmode;
00633 }
00634
00635 static int ast_rtp_dtmf_begin(struct ast_rtp_instance *instance, char digit)
00636 {
00637 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
00638 struct ast_sockaddr remote_address = { {0,} };
00639 int hdrlen = 12, res = 0, i = 0, payload = 101;
00640 char data[256];
00641 unsigned int *rtpheader = (unsigned int*)data;
00642
00643 ast_rtp_instance_get_remote_address(instance, &remote_address);
00644
00645
00646 if (ast_sockaddr_isnull(&remote_address)) {
00647 return -1;
00648 }
00649
00650
00651 if ((digit <= '9') && (digit >= '0')) {
00652 digit -= '0';
00653 } else if (digit == '*') {
00654 digit = 10;
00655 } else if (digit == '#') {
00656 digit = 11;
00657 } else if ((digit >= 'A') && (digit <= 'D')) {
00658 digit = digit - 'A' + 12;
00659 } else if ((digit >= 'a') && (digit <= 'd')) {
00660 digit = digit - 'a' + 12;
00661 } else {
00662 ast_log(LOG_WARNING, "Don't know how to represent '%c'\n", digit);
00663 return -1;
00664 }
00665
00666
00667 payload = ast_rtp_codecs_payload_code(ast_rtp_instance_get_codecs(instance), 0, AST_RTP_DTMF);
00668
00669 rtp->dtmfmute = ast_tvadd(ast_tvnow(), ast_tv(0, 500000));
00670 rtp->send_duration = 160;
00671 rtp->lastdigitts = rtp->lastts + rtp->send_duration;
00672
00673
00674 rtpheader[0] = htonl((2 << 30) | (1 << 23) | (payload << 16) | (rtp->seqno));
00675 rtpheader[1] = htonl(rtp->lastdigitts);
00676 rtpheader[2] = htonl(rtp->ssrc);
00677
00678
00679 for (i = 0; i < 2; i++) {
00680 rtpheader[3] = htonl((digit << 24) | (0xa << 16) | (rtp->send_duration));
00681 res = rtp_sendto(instance, (void *) rtpheader, hdrlen + 4, 0, &remote_address);
00682 if (res < 0) {
00683 ast_log(LOG_ERROR, "RTP Transmission error to %s: %s\n",
00684 ast_sockaddr_stringify(&remote_address),
00685 strerror(errno));
00686 }
00687 if (rtp_debug_test_addr(&remote_address)) {
00688 ast_verbose("Sent RTP DTMF packet to %s (type %-2.2d, seq %-6.6u, ts %-6.6u, len %-6.6u)\n",
00689 ast_sockaddr_stringify(&remote_address),
00690 payload, rtp->seqno, rtp->lastdigitts, res - hdrlen);
00691 }
00692 rtp->seqno++;
00693 rtp->send_duration += 160;
00694 rtpheader[0] = htonl((2 << 30) | (payload << 16) | (rtp->seqno));
00695 }
00696
00697
00698 rtp->sending_digit = 1;
00699 rtp->send_digit = digit;
00700 rtp->send_payload = payload;
00701
00702 return 0;
00703 }
00704
00705 static int ast_rtp_dtmf_continuation(struct ast_rtp_instance *instance)
00706 {
00707 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
00708 struct ast_sockaddr remote_address = { {0,} };
00709 int hdrlen = 12, res = 0;
00710 char data[256];
00711 unsigned int *rtpheader = (unsigned int*)data;
00712
00713 ast_rtp_instance_get_remote_address(instance, &remote_address);
00714
00715
00716 if (ast_sockaddr_isnull(&remote_address)) {
00717 return -1;
00718 }
00719
00720
00721 rtpheader[0] = htonl((2 << 30) | (rtp->send_payload << 16) | (rtp->seqno));
00722 rtpheader[1] = htonl(rtp->lastdigitts);
00723 rtpheader[2] = htonl(rtp->ssrc);
00724 rtpheader[3] = htonl((rtp->send_digit << 24) | (0xa << 16) | (rtp->send_duration));
00725
00726
00727 res = rtp_sendto(instance, (void *) rtpheader, hdrlen + 4, 0, &remote_address);
00728 if (res < 0) {
00729 ast_log(LOG_ERROR, "RTP Transmission error to %s: %s\n",
00730 ast_sockaddr_stringify(&remote_address),
00731 strerror(errno));
00732 }
00733
00734 if (rtp_debug_test_addr(&remote_address)) {
00735 ast_verbose("Sent RTP DTMF packet to %s (type %-2.2d, seq %-6.6u, ts %-6.6u, len %-6.6u)\n",
00736 ast_sockaddr_stringify(&remote_address),
00737 rtp->send_payload, rtp->seqno, rtp->lastdigitts, res - hdrlen);
00738 }
00739
00740
00741 rtp->seqno++;
00742 rtp->send_duration += 160;
00743
00744 return 0;
00745 }
00746
00747 static int ast_rtp_dtmf_end_with_duration(struct ast_rtp_instance *instance, char digit, unsigned int duration)
00748 {
00749 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
00750 struct ast_sockaddr remote_address = { {0,} };
00751 int hdrlen = 12, res = 0, i = 0;
00752 char data[256];
00753 unsigned int *rtpheader = (unsigned int*)data;
00754 unsigned int measured_samples;
00755
00756 ast_rtp_instance_get_remote_address(instance, &remote_address);
00757
00758
00759 if (ast_sockaddr_isnull(&remote_address)) {
00760 return -1;
00761 }
00762
00763
00764 if ((digit <= '9') && (digit >= '0')) {
00765 digit -= '0';
00766 } else if (digit == '*') {
00767 digit = 10;
00768 } else if (digit == '#') {
00769 digit = 11;
00770 } else if ((digit >= 'A') && (digit <= 'D')) {
00771 digit = digit - 'A' + 12;
00772 } else if ((digit >= 'a') && (digit <= 'd')) {
00773 digit = digit - 'a' + 12;
00774 } else {
00775 ast_log(LOG_WARNING, "Don't know how to represent '%c'\n", digit);
00776 return -1;
00777 }
00778
00779 rtp->dtmfmute = ast_tvadd(ast_tvnow(), ast_tv(0, 500000));
00780
00781 if (duration > 0 && (measured_samples = duration * rtp_get_rate(rtp->f.subclass.codec) / 1000) > rtp->send_duration) {
00782 ast_debug(2, "Adjusting final end duration from %u to %u\n", rtp->send_duration, measured_samples);
00783 rtp->send_duration = measured_samples;
00784 }
00785
00786
00787 rtpheader[1] = htonl(rtp->lastdigitts);
00788 rtpheader[2] = htonl(rtp->ssrc);
00789 rtpheader[3] = htonl((digit << 24) | (0xa << 16) | (rtp->send_duration));
00790 rtpheader[3] |= htonl((1 << 23));
00791
00792
00793 for (i = 0; i < 3; i++) {
00794
00795 rtpheader[0] = htonl((2 << 30) | (rtp->send_payload << 16) | (rtp->seqno));
00796
00797 res = rtp_sendto(instance, (void *) rtpheader, hdrlen + 4, 0, &remote_address);
00798 if (res < 0) {
00799 ast_log(LOG_ERROR, "RTP Transmission error to %s: %s\n",
00800 ast_sockaddr_stringify(&remote_address),
00801 strerror(errno));
00802 }
00803 if (rtp_debug_test_addr(&remote_address)) {
00804 ast_verbose("Sent RTP DTMF packet to %s (type %-2.2d, seq %-6.6u, ts %-6.6u, len %-6.6u)\n",
00805 ast_sockaddr_stringify(&remote_address),
00806 rtp->send_payload, rtp->seqno, rtp->lastdigitts, res - hdrlen);
00807 }
00808
00809 rtp->seqno++;
00810 }
00811
00812
00813 rtp->lastts += rtp->send_duration;
00814 rtp->sending_digit = 0;
00815 rtp->send_digit = 0;
00816
00817 return 0;
00818 }
00819
00820 static int ast_rtp_dtmf_end(struct ast_rtp_instance *instance, char digit)
00821 {
00822 return ast_rtp_dtmf_end_with_duration(instance, digit, 0);
00823 }
00824
00825 static void ast_rtp_update_source(struct ast_rtp_instance *instance)
00826 {
00827 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
00828
00829
00830 ast_set_flag(rtp, FLAG_NEED_MARKER_BIT);
00831 ast_debug(3, "Setting the marker bit due to a source update\n");
00832
00833 return;
00834 }
00835
00836 static void ast_rtp_change_source(struct ast_rtp_instance *instance)
00837 {
00838 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
00839 struct ast_srtp *srtp = ast_rtp_instance_get_srtp(instance);
00840 unsigned int ssrc = ast_random();
00841
00842 if (!rtp->lastts) {
00843 ast_debug(3, "Not changing SSRC since we haven't sent any RTP yet\n");
00844 return;
00845 }
00846
00847
00848 ast_set_flag(rtp, FLAG_NEED_MARKER_BIT);
00849
00850 ast_debug(3, "Changing ssrc from %u to %u due to a source change\n", rtp->ssrc, ssrc);
00851
00852 if (srtp) {
00853 ast_debug(3, "Changing ssrc for SRTP from %u to %u\n", rtp->ssrc, ssrc);
00854 res_srtp->change_source(srtp, rtp->ssrc, ssrc);
00855 }
00856
00857 rtp->ssrc = ssrc;
00858
00859 return;
00860 }
00861
00862 static unsigned int calc_txstamp(struct ast_rtp *rtp, struct timeval *delivery)
00863 {
00864 struct timeval t;
00865 long ms;
00866
00867 if (ast_tvzero(rtp->txcore)) {
00868 rtp->txcore = ast_tvnow();
00869 rtp->txcore.tv_usec -= rtp->txcore.tv_usec % 20000;
00870 }
00871
00872 t = (delivery && !ast_tvzero(*delivery)) ? *delivery : ast_tvnow();
00873 if ((ms = ast_tvdiff_ms(t, rtp->txcore)) < 0) {
00874 ms = 0;
00875 }
00876 rtp->txcore = t;
00877
00878 return (unsigned int) ms;
00879 }
00880
00881 static void timeval2ntp(struct timeval tv, unsigned int *msw, unsigned int *lsw)
00882 {
00883 unsigned int sec, usec, frac;
00884 sec = tv.tv_sec + 2208988800u;
00885 usec = tv.tv_usec;
00886 frac = (usec << 12) + (usec << 8) - ((usec * 3650) >> 6);
00887 *msw = sec;
00888 *lsw = frac;
00889 }
00890
00891
00892 static int ast_rtcp_write_rr(struct ast_rtp_instance *instance)
00893 {
00894 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
00895 int res;
00896 int len = 32;
00897 unsigned int lost;
00898 unsigned int extended;
00899 unsigned int expected;
00900 unsigned int expected_interval;
00901 unsigned int received_interval;
00902 int lost_interval;
00903 struct timeval now;
00904 unsigned int *rtcpheader;
00905 char bdata[1024];
00906 struct timeval dlsr;
00907 int fraction;
00908 int rate = rtp_get_rate(rtp->f.subclass.codec);
00909
00910 double rxlost_current;
00911
00912 if (!rtp || !rtp->rtcp)
00913 return 0;
00914
00915 if (ast_sockaddr_isnull(&rtp->rtcp->them)) {
00916
00917
00918
00919 return 0;
00920 }
00921
00922 extended = rtp->cycles + rtp->lastrxseqno;
00923 expected = extended - rtp->seedrxseqno + 1;
00924 lost = expected - rtp->rxcount;
00925 expected_interval = expected - rtp->rtcp->expected_prior;
00926 rtp->rtcp->expected_prior = expected;
00927 received_interval = rtp->rxcount - rtp->rtcp->received_prior;
00928 rtp->rtcp->received_prior = rtp->rxcount;
00929 lost_interval = expected_interval - received_interval;
00930
00931 if (lost_interval <= 0)
00932 rtp->rtcp->rxlost = 0;
00933 else rtp->rtcp->rxlost = rtp->rtcp->rxlost;
00934 if (rtp->rtcp->rxlost_count == 0)
00935 rtp->rtcp->minrxlost = rtp->rtcp->rxlost;
00936 if (lost_interval < rtp->rtcp->minrxlost)
00937 rtp->rtcp->minrxlost = rtp->rtcp->rxlost;
00938 if (lost_interval > rtp->rtcp->maxrxlost)
00939 rtp->rtcp->maxrxlost = rtp->rtcp->rxlost;
00940
00941 rxlost_current = normdev_compute(rtp->rtcp->normdev_rxlost, rtp->rtcp->rxlost, rtp->rtcp->rxlost_count);
00942 rtp->rtcp->stdev_rxlost = stddev_compute(rtp->rtcp->stdev_rxlost, rtp->rtcp->rxlost, rtp->rtcp->normdev_rxlost, rxlost_current, rtp->rtcp->rxlost_count);
00943 rtp->rtcp->normdev_rxlost = rxlost_current;
00944 rtp->rtcp->rxlost_count++;
00945
00946 if (expected_interval == 0 || lost_interval <= 0)
00947 fraction = 0;
00948 else
00949 fraction = (lost_interval << 8) / expected_interval;
00950 gettimeofday(&now, NULL);
00951 timersub(&now, &rtp->rtcp->rxlsr, &dlsr);
00952 rtcpheader = (unsigned int *)bdata;
00953 rtcpheader[0] = htonl((2 << 30) | (1 << 24) | (RTCP_PT_RR << 16) | ((len/4)-1));
00954 rtcpheader[1] = htonl(rtp->ssrc);
00955 rtcpheader[2] = htonl(rtp->themssrc);
00956 rtcpheader[3] = htonl(((fraction & 0xff) << 24) | (lost & 0xffffff));
00957 rtcpheader[4] = htonl((rtp->cycles) | ((rtp->lastrxseqno & 0xffff)));
00958 rtcpheader[5] = htonl((unsigned int)(rtp->rxjitter * rate));
00959 rtcpheader[6] = htonl(rtp->rtcp->themrxlsr);
00960 rtcpheader[7] = htonl((((dlsr.tv_sec * 1000) + (dlsr.tv_usec / 1000)) * 65536) / 1000);
00961
00962
00963
00964 rtcpheader[len/4] = htonl((2 << 30) | (1 << 24) | (RTCP_PT_SDES << 16) | 2);
00965 rtcpheader[(len/4)+1] = htonl(rtp->ssrc);
00966 rtcpheader[(len/4)+2] = htonl(0x01 << 24);
00967 len += 12;
00968
00969 res = rtcp_sendto(instance, (unsigned int *)rtcpheader, len, 0, &rtp->rtcp->them);
00970
00971 if (res < 0) {
00972 ast_log(LOG_ERROR, "RTCP RR transmission error, rtcp halted: %s\n",strerror(errno));
00973 return 0;
00974 }
00975
00976 rtp->rtcp->rr_count++;
00977 if (rtcp_debug_test_addr(&rtp->rtcp->them)) {
00978 ast_verbose("\n* Sending RTCP RR to %s\n"
00979 " Our SSRC: %u\nTheir SSRC: %u\niFraction lost: %d\nCumulative loss: %u\n"
00980 " IA jitter: %.4f\n"
00981 " Their last SR: %u\n"
00982 " DLSR: %4.4f (sec)\n\n",
00983 ast_sockaddr_stringify(&rtp->rtcp->them),
00984 rtp->ssrc, rtp->themssrc, fraction, lost,
00985 rtp->rxjitter,
00986 rtp->rtcp->themrxlsr,
00987 (double)(ntohl(rtcpheader[7])/65536.0));
00988 }
00989
00990 return res;
00991 }
00992
00993
00994 static int ast_rtcp_write_sr(struct ast_rtp_instance *instance)
00995 {
00996 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
00997 int res;
00998 int len = 0;
00999 struct timeval now;
01000 unsigned int now_lsw;
01001 unsigned int now_msw;
01002 unsigned int *rtcpheader;
01003 unsigned int lost;
01004 unsigned int extended;
01005 unsigned int expected;
01006 unsigned int expected_interval;
01007 unsigned int received_interval;
01008 int lost_interval;
01009 int fraction;
01010 struct timeval dlsr;
01011 char bdata[512];
01012 int rate = rtp_get_rate(rtp->f.subclass.codec);
01013
01014 if (!rtp || !rtp->rtcp)
01015 return 0;
01016
01017 if (ast_sockaddr_isnull(&rtp->rtcp->them)) {
01018
01019
01020
01021 return 0;
01022 }
01023
01024 gettimeofday(&now, NULL);
01025 timeval2ntp(now, &now_msw, &now_lsw);
01026 rtcpheader = (unsigned int *)bdata;
01027 rtcpheader[1] = htonl(rtp->ssrc);
01028 rtcpheader[2] = htonl(now_msw);
01029 rtcpheader[3] = htonl(now_lsw);
01030 rtcpheader[4] = htonl(rtp->lastts);
01031 rtcpheader[5] = htonl(rtp->txcount);
01032 rtcpheader[6] = htonl(rtp->txoctetcount);
01033 len += 28;
01034
01035 extended = rtp->cycles + rtp->lastrxseqno;
01036 expected = extended - rtp->seedrxseqno + 1;
01037 if (rtp->rxcount > expected)
01038 expected += rtp->rxcount - expected;
01039 lost = expected - rtp->rxcount;
01040 expected_interval = expected - rtp->rtcp->expected_prior;
01041 rtp->rtcp->expected_prior = expected;
01042 received_interval = rtp->rxcount - rtp->rtcp->received_prior;
01043 rtp->rtcp->received_prior = rtp->rxcount;
01044 lost_interval = expected_interval - received_interval;
01045 if (expected_interval == 0 || lost_interval <= 0)
01046 fraction = 0;
01047 else
01048 fraction = (lost_interval << 8) / expected_interval;
01049 timersub(&now, &rtp->rtcp->rxlsr, &dlsr);
01050 rtcpheader[7] = htonl(rtp->themssrc);
01051 rtcpheader[8] = htonl(((fraction & 0xff) << 24) | (lost & 0xffffff));
01052 rtcpheader[9] = htonl((rtp->cycles) | ((rtp->lastrxseqno & 0xffff)));
01053 rtcpheader[10] = htonl((unsigned int)(rtp->rxjitter * rate));
01054 rtcpheader[11] = htonl(rtp->rtcp->themrxlsr);
01055 rtcpheader[12] = htonl((((dlsr.tv_sec * 1000) + (dlsr.tv_usec / 1000)) * 65536) / 1000);
01056 len += 24;
01057
01058 rtcpheader[0] = htonl((2 << 30) | (1 << 24) | (RTCP_PT_SR << 16) | ((len/4)-1));
01059
01060
01061
01062 rtcpheader[len/4] = htonl((2 << 30) | (1 << 24) | (RTCP_PT_SDES << 16) | 2);
01063 rtcpheader[(len/4)+1] = htonl(rtp->ssrc);
01064 rtcpheader[(len/4)+2] = htonl(0x01 << 24);
01065 len += 12;
01066
01067 res = rtcp_sendto(instance, (unsigned int *)rtcpheader, len, 0, &rtp->rtcp->them);
01068 if (res < 0) {
01069 ast_log(LOG_ERROR, "RTCP SR transmission error to %s, rtcp halted %s\n",
01070 ast_sockaddr_stringify(&rtp->rtcp->them),
01071 strerror(errno));
01072 return 0;
01073 }
01074
01075
01076 gettimeofday(&rtp->rtcp->txlsr, NULL);
01077 rtp->rtcp->sr_count++;
01078
01079 rtp->rtcp->lastsrtxcount = rtp->txcount;
01080
01081 if (rtcp_debug_test_addr(&rtp->rtcp->them)) {
01082 ast_verbose("* Sent RTCP SR to %s\n", ast_sockaddr_stringify(&rtp->rtcp->them));
01083 ast_verbose(" Our SSRC: %u\n", rtp->ssrc);
01084 ast_verbose(" Sent(NTP): %u.%010u\n", (unsigned int)now.tv_sec, (unsigned int)now.tv_usec*4096);
01085 ast_verbose(" Sent(RTP): %u\n", rtp->lastts);
01086 ast_verbose(" Sent packets: %u\n", rtp->txcount);
01087 ast_verbose(" Sent octets: %u\n", rtp->txoctetcount);
01088 ast_verbose(" Report block:\n");
01089 ast_verbose(" Fraction lost: %u\n", fraction);
01090 ast_verbose(" Cumulative loss: %u\n", lost);
01091 ast_verbose(" IA jitter: %.4f\n", rtp->rxjitter);
01092 ast_verbose(" Their last SR: %u\n", rtp->rtcp->themrxlsr);
01093 ast_verbose(" DLSR: %4.4f (sec)\n\n", (double)(ntohl(rtcpheader[12])/65536.0));
01094 }
01095 manager_event(EVENT_FLAG_REPORTING, "RTCPSent", "To: %s\r\n"
01096 "OurSSRC: %u\r\n"
01097 "SentNTP: %u.%010u\r\n"
01098 "SentRTP: %u\r\n"
01099 "SentPackets: %u\r\n"
01100 "SentOctets: %u\r\n"
01101 "ReportBlock:\r\n"
01102 "FractionLost: %u\r\n"
01103 "CumulativeLoss: %u\r\n"
01104 "IAJitter: %.4f\r\n"
01105 "TheirLastSR: %u\r\n"
01106 "DLSR: %4.4f (sec)\r\n",
01107 ast_sockaddr_stringify(&rtp->rtcp->them),
01108 rtp->ssrc,
01109 (unsigned int)now.tv_sec, (unsigned int)now.tv_usec*4096,
01110 rtp->lastts,
01111 rtp->txcount,
01112 rtp->txoctetcount,
01113 fraction,
01114 lost,
01115 rtp->rxjitter,
01116 rtp->rtcp->themrxlsr,
01117 (double)(ntohl(rtcpheader[12])/65536.0));
01118 return res;
01119 }
01120
01121
01122
01123
01124 static int ast_rtcp_write(const void *data)
01125 {
01126 struct ast_rtp_instance *instance = (struct ast_rtp_instance *) data;
01127 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
01128 int res;
01129
01130 if (!rtp || !rtp->rtcp || rtp->rtcp->schedid == -1) {
01131 ao2_ref(instance, -1);
01132 return 0;
01133 }
01134
01135 if (rtp->txcount > rtp->rtcp->lastsrtxcount) {
01136 res = ast_rtcp_write_sr(instance);
01137 } else {
01138 res = ast_rtcp_write_rr(instance);
01139 }
01140
01141 if (!res) {
01142
01143
01144
01145 ao2_ref(instance, -1);
01146 rtp->rtcp->schedid = -1;
01147 }
01148
01149 return res;
01150 }
01151
01152 static int ast_rtp_raw_write(struct ast_rtp_instance *instance, struct ast_frame *frame, int codec)
01153 {
01154 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
01155 int pred, mark = 0;
01156 unsigned int ms = calc_txstamp(rtp, &frame->delivery);
01157 struct ast_sockaddr remote_address = { {0,} };
01158 int rate = rtp_get_rate(frame->subclass.codec) / 1000;
01159
01160 if (frame->subclass.codec == AST_FORMAT_G722) {
01161 frame->samples /= 2;
01162 }
01163
01164 if (rtp->sending_digit) {
01165 return 0;
01166 }
01167
01168 if (frame->frametype == AST_FRAME_VOICE) {
01169 pred = rtp->lastts + frame->samples;
01170
01171
01172 rtp->lastts = rtp->lastts + ms * rate;
01173 if (ast_tvzero(frame->delivery)) {
01174
01175
01176 if (abs(rtp->lastts - pred) < MAX_TIMESTAMP_SKEW) {
01177 rtp->lastts = pred;
01178 } else {
01179 ast_debug(3, "Difference is %d, ms is %d\n", abs(rtp->lastts - pred), ms);
01180 mark = 1;
01181 }
01182 }
01183 } else if (frame->frametype == AST_FRAME_VIDEO) {
01184 mark = frame->subclass.codec & 0x1;
01185 pred = rtp->lastovidtimestamp + frame->samples;
01186
01187 rtp->lastts = rtp->lastts + ms * 90;
01188
01189 if (ast_tvzero(frame->delivery)) {
01190 if (abs(rtp->lastts - pred) < 7200) {
01191 rtp->lastts = pred;
01192 rtp->lastovidtimestamp += frame->samples;
01193 } else {
01194 ast_debug(3, "Difference is %d, ms is %d (%d), pred/ts/samples %d/%d/%d\n", abs(rtp->lastts - pred), ms, ms * 90, rtp->lastts, pred, frame->samples);
01195 rtp->lastovidtimestamp = rtp->lastts;
01196 }
01197 }
01198 } else {
01199 pred = rtp->lastotexttimestamp + frame->samples;
01200
01201 rtp->lastts = rtp->lastts + ms;
01202
01203 if (ast_tvzero(frame->delivery)) {
01204 if (abs(rtp->lastts - pred) < 7200) {
01205 rtp->lastts = pred;
01206 rtp->lastotexttimestamp += frame->samples;
01207 } else {
01208 ast_debug(3, "Difference is %d, ms is %d, pred/ts/samples %d/%d/%d\n", abs(rtp->lastts - pred), ms, rtp->lastts, pred, frame->samples);
01209 rtp->lastotexttimestamp = rtp->lastts;
01210 }
01211 }
01212 }
01213
01214
01215 if (ast_test_flag(rtp, FLAG_NEED_MARKER_BIT)) {
01216 mark = 1;
01217 ast_clear_flag(rtp, FLAG_NEED_MARKER_BIT);
01218 }
01219
01220
01221 if (rtp->lastts > rtp->lastdigitts) {
01222 rtp->lastdigitts = rtp->lastts;
01223 }
01224
01225 if (ast_test_flag(frame, AST_FRFLAG_HAS_TIMING_INFO)) {
01226 rtp->lastts = frame->ts * rate;
01227 }
01228
01229 ast_rtp_instance_get_remote_address(instance, &remote_address);
01230
01231
01232 if (!ast_sockaddr_isnull(&remote_address)) {
01233 int hdrlen = 12, res;
01234 unsigned char *rtpheader = (unsigned char *)(frame->data.ptr - hdrlen);
01235
01236 put_unaligned_uint32(rtpheader, htonl((2 << 30) | (codec << 16) | (rtp->seqno) | (mark << 23)));
01237 put_unaligned_uint32(rtpheader + 4, htonl(rtp->lastts));
01238 put_unaligned_uint32(rtpheader + 8, htonl(rtp->ssrc));
01239
01240 if ((res = rtp_sendto(instance, (void *)rtpheader, frame->datalen + hdrlen, 0, &remote_address)) < 0) {
01241 if (!ast_rtp_instance_get_prop(instance, AST_RTP_PROPERTY_NAT) || (ast_rtp_instance_get_prop(instance, AST_RTP_PROPERTY_NAT) && (ast_test_flag(rtp, FLAG_NAT_ACTIVE) == FLAG_NAT_ACTIVE))) {
01242 ast_debug(1, "RTP Transmission error of packet %d to %s: %s\n",
01243 rtp->seqno,
01244 ast_sockaddr_stringify(&remote_address),
01245 strerror(errno));
01246 } else if (((ast_test_flag(rtp, FLAG_NAT_ACTIVE) == FLAG_NAT_INACTIVE) || rtpdebug) && !ast_test_flag(rtp, FLAG_NAT_INACTIVE_NOWARN)) {
01247
01248 if (option_debug || rtpdebug)
01249 ast_debug(0, "RTP NAT: Can't write RTP to private address %s, waiting for other end to send audio...\n",
01250 ast_sockaddr_stringify(&remote_address));
01251 ast_set_flag(rtp, FLAG_NAT_INACTIVE_NOWARN);
01252 }
01253 } else {
01254 rtp->txcount++;
01255 rtp->txoctetcount += (res - hdrlen);
01256
01257 if (rtp->rtcp && rtp->rtcp->schedid < 1) {
01258 ast_debug(1, "Starting RTCP transmission on RTP instance '%p'\n", instance);
01259 ao2_ref(instance, +1);
01260 rtp->rtcp->schedid = ast_sched_add(rtp->sched, ast_rtcp_calc_interval(rtp), ast_rtcp_write, instance);
01261 if (rtp->rtcp->schedid < 0) {
01262 ao2_ref(instance, -1);
01263 ast_log(LOG_WARNING, "scheduling RTCP transmission failed.\n");
01264 }
01265 }
01266 }
01267
01268 if (rtp_debug_test_addr(&remote_address)) {
01269 ast_verbose("Sent RTP packet to %s (type %-2.2d, seq %-6.6u, ts %-6.6u, len %-6.6u)\n",
01270 ast_sockaddr_stringify(&remote_address),
01271 codec, rtp->seqno, rtp->lastts, res - hdrlen);
01272 }
01273 }
01274
01275 rtp->seqno++;
01276
01277 return 0;
01278 }
01279
01280 static struct ast_frame *red_t140_to_red(struct rtp_red *red) {
01281 unsigned char *data = red->t140red.data.ptr;
01282 int len = 0;
01283 int i;
01284
01285
01286 if (red->len[0]) {
01287 for (i = 1; i < red->num_gen+1; i++)
01288 len += red->len[i];
01289
01290 memmove(&data[red->hdrlen], &data[red->hdrlen+red->len[0]], len);
01291 }
01292
01293
01294 for (i = 0; i < red->num_gen; i++)
01295 red->len[i] = red->len[i+1];
01296 red->len[i] = red->t140.datalen;
01297
01298
01299 len = red->hdrlen;
01300 for (i = 0; i < red->num_gen; i++)
01301 len += data[i*4+3] = red->len[i];
01302
01303
01304 memcpy(&data[len], red->t140.data.ptr, red->t140.datalen);
01305 red->t140red.datalen = len + red->t140.datalen;
01306
01307
01308 if (len == red->hdrlen && !red->t140.datalen)
01309 return NULL;
01310
01311
01312 red->t140.datalen = 0;
01313
01314 return &red->t140red;
01315 }
01316
01317 static int ast_rtp_write(struct ast_rtp_instance *instance, struct ast_frame *frame)
01318 {
01319 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
01320 struct ast_sockaddr remote_address = { {0,} };
01321 format_t codec, subclass;
01322
01323 ast_rtp_instance_get_remote_address(instance, &remote_address);
01324
01325
01326 if (ast_sockaddr_isnull(&remote_address)) {
01327 ast_debug(1, "No remote address on RTP instance '%p' so dropping frame\n", instance);
01328 return 0;
01329 }
01330
01331
01332 if (!frame->datalen) {
01333 ast_debug(1, "Received frame with no data for RTP instance '%p' so dropping frame\n", instance);
01334 return 0;
01335 }
01336
01337
01338 if (frame->frametype != AST_FRAME_VOICE && frame->frametype != AST_FRAME_VIDEO && frame->frametype != AST_FRAME_TEXT) {
01339 ast_log(LOG_WARNING, "RTP can only send voice, video, and text\n");
01340 return -1;
01341 }
01342
01343 if (rtp->red) {
01344
01345
01346 if ((frame = red_t140_to_red(rtp->red)) == NULL)
01347 return 0;
01348 }
01349
01350
01351 subclass = frame->subclass.codec;
01352 if (frame->frametype == AST_FRAME_VIDEO) {
01353 subclass &= ~0x1LL;
01354 }
01355 if ((codec = ast_rtp_codecs_payload_code(ast_rtp_instance_get_codecs(instance), 1, subclass)) < 0) {
01356 ast_log(LOG_WARNING, "Don't know how to send format %s packets with RTP\n", ast_getformatname(frame->subclass.codec));
01357 return -1;
01358 }
01359
01360
01361 if (rtp->lasttxformat != subclass) {
01362 ast_debug(1, "Ooh, format changed from %s to %s\n", ast_getformatname(rtp->lasttxformat), ast_getformatname(subclass));
01363 rtp->lasttxformat = subclass;
01364 if (rtp->smoother) {
01365 ast_smoother_free(rtp->smoother);
01366 rtp->smoother = NULL;
01367 }
01368 }
01369
01370
01371 if (!rtp->smoother) {
01372 struct ast_format_list fmt = ast_codec_pref_getsize(&ast_rtp_instance_get_codecs(instance)->pref, subclass);
01373
01374 switch (subclass) {
01375 case AST_FORMAT_SPEEX:
01376 case AST_FORMAT_SPEEX16:
01377 case AST_FORMAT_G723_1:
01378 case AST_FORMAT_SIREN7:
01379 case AST_FORMAT_SIREN14:
01380 case AST_FORMAT_G719:
01381
01382
01383 break;
01384 default:
01385 if (fmt.inc_ms) {
01386 if (!(rtp->smoother = ast_smoother_new((fmt.cur_ms * fmt.fr_len) / fmt.inc_ms))) {
01387 ast_log(LOG_WARNING, "Unable to create smoother: format %s ms: %d len: %d\n", ast_getformatname(subclass), fmt.cur_ms, ((fmt.cur_ms * fmt.fr_len) / fmt.inc_ms));
01388 return -1;
01389 }
01390 if (fmt.flags) {
01391 ast_smoother_set_flags(rtp->smoother, fmt.flags);
01392 }
01393 ast_debug(1, "Created smoother: format: %s ms: %d len: %d\n", ast_getformatname(subclass), fmt.cur_ms, ((fmt.cur_ms * fmt.fr_len) / fmt.inc_ms));
01394 }
01395 }
01396 }
01397
01398
01399 if (rtp->smoother) {
01400 struct ast_frame *f;
01401
01402 if (ast_smoother_test_flag(rtp->smoother, AST_SMOOTHER_FLAG_BE)) {
01403 ast_smoother_feed_be(rtp->smoother, frame);
01404 } else {
01405 ast_smoother_feed(rtp->smoother, frame);
01406 }
01407
01408 while ((f = ast_smoother_read(rtp->smoother)) && (f->data.ptr)) {
01409 ast_rtp_raw_write(instance, f, codec);
01410 }
01411 } else {
01412 int hdrlen = 12;
01413 struct ast_frame *f = NULL;
01414
01415 if (frame->offset < hdrlen) {
01416 f = ast_frdup(frame);
01417 } else {
01418 f = frame;
01419 }
01420 if (f->data.ptr) {
01421 ast_rtp_raw_write(instance, f, codec);
01422 }
01423 if (f != frame) {
01424 ast_frfree(f);
01425 }
01426
01427 }
01428
01429 return 0;
01430 }
01431
01432 static void calc_rxstamp(struct timeval *tv, struct ast_rtp *rtp, unsigned int timestamp, int mark)
01433 {
01434 struct timeval now;
01435 struct timeval tmp;
01436 double transit;
01437 double current_time;
01438 double d;
01439 double dtv;
01440 double prog;
01441 int rate = rtp_get_rate(rtp->f.subclass.codec);
01442
01443 double normdev_rxjitter_current;
01444 if ((!rtp->rxcore.tv_sec && !rtp->rxcore.tv_usec) || mark) {
01445 gettimeofday(&rtp->rxcore, NULL);
01446 rtp->drxcore = (double) rtp->rxcore.tv_sec + (double) rtp->rxcore.tv_usec / 1000000;
01447
01448 rtp->seedrxts = timestamp;
01449 tmp = ast_samp2tv(timestamp, rate);
01450 rtp->rxcore = ast_tvsub(rtp->rxcore, tmp);
01451
01452 rtp->rxcore.tv_usec -= rtp->rxcore.tv_usec % 100;
01453 }
01454
01455 gettimeofday(&now,NULL);
01456
01457 tmp = ast_samp2tv(timestamp, rate);
01458 *tv = ast_tvadd(rtp->rxcore, tmp);
01459
01460 prog = (double)((timestamp-rtp->seedrxts)/(float)(rate));
01461 dtv = (double)rtp->drxcore + (double)(prog);
01462 current_time = (double)now.tv_sec + (double)now.tv_usec/1000000;
01463 transit = current_time - dtv;
01464 d = transit - rtp->rxtransit;
01465 rtp->rxtransit = transit;
01466 if (d<0)
01467 d=-d;
01468 rtp->rxjitter += (1./16.) * (d - rtp->rxjitter);
01469
01470 if (rtp->rtcp) {
01471 if (rtp->rxjitter > rtp->rtcp->maxrxjitter)
01472 rtp->rtcp->maxrxjitter = rtp->rxjitter;
01473 if (rtp->rtcp->rxjitter_count == 1)
01474 rtp->rtcp->minrxjitter = rtp->rxjitter;
01475 if (rtp->rtcp && rtp->rxjitter < rtp->rtcp->minrxjitter)
01476 rtp->rtcp->minrxjitter = rtp->rxjitter;
01477
01478 normdev_rxjitter_current = normdev_compute(rtp->rtcp->normdev_rxjitter,rtp->rxjitter,rtp->rtcp->rxjitter_count);
01479 rtp->rtcp->stdev_rxjitter = stddev_compute(rtp->rtcp->stdev_rxjitter,rtp->rxjitter,rtp->rtcp->normdev_rxjitter,normdev_rxjitter_current,rtp->rtcp->rxjitter_count);
01480
01481 rtp->rtcp->normdev_rxjitter = normdev_rxjitter_current;
01482 rtp->rtcp->rxjitter_count++;
01483 }
01484 }
01485
01486 static struct ast_frame *create_dtmf_frame(struct ast_rtp_instance *instance, enum ast_frame_type type, int compensate)
01487 {
01488 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
01489 struct ast_sockaddr remote_address = { {0,} };
01490
01491 ast_rtp_instance_get_remote_address(instance, &remote_address);
01492
01493 if (((compensate && type == AST_FRAME_DTMF_END) || (type == AST_FRAME_DTMF_BEGIN)) && ast_tvcmp(ast_tvnow(), rtp->dtmfmute) < 0) {
01494 ast_debug(1, "Ignore potential DTMF echo from '%s'\n",
01495 ast_sockaddr_stringify(&remote_address));
01496 rtp->resp = 0;
01497 rtp->dtmfsamples = 0;
01498 return &ast_null_frame;
01499 }
01500 ast_debug(1, "Creating %s DTMF Frame: %d (%c), at %s\n",
01501 type == AST_FRAME_DTMF_END ? "END" : "BEGIN",
01502 rtp->resp, rtp->resp,
01503 ast_sockaddr_stringify(&remote_address));
01504 if (rtp->resp == 'X') {
01505 rtp->f.frametype = AST_FRAME_CONTROL;
01506 rtp->f.subclass.integer = AST_CONTROL_FLASH;
01507 } else {
01508 rtp->f.frametype = type;
01509 rtp->f.subclass.integer = rtp->resp;
01510 }
01511 rtp->f.datalen = 0;
01512 rtp->f.samples = 0;
01513 rtp->f.mallocd = 0;
01514 rtp->f.src = "RTP";
01515 AST_LIST_NEXT(&rtp->f, frame_list) = NULL;
01516
01517 return &rtp->f;
01518 }
01519
01520 static void process_dtmf_rfc2833(struct ast_rtp_instance *instance, unsigned char *data, int len, unsigned int seqno, unsigned int timestamp, struct ast_sockaddr *addr, int payloadtype, int mark, struct frame_list *frames)
01521 {
01522 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
01523 struct ast_sockaddr remote_address = { {0,} };
01524 unsigned int event, event_end, samples;
01525 char resp = 0;
01526 struct ast_frame *f = NULL;
01527
01528 ast_rtp_instance_get_remote_address(instance, &remote_address);
01529
01530
01531 event = ntohl(*((unsigned int *)(data)));
01532 event >>= 24;
01533 event_end = ntohl(*((unsigned int *)(data)));
01534 event_end <<= 8;
01535 event_end >>= 24;
01536 samples = ntohl(*((unsigned int *)(data)));
01537 samples &= 0xFFFF;
01538
01539 if (rtp_debug_test_addr(&remote_address)) {
01540 ast_verbose("Got RTP RFC2833 from %s (type %-2.2d, seq %-6.6u, ts %-6.6u, len %-6.6u, mark %d, event %08x, end %d, duration %-5.5d) \n",
01541 ast_sockaddr_stringify(&remote_address),
01542 payloadtype, seqno, timestamp, len, (mark?1:0), event, ((event_end & 0x80)?1:0), samples);
01543 }
01544
01545
01546 if (rtpdebug || option_debug > 2)
01547 ast_debug(0, "- RTP 2833 Event: %08x (len = %d)\n", event, len);
01548
01549
01550 if (event < 10) {
01551 resp = '0' + event;
01552 } else if (event < 11) {
01553 resp = '*';
01554 } else if (event < 12) {
01555 resp = '#';
01556 } else if (event < 16) {
01557 resp = 'A' + (event - 12);
01558 } else if (event < 17) {
01559 resp = 'X';
01560 } else {
01561
01562 ast_log(LOG_DEBUG, "Ignoring RTP 2833 Event: %08x. Not a DTMF Digit.\n", event);
01563 return;
01564 }
01565
01566 if (ast_rtp_instance_get_prop(instance, AST_RTP_PROPERTY_DTMF_COMPENSATE)) {
01567 if ((rtp->last_end_timestamp != timestamp) || (rtp->resp && rtp->resp != resp)) {
01568 rtp->resp = resp;
01569 rtp->dtmf_timeout = 0;
01570 f = ast_frdup(create_dtmf_frame(instance, AST_FRAME_DTMF_END, ast_rtp_instance_get_prop(instance, AST_RTP_PROPERTY_DTMF_COMPENSATE)));
01571 f->len = 0;
01572 rtp->last_end_timestamp = timestamp;
01573 AST_LIST_INSERT_TAIL(frames, f, frame_list);
01574 }
01575 } else {
01576
01577
01578
01579
01580
01581 unsigned int new_duration = rtp->dtmf_duration;
01582 unsigned int last_duration = new_duration & 0xFFFF;
01583
01584 if (last_duration > 64000 && samples < last_duration) {
01585 new_duration += 0xFFFF + 1;
01586 }
01587 new_duration = (new_duration & ~0xFFFF) | samples;
01588
01589 if (event_end & 0x80) {
01590 if ((seqno != rtp->last_seqno) && (timestamp > rtp->last_end_timestamp)) {
01591 rtp->last_end_timestamp = timestamp;
01592 rtp->dtmf_duration = new_duration;
01593 rtp->resp = resp;
01594 f = ast_frdup(create_dtmf_frame(instance, AST_FRAME_DTMF_END, 0));
01595 f->len = ast_tvdiff_ms(ast_samp2tv(rtp->dtmf_duration, rtp_get_rate(f->subclass.codec)), ast_tv(0, 0));
01596 rtp->resp = 0;
01597 rtp->dtmf_duration = rtp->dtmf_timeout = 0;
01598 AST_LIST_INSERT_TAIL(frames, f, frame_list);
01599 } else if (rtpdebug) {
01600 ast_debug(1, "Dropping re-transmitted, duplicate, or out of order DTMF END frame (seqno: %d, ts %d, digit %c)\n",
01601 seqno, timestamp, resp);
01602 }
01603 } else {
01604
01605
01606
01607
01608
01609
01610 if ((rtp->last_seqno > seqno && rtp->last_seqno - seqno < 50)
01611 || timestamp <= rtp->last_end_timestamp) {
01612
01613
01614
01615
01616 if (rtpdebug) {
01617 ast_debug(1, "Dropping out of order DTMF frame (seqno %d, ts %d, digit %c)\n",
01618 seqno, timestamp, resp);
01619 }
01620 return;
01621 }
01622
01623 if (rtp->resp && rtp->resp != resp) {
01624
01625 f = ast_frdup(create_dtmf_frame(instance, AST_FRAME_DTMF_END, 0));
01626 f->len = ast_tvdiff_ms(ast_samp2tv(rtp->dtmf_duration, rtp_get_rate(f->subclass.codec)), ast_tv(0, 0));
01627 rtp->resp = 0;
01628 rtp->dtmf_duration = rtp->dtmf_timeout = 0;
01629 AST_LIST_INSERT_TAIL(frames, f, frame_list);
01630 }
01631
01632 if (rtp->resp) {
01633
01634 rtp->dtmf_duration = new_duration;
01635 } else {
01636
01637 rtp->resp = resp;
01638 f = ast_frdup(create_dtmf_frame(instance, AST_FRAME_DTMF_BEGIN, 0));
01639 rtp->dtmf_duration = samples;
01640 AST_LIST_INSERT_TAIL(frames, f, frame_list);
01641 }
01642
01643 rtp->dtmf_timeout = timestamp + rtp->dtmf_duration + dtmftimeout;
01644 }
01645
01646 rtp->last_seqno = seqno;
01647 }
01648
01649 rtp->dtmfsamples = samples;
01650
01651 return;
01652 }
01653
01654 static struct ast_frame *process_dtmf_cisco(struct ast_rtp_instance *instance, unsigned char *data, int len, unsigned int seqno, unsigned int timestamp, struct ast_sockaddr *addr, int payloadtype, int mark)
01655 {
01656 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
01657 unsigned int event, flags, power;
01658 char resp = 0;
01659 unsigned char seq;
01660 struct ast_frame *f = NULL;
01661
01662 if (len < 4) {
01663 return NULL;
01664 }
01665
01666
01667
01668
01669
01670
01671
01672
01673
01674
01675
01676
01677
01678
01679
01680
01681
01682
01683
01684
01685
01686
01687
01688
01689
01690
01691
01692
01693
01694
01695
01696 seq = data[0];
01697 flags = data[1];
01698 power = data[2];
01699 event = data[3] & 0x1f;
01700
01701 if (option_debug > 2 || rtpdebug)
01702 ast_debug(0, "Cisco DTMF Digit: %02x (len=%d, seq=%d, flags=%02x, power=%d, history count=%d)\n", event, len, seq, flags, power, (len - 4) / 2);
01703 if (event < 10) {
01704 resp = '0' + event;
01705 } else if (event < 11) {
01706 resp = '*';
01707 } else if (event < 12) {
01708 resp = '#';
01709 } else if (event < 16) {
01710 resp = 'A' + (event - 12);
01711 } else if (event < 17) {
01712 resp = 'X';
01713 }
01714 if ((!rtp->resp && power) || (rtp->resp && (rtp->resp != resp))) {
01715 rtp->resp = resp;
01716
01717 if (ast_rtp_instance_get_prop(instance, AST_RTP_PROPERTY_DTMF_COMPENSATE)) {
01718 f = create_dtmf_frame(instance, AST_FRAME_DTMF_BEGIN, 0);
01719 rtp->dtmfsamples = 0;
01720 }
01721 } else if ((rtp->resp == resp) && !power) {
01722 f = create_dtmf_frame(instance, AST_FRAME_DTMF_END, ast_rtp_instance_get_prop(instance, AST_RTP_PROPERTY_DTMF_COMPENSATE));
01723 f->samples = rtp->dtmfsamples * (rtp->lastrxformat ? (rtp_get_rate(rtp->lastrxformat) / 1000) : 8);
01724 rtp->resp = 0;
01725 } else if (rtp->resp == resp)
01726 rtp->dtmfsamples += 20 * (rtp->lastrxformat ? (rtp_get_rate(rtp->lastrxformat) / 1000) : 8);
01727
01728 rtp->dtmf_timeout = 0;
01729
01730 return f;
01731 }
01732
01733 static struct ast_frame *process_cn_rfc3389(struct ast_rtp_instance *instance, unsigned char *data, int len, unsigned int seqno, unsigned int timestamp, struct ast_sockaddr *addr, int payloadtype, int mark)
01734 {
01735 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
01736
01737
01738
01739
01740 if (rtpdebug)
01741 ast_debug(0, "- RTP 3389 Comfort noise event: Level %" PRId64 " (len = %d)\n", rtp->lastrxformat, len);
01742
01743 if (ast_test_flag(rtp, FLAG_3389_WARNING)) {
01744 struct ast_sockaddr remote_address = { {0,} };
01745
01746 ast_rtp_instance_get_remote_address(instance, &remote_address);
01747
01748 ast_log(LOG_NOTICE, "Comfort noise support incomplete in Asterisk (RFC 3389). Please turn off on client if possible. Client address: %s\n",
01749 ast_sockaddr_stringify(&remote_address));
01750 ast_set_flag(rtp, FLAG_3389_WARNING);
01751 }
01752
01753
01754 if (!len)
01755 return NULL;
01756 if (len < 24) {
01757 rtp->f.data.ptr = rtp->rawdata + AST_FRIENDLY_OFFSET;
01758 rtp->f.datalen = len - 1;
01759 rtp->f.offset = AST_FRIENDLY_OFFSET;
01760 memcpy(rtp->f.data.ptr, data + 1, len - 1);
01761 } else {
01762 rtp->f.data.ptr = NULL;
01763 rtp->f.offset = 0;
01764 rtp->f.datalen = 0;
01765 }
01766 rtp->f.frametype = AST_FRAME_CNG;
01767 rtp->f.subclass.integer = data[0] & 0x7f;
01768 rtp->f.samples = 0;
01769 rtp->f.delivery.tv_usec = rtp->f.delivery.tv_sec = 0;
01770
01771 return &rtp->f;
01772 }
01773
01774 static struct ast_frame *ast_rtcp_read(struct ast_rtp_instance *instance)
01775 {
01776 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
01777 struct ast_sockaddr addr;
01778 unsigned int rtcpdata[8192 + AST_FRIENDLY_OFFSET];
01779 unsigned int *rtcpheader = (unsigned int *)(rtcpdata + AST_FRIENDLY_OFFSET);
01780 int res, packetwords, position = 0;
01781 struct ast_frame *f = &ast_null_frame;
01782
01783
01784 if ((res = rtcp_recvfrom(instance, rtcpdata + AST_FRIENDLY_OFFSET,
01785 sizeof(rtcpdata) - sizeof(unsigned int) * AST_FRIENDLY_OFFSET,
01786 0, &addr)) < 0) {
01787 ast_assert(errno != EBADF);
01788 if (errno != EAGAIN) {
01789 ast_log(LOG_WARNING, "RTCP Read error: %s. Hanging up.\n", strerror(errno));
01790 return NULL;
01791 }
01792 return &ast_null_frame;
01793 }
01794
01795 packetwords = res / 4;
01796
01797 if (ast_rtp_instance_get_prop(instance, AST_RTP_PROPERTY_NAT)) {
01798
01799 if (ast_sockaddr_cmp(&rtp->rtcp->them, &addr)) {
01800 ast_sockaddr_copy(&rtp->rtcp->them, &addr);
01801 if (option_debug || rtpdebug)
01802 ast_debug(0, "RTCP NAT: Got RTCP from other end. Now sending to address %s\n",
01803 ast_sockaddr_stringify(&rtp->rtcp->them));
01804 }
01805 }
01806
01807 ast_debug(1, "Got RTCP report of %d bytes\n", res);
01808
01809 while (position < packetwords) {
01810 int i, pt, rc;
01811 unsigned int length, dlsr, lsr, msw, lsw, comp;
01812 struct timeval now;
01813 double rttsec, reported_jitter, reported_normdev_jitter_current, normdevrtt_current, reported_lost, reported_normdev_lost_current;
01814 uint64_t rtt = 0;
01815
01816 i = position;
01817 length = ntohl(rtcpheader[i]);
01818 pt = (length & 0xff0000) >> 16;
01819 rc = (length & 0x1f000000) >> 24;
01820 length &= 0xffff;
01821
01822 if ((i + length) > packetwords) {
01823 if (option_debug || rtpdebug)
01824 ast_log(LOG_DEBUG, "RTCP Read too short\n");
01825 return &ast_null_frame;
01826 }
01827
01828 if (rtcp_debug_test_addr(&addr)) {
01829 ast_verbose("\n\nGot RTCP from %s\n",
01830 ast_sockaddr_stringify(&addr));
01831 ast_verbose("PT: %d(%s)\n", pt, (pt == 200) ? "Sender Report" : (pt == 201) ? "Receiver Report" : (pt == 192) ? "H.261 FUR" : "Unknown");
01832 ast_verbose("Reception reports: %d\n", rc);
01833 ast_verbose("SSRC of sender: %u\n", rtcpheader[i + 1]);
01834 }
01835
01836 i += 2;
01837 if (rc == 0 && pt == RTCP_PT_RR) {
01838 position += (length + 1);
01839 continue;
01840 }
01841
01842 switch (pt) {
01843 case RTCP_PT_SR:
01844 gettimeofday(&rtp->rtcp->rxlsr,NULL);
01845 rtp->rtcp->spc = ntohl(rtcpheader[i+3]);
01846 rtp->rtcp->soc = ntohl(rtcpheader[i + 4]);
01847 rtp->rtcp->themrxlsr = ((ntohl(rtcpheader[i]) & 0x0000ffff) << 16) | ((ntohl(rtcpheader[i + 1]) & 0xffff0000) >> 16);
01848
01849 if (rtcp_debug_test_addr(&addr)) {
01850 ast_verbose("NTP timestamp: %lu.%010lu\n", (unsigned long) ntohl(rtcpheader[i]), (unsigned long) ntohl(rtcpheader[i + 1]) * 4096);
01851 ast_verbose("RTP timestamp: %lu\n", (unsigned long) ntohl(rtcpheader[i + 2]));
01852 ast_verbose("SPC: %lu\tSOC: %lu\n", (unsigned long) ntohl(rtcpheader[i + 3]), (unsigned long) ntohl(rtcpheader[i + 4]));
01853 }
01854 i += 5;
01855 if (rc < 1)
01856 break;
01857
01858 case RTCP_PT_RR:
01859
01860
01861 gettimeofday(&now, NULL);
01862 timeval2ntp(now, &msw, &lsw);
01863 if (ntohl(rtcpheader[i + 4]) && ntohl(rtcpheader[i + 5])) {
01864 comp = ((msw & 0xffff) << 16) | ((lsw & 0xffff0000) >> 16);
01865 lsr = ntohl(rtcpheader[i + 4]);
01866 dlsr = ntohl(rtcpheader[i + 5]);
01867 rtt = comp - lsr - dlsr;
01868
01869
01870
01871 if (rtt < 4294) {
01872 rtt = (rtt * 1000000) >> 16;
01873 } else {
01874 rtt = (rtt * 1000) >> 16;
01875 rtt *= 1000;
01876 }
01877 rtt = rtt / 1000.;
01878 rttsec = rtt / 1000.;
01879 rtp->rtcp->rtt = rttsec;
01880
01881 if (comp - dlsr >= lsr) {
01882 rtp->rtcp->accumulated_transit += rttsec;
01883
01884 if (rtp->rtcp->rtt_count == 0)
01885 rtp->rtcp->minrtt = rttsec;
01886
01887 if (rtp->rtcp->maxrtt<rttsec)
01888 rtp->rtcp->maxrtt = rttsec;
01889 if (rtp->rtcp->minrtt>rttsec)
01890 rtp->rtcp->minrtt = rttsec;
01891
01892 normdevrtt_current = normdev_compute(rtp->rtcp->normdevrtt, rttsec, rtp->rtcp->rtt_count);
01893
01894 rtp->rtcp->stdevrtt = stddev_compute(rtp->rtcp->stdevrtt, rttsec, rtp->rtcp->normdevrtt, normdevrtt_current, rtp->rtcp->rtt_count);
01895
01896 rtp->rtcp->normdevrtt = normdevrtt_current;
01897
01898 rtp->rtcp->rtt_count++;
01899 } else if (rtcp_debug_test_addr(&addr)) {
01900 ast_verbose("Internal RTCP NTP clock skew detected: "
01901 "lsr=%u, now=%u, dlsr=%u (%d:%03dms), "
01902 "diff=%d\n",
01903 lsr, comp, dlsr, dlsr / 65536,
01904 (dlsr % 65536) * 1000 / 65536,
01905 dlsr - (comp - lsr));
01906 }
01907 }
01908
01909 rtp->rtcp->reported_jitter = ntohl(rtcpheader[i + 3]);
01910 reported_jitter = (double) rtp->rtcp->reported_jitter;
01911
01912 if (rtp->rtcp->reported_jitter_count == 0)
01913 rtp->rtcp->reported_minjitter = reported_jitter;
01914
01915 if (reported_jitter < rtp->rtcp->reported_minjitter)
01916 rtp->rtcp->reported_minjitter = reported_jitter;
01917
01918 if (reported_jitter > rtp->rtcp->reported_maxjitter)
01919 rtp->rtcp->reported_maxjitter = reported_jitter;
01920
01921 reported_normdev_jitter_current = normdev_compute(rtp->rtcp->reported_normdev_jitter, reported_jitter, rtp->rtcp->reported_jitter_count);
01922
01923 rtp->rtcp->reported_stdev_jitter = stddev_compute(rtp->rtcp->reported_stdev_jitter, reported_jitter, rtp->rtcp->reported_normdev_jitter, reported_normdev_jitter_current, rtp->rtcp->reported_jitter_count);
01924
01925 rtp->rtcp->reported_normdev_jitter = reported_normdev_jitter_current;
01926
01927 rtp->rtcp->reported_lost = ntohl(rtcpheader[i + 1]) & 0xffffff;
01928
01929 reported_lost = (double) rtp->rtcp->reported_lost;
01930
01931
01932 if (rtp->rtcp->reported_jitter_count == 0)
01933 rtp->rtcp->reported_minlost = reported_lost;
01934
01935 if (reported_lost < rtp->rtcp->reported_minlost)
01936 rtp->rtcp->reported_minlost = reported_lost;
01937
01938 if (reported_lost > rtp->rtcp->reported_maxlost)
01939 rtp->rtcp->reported_maxlost = reported_lost;
01940 reported_normdev_lost_current = normdev_compute(rtp->rtcp->reported_normdev_lost, reported_lost, rtp->rtcp->reported_jitter_count);
01941
01942 rtp->rtcp->reported_stdev_lost = stddev_compute(rtp->rtcp->reported_stdev_lost, reported_lost, rtp->rtcp->reported_normdev_lost, reported_normdev_lost_current, rtp->rtcp->reported_jitter_count);
01943
01944 rtp->rtcp->reported_normdev_lost = reported_normdev_lost_current;
01945
01946 rtp->rtcp->reported_jitter_count++;
01947
01948 if (rtcp_debug_test_addr(&addr)) {
01949 ast_verbose(" Fraction lost: %ld\n", (((long) ntohl(rtcpheader[i + 1]) & 0xff000000) >> 24));
01950 ast_verbose(" Packets lost so far: %d\n", rtp->rtcp->reported_lost);
01951 ast_verbose(" Highest sequence number: %ld\n", (long) (ntohl(rtcpheader[i + 2]) & 0xffff));
01952 ast_verbose(" Sequence number cycles: %ld\n", (long) (ntohl(rtcpheader[i + 2])) >> 16);
01953 ast_verbose(" Interarrival jitter: %u\n", rtp->rtcp->reported_jitter);
01954 ast_verbose(" Last SR(our NTP): %lu.%010lu\n",(unsigned long) ntohl(rtcpheader[i + 4]) >> 16,((unsigned long) ntohl(rtcpheader[i + 4]) << 16) * 4096);
01955 ast_verbose(" DLSR: %4.4f (sec)\n",ntohl(rtcpheader[i + 5])/65536.0);
01956 if (rtt)
01957 ast_verbose(" RTT: %lu(sec)\n", (unsigned long) rtt);
01958 }
01959 if (rtt) {
01960 manager_event(EVENT_FLAG_REPORTING, "RTCPReceived", "From: %s\r\n"
01961 "PT: %d(%s)\r\n"
01962 "ReceptionReports: %d\r\n"
01963 "SenderSSRC: %u\r\n"
01964 "FractionLost: %ld\r\n"
01965 "PacketsLost: %d\r\n"
01966 "HighestSequence: %ld\r\n"
01967 "SequenceNumberCycles: %ld\r\n"
01968 "IAJitter: %u\r\n"
01969 "LastSR: %lu.%010lu\r\n"
01970 "DLSR: %4.4f(sec)\r\n"
01971 "RTT: %llu(sec)\r\n",
01972 ast_sockaddr_stringify(&addr),
01973 pt, (pt == 200) ? "Sender Report" : (pt == 201) ? "Receiver Report" : (pt == 192) ? "H.261 FUR" : "Unknown",
01974 rc,
01975 rtcpheader[i + 1],
01976 (((long) ntohl(rtcpheader[i + 1]) & 0xff000000) >> 24),
01977 rtp->rtcp->reported_lost,
01978 (long) (ntohl(rtcpheader[i + 2]) & 0xffff),
01979 (long) (ntohl(rtcpheader[i + 2])) >> 16,
01980 rtp->rtcp->reported_jitter,
01981 (unsigned long) ntohl(rtcpheader[i + 4]) >> 16, ((unsigned long) ntohl(rtcpheader[i + 4]) << 16) * 4096,
01982 ntohl(rtcpheader[i + 5])/65536.0,
01983 (unsigned long long)rtt);
01984 } else {
01985 manager_event(EVENT_FLAG_REPORTING, "RTCPReceived", "From: %s\r\n"
01986 "PT: %d(%s)\r\n"
01987 "ReceptionReports: %d\r\n"
01988 "SenderSSRC: %u\r\n"
01989 "FractionLost: %ld\r\n"
01990 "PacketsLost: %d\r\n"
01991 "HighestSequence: %ld\r\n"
01992 "SequenceNumberCycles: %ld\r\n"
01993 "IAJitter: %u\r\n"
01994 "LastSR: %lu.%010lu\r\n"
01995 "DLSR: %4.4f(sec)\r\n",
01996 ast_sockaddr_stringify(&addr),
01997 pt, (pt == 200) ? "Sender Report" : (pt == 201) ? "Receiver Report" : (pt == 192) ? "H.261 FUR" : "Unknown",
01998 rc,
01999 rtcpheader[i + 1],
02000 (((long) ntohl(rtcpheader[i + 1]) & 0xff000000) >> 24),
02001 rtp->rtcp->reported_lost,
02002 (long) (ntohl(rtcpheader[i + 2]) & 0xffff),
02003 (long) (ntohl(rtcpheader[i + 2])) >> 16,
02004 rtp->rtcp->reported_jitter,
02005 (unsigned long) ntohl(rtcpheader[i + 4]) >> 16,
02006 ((unsigned long) ntohl(rtcpheader[i + 4]) << 16) * 4096,
02007 ntohl(rtcpheader[i + 5])/65536.0);
02008 }
02009 break;
02010 case RTCP_PT_FUR:
02011 if (rtcp_debug_test_addr(&addr))
02012 ast_verbose("Received an RTCP Fast Update Request\n");
02013 rtp->f.frametype = AST_FRAME_CONTROL;
02014 rtp->f.subclass.integer = AST_CONTROL_VIDUPDATE;
02015 rtp->f.datalen = 0;
02016 rtp->f.samples = 0;
02017 rtp->f.mallocd = 0;
02018 rtp->f.src = "RTP";
02019 f = &rtp->f;
02020 break;
02021 case RTCP_PT_SDES:
02022 if (rtcp_debug_test_addr(&addr))
02023 ast_verbose("Received an SDES from %s\n",
02024 ast_sockaddr_stringify(&rtp->rtcp->them));
02025 break;
02026 case RTCP_PT_BYE:
02027 if (rtcp_debug_test_addr(&addr))
02028 ast_verbose("Received a BYE from %s\n",
02029 ast_sockaddr_stringify(&rtp->rtcp->them));
02030 break;
02031 default:
02032 ast_debug(1, "Unknown RTCP packet (pt=%d) received from %s\n",
02033 pt, ast_sockaddr_stringify(&rtp->rtcp->them));
02034 break;
02035 }
02036 position += (length + 1);
02037 }
02038
02039 rtp->rtcp->rtcp_info = 1;
02040
02041 return f;
02042 }
02043
02044 static int bridge_p2p_rtp_write(struct ast_rtp_instance *instance, unsigned int *rtpheader, int len, int hdrlen)
02045 {
02046 struct ast_rtp_instance *instance1 = ast_rtp_instance_get_bridged(instance);
02047 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance), *bridged = ast_rtp_instance_get_data(instance1);
02048 int res = 0, payload = 0, bridged_payload = 0, mark;
02049 struct ast_rtp_payload_type payload_type;
02050 int reconstruct = ntohl(rtpheader[0]);
02051 struct ast_sockaddr remote_address = { {0,} };
02052
02053
02054 payload = (reconstruct & 0x7f0000) >> 16;
02055 mark = (((reconstruct & 0x800000) >> 23) != 0);
02056
02057
02058 payload_type = ast_rtp_codecs_payload_lookup(ast_rtp_instance_get_codecs(instance), payload);
02059
02060
02061 bridged_payload = ast_rtp_codecs_payload_code(ast_rtp_instance_get_codecs(instance1), payload_type.asterisk_format, payload_type.code);
02062
02063
02064 if (bridged_payload < 0) {
02065 return -1;
02066 }
02067
02068
02069 if (!(ast_rtp_instance_get_codecs(instance1)->payloads[bridged_payload].code)) {
02070 return -1;
02071 }
02072
02073
02074 if (ast_test_flag(rtp, FLAG_NEED_MARKER_BIT)) {
02075 mark = 1;
02076 ast_clear_flag(rtp, FLAG_NEED_MARKER_BIT);
02077 }
02078
02079
02080 reconstruct &= 0xFF80FFFF;
02081 reconstruct |= (bridged_payload << 16);
02082 reconstruct |= (mark << 23);
02083 rtpheader[0] = htonl(reconstruct);
02084
02085 ast_rtp_instance_get_remote_address(instance1, &remote_address);
02086
02087 if (ast_sockaddr_isnull(&remote_address)) {
02088 ast_debug(1, "Remote address is null, most likely RTP has been stopped\n");
02089 return 0;
02090 }
02091
02092
02093 res = rtp_sendto(instance1, (void *)rtpheader, len, 0, &remote_address);
02094 if (res < 0) {
02095 if (!ast_rtp_instance_get_prop(instance1, AST_RTP_PROPERTY_NAT) || (ast_rtp_instance_get_prop(instance1, AST_RTP_PROPERTY_NAT) && (ast_test_flag(bridged, FLAG_NAT_ACTIVE) == FLAG_NAT_ACTIVE))) {
02096 ast_log(LOG_WARNING,
02097 "RTP Transmission error of packet to %s: %s\n",
02098 ast_sockaddr_stringify(&remote_address),
02099 strerror(errno));
02100 } else if (((ast_test_flag(bridged, FLAG_NAT_ACTIVE) == FLAG_NAT_INACTIVE) || rtpdebug) && !ast_test_flag(bridged, FLAG_NAT_INACTIVE_NOWARN)) {
02101 if (option_debug || rtpdebug)
02102 ast_log(LOG_WARNING,
02103 "RTP NAT: Can't write RTP to private "
02104 "address %s, waiting for other end to "
02105 "send audio...\n",
02106 ast_sockaddr_stringify(&remote_address));
02107 ast_set_flag(bridged, FLAG_NAT_INACTIVE_NOWARN);
02108 }
02109 return 0;
02110 } else if (rtp_debug_test_addr(&remote_address)) {
02111 ast_verbose("Sent RTP P2P packet to %s (type %-2.2d, len %-6.6u)\n",
02112 ast_sockaddr_stringify(&remote_address),
02113 bridged_payload, len - hdrlen);
02114 }
02115
02116 return 0;
02117 }
02118
02119 static struct ast_frame *ast_rtp_read(struct ast_rtp_instance *instance, int rtcp)
02120 {
02121 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
02122 struct ast_sockaddr addr;
02123 int res, hdrlen = 12, version, payloadtype, padding, mark, ext, cc, prev_seqno;
02124 unsigned int *rtpheader = (unsigned int*)(rtp->rawdata + AST_FRIENDLY_OFFSET), seqno, ssrc, timestamp;
02125 struct ast_rtp_payload_type payload;
02126 struct ast_sockaddr remote_address = { {0,} };
02127 struct frame_list frames;
02128
02129
02130 if (rtcp) {
02131 if (rtp->rtcp) {
02132 return ast_rtcp_read(instance);
02133 }
02134 return &ast_null_frame;
02135 }
02136
02137
02138 if (rtp->sending_digit) {
02139 ast_rtp_dtmf_continuation(instance);
02140 }
02141
02142
02143 if ((res = rtp_recvfrom(instance, rtp->rawdata + AST_FRIENDLY_OFFSET,
02144 sizeof(rtp->rawdata) - AST_FRIENDLY_OFFSET, 0,
02145 &addr)) < 0) {
02146 ast_assert(errno != EBADF);
02147 if (errno != EAGAIN) {
02148 ast_log(LOG_WARNING, "RTP Read error: %s. Hanging up.\n", strerror(errno));
02149 return NULL;
02150 }
02151 return &ast_null_frame;
02152 }
02153
02154
02155 if (res < hdrlen) {
02156 ast_log(LOG_WARNING, "RTP Read too short\n");
02157 return &ast_null_frame;
02158 }
02159
02160
02161 seqno = ntohl(rtpheader[0]);
02162
02163 ast_rtp_instance_get_remote_address(instance, &remote_address);
02164
02165 if (!(version = (seqno & 0xC0000000) >> 30)) {
02166 struct sockaddr_in addr_tmp;
02167 struct ast_sockaddr addr_v4;
02168 if (ast_sockaddr_is_ipv4(&addr)) {
02169 ast_sockaddr_to_sin(&addr, &addr_tmp);
02170 } else if (ast_sockaddr_ipv4_mapped(&addr, &addr_v4)) {
02171 ast_debug(1, "Using IPv6 mapped address %s for STUN\n",
02172 ast_sockaddr_stringify(&addr));
02173 ast_sockaddr_to_sin(&addr_v4, &addr_tmp);
02174 } else {
02175 ast_debug(1, "Cannot do STUN for non IPv4 address %s\n",
02176 ast_sockaddr_stringify(&addr));
02177 return &ast_null_frame;
02178 }
02179 if ((ast_stun_handle_packet(rtp->s, &addr_tmp, rtp->rawdata + AST_FRIENDLY_OFFSET, res, NULL, NULL) == AST_STUN_ACCEPT) &&
02180 ast_sockaddr_isnull(&remote_address)) {
02181 ast_sockaddr_from_sin(&addr, &addr_tmp);
02182 ast_rtp_instance_set_remote_address(instance, &addr);
02183 }
02184 return &ast_null_frame;
02185 }
02186
02187
02188 if (rtp->strict_rtp_state == STRICT_RTP_LEARN) {
02189 ast_debug(1, "%p -- start learning mode pass with addr = %s\n", rtp, ast_sockaddr_stringify(&addr));
02190
02191 ast_sockaddr_copy(&rtp->strict_rtp_address, &addr);
02192
02193
02194 if (rtp_learning_rtp_seq_update(rtp, ntohl(rtpheader[0]))) {
02195 ast_debug(1, "%p -- Condition for learning hasn't exited, so reject the frame.\n", rtp);
02196 return &ast_null_frame;
02197 }
02198
02199 ast_debug(1, "%p -- Probation Ended. Set strict_rtp_state to STRICT_RTP_CLOSED with address %s\n", rtp, ast_sockaddr_stringify(&addr));
02200 rtp->strict_rtp_state = STRICT_RTP_CLOSED;
02201 } else if (rtp->strict_rtp_state == STRICT_RTP_CLOSED) {
02202 if (ast_sockaddr_cmp(&rtp->strict_rtp_address, &addr)) {
02203
02204 if (!ast_sockaddr_cmp(&rtp->alt_rtp_address, &addr)) {
02205
02206 ast_sockaddr_copy(&rtp->strict_rtp_address,
02207 &addr);
02208 } else {
02209 const char *real_addr = ast_strdupa(ast_sockaddr_stringify(&addr));
02210 const char *expected_addr = ast_strdupa(ast_sockaddr_stringify(&rtp->strict_rtp_address));
02211
02212 ast_debug(1, "Received RTP packet from %s, dropping due to strict RTP protection. Expected it to be from %s\n",
02213 real_addr, expected_addr);
02214
02215 return &ast_null_frame;
02216 }
02217 }
02218 }
02219
02220
02221 if (ast_rtp_instance_get_prop(instance, AST_RTP_PROPERTY_NAT)) {
02222 if (ast_sockaddr_cmp(&remote_address, &addr)) {
02223 ast_rtp_instance_set_remote_address(instance, &addr);
02224 ast_sockaddr_copy(&remote_address, &addr);
02225 if (rtp->rtcp) {
02226 ast_sockaddr_copy(&rtp->rtcp->them, &addr);
02227 ast_sockaddr_set_port(&rtp->rtcp->them, ast_sockaddr_port(&addr) + 1);
02228 }
02229 rtp->rxseqno = 0;
02230 ast_set_flag(rtp, FLAG_NAT_ACTIVE);
02231 if (option_debug || rtpdebug)
02232 ast_debug(0, "RTP NAT: Got audio from other end. Now sending to address %s\n",
02233 ast_sockaddr_stringify(&remote_address));
02234 }
02235 }
02236
02237
02238 if (ast_rtp_instance_get_bridged(instance) && !bridge_p2p_rtp_write(instance, rtpheader, res, hdrlen)) {
02239 return &ast_null_frame;
02240 }
02241
02242
02243 if (version != 2) {
02244 return &ast_null_frame;
02245 }
02246
02247
02248 payloadtype = (seqno & 0x7f0000) >> 16;
02249 padding = seqno & (1 << 29);
02250 mark = seqno & (1 << 23);
02251 ext = seqno & (1 << 28);
02252 cc = (seqno & 0xF000000) >> 24;
02253 seqno &= 0xffff;
02254 timestamp = ntohl(rtpheader[1]);
02255 ssrc = ntohl(rtpheader[2]);
02256
02257 AST_LIST_HEAD_INIT_NOLOCK(&frames);
02258
02259 if (rtp->rxssrc && rtp->rxssrc != ssrc) {
02260 struct ast_frame *f, srcupdate = {
02261 AST_FRAME_CONTROL,
02262 .subclass.integer = AST_CONTROL_SRCCHANGE,
02263 };
02264
02265 if (!mark) {
02266 if (option_debug || rtpdebug) {
02267 ast_debug(1, "Forcing Marker bit, because SSRC has changed\n");
02268 }
02269 mark = 1;
02270 }
02271
02272 f = ast_frisolate(&srcupdate);
02273 AST_LIST_INSERT_TAIL(&frames, f, frame_list);
02274 }
02275
02276 rtp->rxssrc = ssrc;
02277
02278
02279 if (padding) {
02280 res -= rtp->rawdata[AST_FRIENDLY_OFFSET + res - 1];
02281 }
02282
02283
02284 if (cc) {
02285 hdrlen += cc * 4;
02286 }
02287
02288
02289 if (ext) {
02290 hdrlen += (ntohl(rtpheader[hdrlen/4]) & 0xffff) << 2;
02291 hdrlen += 4;
02292 if (option_debug) {
02293 int profile;
02294 profile = (ntohl(rtpheader[3]) & 0xffff0000) >> 16;
02295 if (profile == 0x505a)
02296 ast_debug(1, "Found Zfone extension in RTP stream - zrtp - not supported.\n");
02297 else
02298 ast_debug(1, "Found unknown RTP Extensions %x\n", profile);
02299 }
02300 }
02301
02302
02303 if (res < hdrlen) {
02304 ast_log(LOG_WARNING, "RTP Read too short (%d, expecting %d\n", res, hdrlen);
02305 return AST_LIST_FIRST(&frames) ? AST_LIST_FIRST(&frames) : &ast_null_frame;
02306 }
02307
02308 rtp->rxcount++;
02309 if (rtp->rxcount == 1) {
02310 rtp->seedrxseqno = seqno;
02311 }
02312
02313
02314 if (rtp->rtcp && !ast_sockaddr_isnull(&rtp->rtcp->them) && rtp->rtcp->schedid < 1) {
02315
02316 ao2_ref(instance, +1);
02317 rtp->rtcp->schedid = ast_sched_add(rtp->sched, ast_rtcp_calc_interval(rtp), ast_rtcp_write, instance);
02318 if (rtp->rtcp->schedid < 0) {
02319 ao2_ref(instance, -1);
02320 ast_log(LOG_WARNING, "scheduling RTCP transmission failed.\n");
02321 }
02322 }
02323 if ((int)rtp->lastrxseqno - (int)seqno > 100)
02324 rtp->cycles += RTP_SEQ_MOD;
02325
02326 prev_seqno = rtp->lastrxseqno;
02327 rtp->lastrxseqno = seqno;
02328
02329 if (!rtp->themssrc) {
02330 rtp->themssrc = ntohl(rtpheader[2]);
02331 }
02332
02333 if (rtp_debug_test_addr(&addr)) {
02334 ast_verbose("Got RTP packet from %s (type %-2.2d, seq %-6.6u, ts %-6.6u, len %-6.6u)\n",
02335 ast_sockaddr_stringify(&addr),
02336 payloadtype, seqno, timestamp,res - hdrlen);
02337 }
02338
02339 payload = ast_rtp_codecs_payload_lookup(ast_rtp_instance_get_codecs(instance), payloadtype);
02340
02341
02342 if (!payload.asterisk_format) {
02343 struct ast_frame *f = NULL;
02344 if (payload.code == AST_RTP_DTMF) {
02345
02346
02347
02348
02349 process_dtmf_rfc2833(instance, rtp->rawdata + AST_FRIENDLY_OFFSET + hdrlen, res - hdrlen, seqno, timestamp, &addr, payloadtype, mark, &frames);
02350 } else if (payload.code == AST_RTP_CISCO_DTMF) {
02351 f = process_dtmf_cisco(instance, rtp->rawdata + AST_FRIENDLY_OFFSET + hdrlen, res - hdrlen, seqno, timestamp, &addr, payloadtype, mark);
02352 } else if (payload.code == AST_RTP_CN) {
02353 f = process_cn_rfc3389(instance, rtp->rawdata + AST_FRIENDLY_OFFSET + hdrlen, res - hdrlen, seqno, timestamp, &addr, payloadtype, mark);
02354 } else {
02355 ast_log(LOG_NOTICE, "Unknown RTP codec %d received from '%s'\n",
02356 payloadtype,
02357 ast_sockaddr_stringify(&remote_address));
02358 }
02359
02360 if (f) {
02361 AST_LIST_INSERT_TAIL(&frames, f, frame_list);
02362 }
02363
02364
02365
02366 if (!AST_LIST_EMPTY(&frames)) {
02367 return AST_LIST_FIRST(&frames);
02368 }
02369 return &ast_null_frame;
02370 }
02371
02372 rtp->lastrxformat = rtp->f.subclass.codec = payload.code;
02373 rtp->f.frametype = (rtp->f.subclass.codec & AST_FORMAT_AUDIO_MASK) ? AST_FRAME_VOICE : (rtp->f.subclass.codec & AST_FORMAT_VIDEO_MASK) ? AST_FRAME_VIDEO : AST_FRAME_TEXT;
02374
02375 rtp->rxseqno = seqno;
02376
02377 if (rtp->dtmf_timeout && rtp->dtmf_timeout < timestamp) {
02378 rtp->dtmf_timeout = 0;
02379
02380 if (rtp->resp) {
02381 struct ast_frame *f;
02382 f = create_dtmf_frame(instance, AST_FRAME_DTMF_END, 0);
02383 f->len = ast_tvdiff_ms(ast_samp2tv(rtp->dtmf_duration, rtp_get_rate(f->subclass.codec)), ast_tv(0, 0));
02384 rtp->resp = 0;
02385 rtp->dtmf_timeout = rtp->dtmf_duration = 0;
02386 AST_LIST_INSERT_TAIL(&frames, f, frame_list);
02387 return AST_LIST_FIRST(&frames);
02388 }
02389 }
02390
02391 rtp->lastrxts = timestamp;
02392
02393 rtp->f.src = "RTP";
02394 rtp->f.mallocd = 0;
02395 rtp->f.datalen = res - hdrlen;
02396 rtp->f.data.ptr = rtp->rawdata + hdrlen + AST_FRIENDLY_OFFSET;
02397 rtp->f.offset = hdrlen + AST_FRIENDLY_OFFSET;
02398 rtp->f.seqno = seqno;
02399
02400 if (rtp->f.subclass.codec == AST_FORMAT_T140 && (int)seqno - (prev_seqno+1) > 0 && (int)seqno - (prev_seqno+1) < 10) {
02401 unsigned char *data = rtp->f.data.ptr;
02402
02403 memmove(rtp->f.data.ptr+3, rtp->f.data.ptr, rtp->f.datalen);
02404 rtp->f.datalen +=3;
02405 *data++ = 0xEF;
02406 *data++ = 0xBF;
02407 *data = 0xBD;
02408 }
02409
02410 if (rtp->f.subclass.codec == AST_FORMAT_T140RED) {
02411 unsigned char *data = rtp->f.data.ptr;
02412 unsigned char *header_end;
02413 int num_generations;
02414 int header_length;
02415 int len;
02416 int diff =(int)seqno - (prev_seqno+1);
02417 int x;
02418
02419 rtp->f.subclass.codec = AST_FORMAT_T140;
02420 header_end = memchr(data, ((*data) & 0x7f), rtp->f.datalen);
02421 if (header_end == NULL) {
02422 return AST_LIST_FIRST(&frames) ? AST_LIST_FIRST(&frames) : &ast_null_frame;
02423 }
02424 header_end++;
02425
02426 header_length = header_end - data;
02427 num_generations = header_length / 4;
02428 len = header_length;
02429
02430 if (!diff) {
02431 for (x = 0; x < num_generations; x++)
02432 len += data[x * 4 + 3];
02433
02434 if (!(rtp->f.datalen - len))
02435 return AST_LIST_FIRST(&frames) ? AST_LIST_FIRST(&frames) : &ast_null_frame;
02436
02437 rtp->f.data.ptr += len;
02438 rtp->f.datalen -= len;
02439 } else if (diff > num_generations && diff < 10) {
02440 len -= 3;
02441 rtp->f.data.ptr += len;
02442 rtp->f.datalen -= len;
02443
02444 data = rtp->f.data.ptr;
02445 *data++ = 0xEF;
02446 *data++ = 0xBF;
02447 *data = 0xBD;
02448 } else {
02449 for ( x = 0; x < num_generations - diff; x++)
02450 len += data[x * 4 + 3];
02451
02452 rtp->f.data.ptr += len;
02453 rtp->f.datalen -= len;
02454 }
02455 }
02456
02457 if (rtp->f.subclass.codec & AST_FORMAT_AUDIO_MASK) {
02458 rtp->f.samples = ast_codec_get_samples(&rtp->f);
02459 if ((rtp->f.subclass.codec == AST_FORMAT_SLINEAR) || (rtp->f.subclass.codec == AST_FORMAT_SLINEAR16)) {
02460 ast_frame_byteswap_be(&rtp->f);
02461 }
02462 calc_rxstamp(&rtp->f.delivery, rtp, timestamp, mark);
02463
02464 ast_set_flag(&rtp->f, AST_FRFLAG_HAS_TIMING_INFO);
02465 rtp->f.ts = timestamp / (rtp_get_rate(rtp->f.subclass.codec) / 1000);
02466 rtp->f.len = rtp->f.samples / ((ast_format_rate(rtp->f.subclass.codec) / 1000));
02467 } else if (rtp->f.subclass.codec & AST_FORMAT_VIDEO_MASK) {
02468
02469 if (!rtp->lastividtimestamp)
02470 rtp->lastividtimestamp = timestamp;
02471 rtp->f.samples = timestamp - rtp->lastividtimestamp;
02472 rtp->lastividtimestamp = timestamp;
02473 rtp->f.delivery.tv_sec = 0;
02474 rtp->f.delivery.tv_usec = 0;
02475
02476
02477
02478
02479
02480 if (mark)
02481 rtp->f.subclass.codec |= 0x1;
02482 } else {
02483
02484 if (!rtp->lastitexttimestamp)
02485 rtp->lastitexttimestamp = timestamp;
02486 rtp->f.samples = timestamp - rtp->lastitexttimestamp;
02487 rtp->lastitexttimestamp = timestamp;
02488 rtp->f.delivery.tv_sec = 0;
02489 rtp->f.delivery.tv_usec = 0;
02490 }
02491
02492 AST_LIST_INSERT_TAIL(&frames, &rtp->f, frame_list);
02493 return AST_LIST_FIRST(&frames);
02494 }
02495
02496 static void ast_rtp_prop_set(struct ast_rtp_instance *instance, enum ast_rtp_property property, int value)
02497 {
02498 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
02499
02500 if (property == AST_RTP_PROPERTY_RTCP) {
02501 if (value) {
02502 if (rtp->rtcp) {
02503 ast_debug(1, "Ignoring duplicate RTCP property on RTP instance '%p'\n", instance);
02504 return;
02505 }
02506
02507 if (!(rtp->rtcp = ast_calloc(1, sizeof(*rtp->rtcp)))) {
02508 return;
02509 }
02510
02511
02512 ast_rtp_instance_get_local_address(instance, &rtp->rtcp->us);
02513 ast_sockaddr_set_port(&rtp->rtcp->us,
02514 ast_sockaddr_port(&rtp->rtcp->us) + 1);
02515
02516 if ((rtp->rtcp->s =
02517 create_new_socket("RTCP",
02518 ast_sockaddr_is_ipv4(&rtp->rtcp->us) ?
02519 AF_INET :
02520 ast_sockaddr_is_ipv6(&rtp->rtcp->us) ?
02521 AF_INET6 : -1)) < 0) {
02522 ast_debug(1, "Failed to create a new socket for RTCP on instance '%p'\n", instance);
02523 ast_free(rtp->rtcp);
02524 rtp->rtcp = NULL;
02525 return;
02526 }
02527
02528
02529 if (ast_bind(rtp->rtcp->s, &rtp->rtcp->us)) {
02530 ast_debug(1, "Failed to setup RTCP on RTP instance '%p'\n", instance);
02531 close(rtp->rtcp->s);
02532 ast_free(rtp->rtcp);
02533 rtp->rtcp = NULL;
02534 return;
02535 }
02536
02537 ast_debug(1, "Setup RTCP on RTP instance '%p'\n", instance);
02538 rtp->rtcp->schedid = -1;
02539
02540 return;
02541 } else {
02542 if (rtp->rtcp) {
02543 if (rtp->rtcp->schedid > 0) {
02544 if (!ast_sched_del(rtp->sched, rtp->rtcp->schedid)) {
02545
02546 ao2_ref(instance, -1);
02547 } else {
02548
02549 ast_debug(1, "Failed to tear down RTCP on RTP instance '%p'\n", instance);
02550 return;
02551 }
02552 rtp->rtcp->schedid = -1;
02553 }
02554 close(rtp->rtcp->s);
02555 ast_free(rtp->rtcp);
02556 rtp->rtcp = NULL;
02557 }
02558 return;
02559 }
02560 }
02561
02562 return;
02563 }
02564
02565 static int ast_rtp_fd(struct ast_rtp_instance *instance, int rtcp)
02566 {
02567 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
02568
02569 return rtcp ? (rtp->rtcp ? rtp->rtcp->s : -1) : rtp->s;
02570 }
02571
02572 static void ast_rtp_remote_address_set(struct ast_rtp_instance *instance, struct ast_sockaddr *addr)
02573 {
02574 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
02575
02576 if (rtp->rtcp) {
02577 ast_debug(1, "Setting RTCP address on RTP instance '%p'\n", instance);
02578 ast_sockaddr_copy(&rtp->rtcp->them, addr);
02579 if (!ast_sockaddr_isnull(addr)) {
02580 ast_sockaddr_set_port(&rtp->rtcp->them,
02581 ast_sockaddr_port(addr) + 1);
02582 }
02583 }
02584
02585 rtp->rxseqno = 0;
02586
02587 if (strictrtp) {
02588 rtp->strict_rtp_state = STRICT_RTP_LEARN;
02589 rtp_learning_seq_init(rtp, rtp->seqno);
02590 }
02591
02592 return;
02593 }
02594
02595 static void ast_rtp_alt_remote_address_set(struct ast_rtp_instance *instance, struct ast_sockaddr *addr)
02596 {
02597 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
02598
02599
02600
02601
02602 ast_sockaddr_copy(&rtp->alt_rtp_address, addr);
02603
02604 return;
02605 }
02606
02607
02608
02609
02610 static int red_write(const void *data)
02611 {
02612 struct ast_rtp_instance *instance = (struct ast_rtp_instance*) data;
02613 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
02614
02615 ast_rtp_write(instance, &rtp->red->t140);
02616
02617 return 1;
02618 }
02619
02620 static int rtp_red_init(struct ast_rtp_instance *instance, int buffer_time, int *payloads, int generations)
02621 {
02622 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
02623 int x;
02624
02625 if (!(rtp->red = ast_calloc(1, sizeof(*rtp->red)))) {
02626 return -1;
02627 }
02628
02629 rtp->red->t140.frametype = AST_FRAME_TEXT;
02630 rtp->red->t140.subclass.codec = AST_FORMAT_T140RED;
02631 rtp->red->t140.data.ptr = &rtp->red->buf_data;
02632
02633 rtp->red->t140.ts = 0;
02634 rtp->red->t140red = rtp->red->t140;
02635 rtp->red->t140red.data.ptr = &rtp->red->t140red_data;
02636 rtp->red->t140red.datalen = 0;
02637 rtp->red->ti = buffer_time;
02638 rtp->red->num_gen = generations;
02639 rtp->red->hdrlen = generations * 4 + 1;
02640 rtp->red->prev_ts = 0;
02641
02642 for (x = 0; x < generations; x++) {
02643 rtp->red->pt[x] = payloads[x];
02644 rtp->red->pt[x] |= 1 << 7;
02645 rtp->red->t140red_data[x*4] = rtp->red->pt[x];
02646 }
02647 rtp->red->t140red_data[x*4] = rtp->red->pt[x] = payloads[x];
02648 rtp->red->schedid = ast_sched_add(rtp->sched, generations, red_write, instance);
02649
02650 rtp->red->t140.datalen = 0;
02651
02652 return 0;
02653 }
02654
02655 static int rtp_red_buffer(struct ast_rtp_instance *instance, struct ast_frame *frame)
02656 {
02657 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
02658
02659 if (frame->datalen > -1) {
02660 struct rtp_red *red = rtp->red;
02661 memcpy(&red->buf_data[red->t140.datalen], frame->data.ptr, frame->datalen);
02662 red->t140.datalen += frame->datalen;
02663 red->t140.ts = frame->ts;
02664 }
02665
02666 return 0;
02667 }
02668
02669 static int ast_rtp_local_bridge(struct ast_rtp_instance *instance0, struct ast_rtp_instance *instance1)
02670 {
02671 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance0);
02672
02673 ast_set_flag(rtp, FLAG_NEED_MARKER_BIT);
02674
02675 return 0;
02676 }
02677
02678 static int ast_rtp_get_stat(struct ast_rtp_instance *instance, struct ast_rtp_instance_stats *stats, enum ast_rtp_instance_stat stat)
02679 {
02680 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
02681
02682 if (!rtp->rtcp) {
02683 return -1;
02684 }
02685
02686 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_TXCOUNT, -1, stats->txcount, rtp->txcount);
02687 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_RXCOUNT, -1, stats->rxcount, rtp->rxcount);
02688
02689 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_TXPLOSS, AST_RTP_INSTANCE_STAT_COMBINED_LOSS, stats->txploss, rtp->rtcp->reported_lost);
02690 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_RXPLOSS, AST_RTP_INSTANCE_STAT_COMBINED_LOSS, stats->rxploss, rtp->rtcp->expected_prior - rtp->rtcp->received_prior);
02691 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_REMOTE_MAXRXPLOSS, AST_RTP_INSTANCE_STAT_COMBINED_LOSS, stats->remote_maxrxploss, rtp->rtcp->reported_maxlost);
02692 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_REMOTE_MINRXPLOSS, AST_RTP_INSTANCE_STAT_COMBINED_LOSS, stats->remote_minrxploss, rtp->rtcp->reported_minlost);
02693 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_REMOTE_NORMDEVRXPLOSS, AST_RTP_INSTANCE_STAT_COMBINED_LOSS, stats->remote_normdevrxploss, rtp->rtcp->reported_normdev_lost);
02694 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_REMOTE_STDEVRXPLOSS, AST_RTP_INSTANCE_STAT_COMBINED_LOSS, stats->remote_stdevrxploss, rtp->rtcp->reported_stdev_lost);
02695 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_LOCAL_MAXRXPLOSS, AST_RTP_INSTANCE_STAT_COMBINED_LOSS, stats->local_maxrxploss, rtp->rtcp->maxrxlost);
02696 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_LOCAL_MINRXPLOSS, AST_RTP_INSTANCE_STAT_COMBINED_LOSS, stats->local_minrxploss, rtp->rtcp->minrxlost);
02697 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_LOCAL_NORMDEVRXPLOSS, AST_RTP_INSTANCE_STAT_COMBINED_LOSS, stats->local_normdevrxploss, rtp->rtcp->normdev_rxlost);
02698 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_LOCAL_STDEVRXPLOSS, AST_RTP_INSTANCE_STAT_COMBINED_LOSS, stats->local_stdevrxploss, rtp->rtcp->stdev_rxlost);
02699 AST_RTP_STAT_TERMINATOR(AST_RTP_INSTANCE_STAT_COMBINED_LOSS);
02700
02701 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_TXJITTER, AST_RTP_INSTANCE_STAT_COMBINED_JITTER, stats->txjitter, rtp->rxjitter);
02702 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_RXJITTER, AST_RTP_INSTANCE_STAT_COMBINED_JITTER, stats->rxjitter, rtp->rtcp->reported_jitter / (unsigned int) 65536.0);
02703 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_REMOTE_MAXJITTER, AST_RTP_INSTANCE_STAT_COMBINED_JITTER, stats->remote_maxjitter, rtp->rtcp->reported_maxjitter);
02704 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_REMOTE_MINJITTER, AST_RTP_INSTANCE_STAT_COMBINED_JITTER, stats->remote_minjitter, rtp->rtcp->reported_minjitter);
02705 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_REMOTE_NORMDEVJITTER, AST_RTP_INSTANCE_STAT_COMBINED_JITTER, stats->remote_normdevjitter, rtp->rtcp->reported_normdev_jitter);
02706 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_REMOTE_STDEVJITTER, AST_RTP_INSTANCE_STAT_COMBINED_JITTER, stats->remote_stdevjitter, rtp->rtcp->reported_stdev_jitter);
02707 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_LOCAL_MAXJITTER, AST_RTP_INSTANCE_STAT_COMBINED_JITTER, stats->local_maxjitter, rtp->rtcp->maxrxjitter);
02708 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_LOCAL_MINJITTER, AST_RTP_INSTANCE_STAT_COMBINED_JITTER, stats->local_minjitter, rtp->rtcp->minrxjitter);
02709 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_LOCAL_NORMDEVJITTER, AST_RTP_INSTANCE_STAT_COMBINED_JITTER, stats->local_normdevjitter, rtp->rtcp->normdev_rxjitter);
02710 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_LOCAL_STDEVJITTER, AST_RTP_INSTANCE_STAT_COMBINED_JITTER, stats->local_stdevjitter, rtp->rtcp->stdev_rxjitter);
02711 AST_RTP_STAT_TERMINATOR(AST_RTP_INSTANCE_STAT_COMBINED_JITTER);
02712
02713 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_RTT, AST_RTP_INSTANCE_STAT_COMBINED_RTT, stats->rtt, rtp->rtcp->rtt);
02714 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_MAX_RTT, AST_RTP_INSTANCE_STAT_COMBINED_RTT, stats->maxrtt, rtp->rtcp->maxrtt);
02715 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_MIN_RTT, AST_RTP_INSTANCE_STAT_COMBINED_RTT, stats->minrtt, rtp->rtcp->minrtt);
02716 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_NORMDEVRTT, AST_RTP_INSTANCE_STAT_COMBINED_RTT, stats->normdevrtt, rtp->rtcp->normdevrtt);
02717 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_STDEVRTT, AST_RTP_INSTANCE_STAT_COMBINED_RTT, stats->stdevrtt, rtp->rtcp->stdevrtt);
02718 AST_RTP_STAT_TERMINATOR(AST_RTP_INSTANCE_STAT_COMBINED_RTT);
02719
02720 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_LOCAL_SSRC, -1, stats->local_ssrc, rtp->ssrc);
02721 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_REMOTE_SSRC, -1, stats->remote_ssrc, rtp->themssrc);
02722
02723 return 0;
02724 }
02725
02726 static int ast_rtp_dtmf_compatible(struct ast_channel *chan0, struct ast_rtp_instance *instance0, struct ast_channel *chan1, struct ast_rtp_instance *instance1)
02727 {
02728
02729
02730
02731
02732
02733
02734
02735
02736
02737
02738 return (((ast_rtp_instance_get_prop(instance0, AST_RTP_PROPERTY_DTMF) != ast_rtp_instance_get_prop(instance1, AST_RTP_PROPERTY_DTMF)) ||
02739 (!chan0->tech->send_digit_begin != !chan1->tech->send_digit_begin)) ? 0 : 1);
02740 }
02741
02742 static void ast_rtp_stun_request(struct ast_rtp_instance *instance, struct ast_sockaddr *suggestion, const char *username)
02743 {
02744 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
02745 struct sockaddr_in suggestion_tmp;
02746
02747 ast_sockaddr_to_sin(suggestion, &suggestion_tmp);
02748 ast_stun_request(rtp->s, &suggestion_tmp, username, NULL);
02749 ast_sockaddr_from_sin(suggestion, &suggestion_tmp);
02750 }
02751
02752 static void ast_rtp_stop(struct ast_rtp_instance *instance)
02753 {
02754 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
02755 struct ast_sockaddr addr = { {0,} };
02756
02757 if (rtp->rtcp && rtp->rtcp->schedid > 0) {
02758 if (!ast_sched_del(rtp->sched, rtp->rtcp->schedid)) {
02759
02760 ao2_ref(instance, -1);
02761 }
02762 rtp->rtcp->schedid = -1;
02763 }
02764
02765 if (rtp->red) {
02766 AST_SCHED_DEL(rtp->sched, rtp->red->schedid);
02767 free(rtp->red);
02768 rtp->red = NULL;
02769 }
02770
02771 ast_rtp_instance_set_remote_address(instance, &addr);
02772 if (rtp->rtcp) {
02773 ast_sockaddr_setnull(&rtp->rtcp->them);
02774 }
02775
02776 ast_set_flag(rtp, FLAG_NEED_MARKER_BIT);
02777 }
02778
02779 static int ast_rtp_qos_set(struct ast_rtp_instance *instance, int tos, int cos, const char *desc)
02780 {
02781 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
02782
02783 return ast_set_qos(rtp->s, tos, cos, desc);
02784 }
02785
02786
02787 static int ast_rtp_sendcng(struct ast_rtp_instance *instance, int level)
02788 {
02789 unsigned int *rtpheader;
02790 int hdrlen = 12;
02791 int res;
02792 struct ast_rtp_payload_type payload;
02793 char data[256];
02794 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
02795 struct ast_sockaddr remote_address = { {0,} };
02796
02797 ast_rtp_instance_get_remote_address(instance, &remote_address);
02798
02799 if (ast_sockaddr_isnull(&remote_address)) {
02800 return -1;
02801 }
02802
02803 payload = ast_rtp_codecs_payload_lookup(ast_rtp_instance_get_codecs(instance), AST_RTP_CN);
02804
02805 level = 127 - (level & 0x7f);
02806
02807 rtp->dtmfmute = ast_tvadd(ast_tvnow(), ast_tv(0, 500000));
02808
02809
02810 rtpheader = (unsigned int *)data;
02811 rtpheader[0] = htonl((2 << 30) | (1 << 23) | (payload.code << 16) | (rtp->seqno++));
02812 rtpheader[1] = htonl(rtp->lastts);
02813 rtpheader[2] = htonl(rtp->ssrc);
02814 data[12] = level;
02815
02816 res = rtp_sendto(instance, (void *) rtpheader, hdrlen + 1, 0, &remote_address);
02817
02818 if (res < 0) {
02819 ast_log(LOG_ERROR, "RTP Comfort Noise Transmission error to %s: %s\n", ast_sockaddr_stringify(&remote_address), strerror(errno));
02820 } else if (rtp_debug_test_addr(&remote_address)) {
02821 ast_verbose("Sent Comfort Noise RTP packet to %s (type %-2.2d, seq %-6.6u, ts %-6.6u, len %-6.6u)\n",
02822 ast_sockaddr_stringify(&remote_address),
02823 AST_RTP_CN, rtp->seqno, rtp->lastdigitts, res - hdrlen);
02824 }
02825
02826 return res;
02827 }
02828
02829 static char *rtp_do_debug_ip(struct ast_cli_args *a)
02830 {
02831 char *arg = ast_strdupa(a->argv[4]);
02832 char *debughost = NULL;
02833 char *debugport = NULL;
02834
02835 if (!ast_sockaddr_parse(&rtpdebugaddr, arg, 0) || !ast_sockaddr_split_hostport(arg, &debughost, &debugport, 0)) {
02836 ast_cli(a->fd, "Lookup failed for '%s'\n", arg);
02837 return CLI_FAILURE;
02838 }
02839 rtpdebugport = (!ast_strlen_zero(debugport) && debugport[0] != '0');
02840 ast_cli(a->fd, "RTP Debugging Enabled for address: %s\n",
02841 ast_sockaddr_stringify(&rtpdebugaddr));
02842 rtpdebug = 1;
02843 return CLI_SUCCESS;
02844 }
02845
02846 static char *rtcp_do_debug_ip(struct ast_cli_args *a)
02847 {
02848 char *arg = ast_strdupa(a->argv[4]);
02849 char *debughost = NULL;
02850 char *debugport = NULL;
02851
02852 if (!ast_sockaddr_parse(&rtcpdebugaddr, arg, 0) || !ast_sockaddr_split_hostport(arg, &debughost, &debugport, 0)) {
02853 ast_cli(a->fd, "Lookup failed for '%s'\n", arg);
02854 return CLI_FAILURE;
02855 }
02856 rtcpdebugport = (!ast_strlen_zero(debugport) && debugport[0] != '0');
02857 ast_cli(a->fd, "RTCP Debugging Enabled for address: %s\n",
02858 ast_sockaddr_stringify(&rtcpdebugaddr));
02859 rtcpdebug = 1;
02860 return CLI_SUCCESS;
02861 }
02862
02863 static char *handle_cli_rtp_set_debug(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
02864 {
02865 switch (cmd) {
02866 case CLI_INIT:
02867 e->command = "rtp set debug {on|off|ip}";
02868 e->usage =
02869 "Usage: rtp set debug {on|off|ip host[:port]}\n"
02870 " Enable/Disable dumping of all RTP packets. If 'ip' is\n"
02871 " specified, limit the dumped packets to those to and from\n"
02872 " the specified 'host' with optional port.\n";
02873 return NULL;
02874 case CLI_GENERATE:
02875 return NULL;
02876 }
02877
02878 if (a->argc == e->args) {
02879 if (!strncasecmp(a->argv[e->args-1], "on", 2)) {
02880 rtpdebug = 1;
02881 memset(&rtpdebugaddr, 0, sizeof(rtpdebugaddr));
02882 ast_cli(a->fd, "RTP Debugging Enabled\n");
02883 return CLI_SUCCESS;
02884 } else if (!strncasecmp(a->argv[e->args-1], "off", 3)) {
02885 rtpdebug = 0;
02886 ast_cli(a->fd, "RTP Debugging Disabled\n");
02887 return CLI_SUCCESS;
02888 }
02889 } else if (a->argc == e->args +1) {
02890 return rtp_do_debug_ip(a);
02891 }
02892
02893 return CLI_SHOWUSAGE;
02894 }
02895
02896 static char *handle_cli_rtcp_set_debug(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
02897 {
02898 switch (cmd) {
02899 case CLI_INIT:
02900 e->command = "rtcp set debug {on|off|ip}";
02901 e->usage =
02902 "Usage: rtcp set debug {on|off|ip host[:port]}\n"
02903 " Enable/Disable dumping of all RTCP packets. If 'ip' is\n"
02904 " specified, limit the dumped packets to those to and from\n"
02905 " the specified 'host' with optional port.\n";
02906 return NULL;
02907 case CLI_GENERATE:
02908 return NULL;
02909 }
02910
02911 if (a->argc == e->args) {
02912 if (!strncasecmp(a->argv[e->args-1], "on", 2)) {
02913 rtcpdebug = 1;
02914 memset(&rtcpdebugaddr, 0, sizeof(rtcpdebugaddr));
02915 ast_cli(a->fd, "RTCP Debugging Enabled\n");
02916 return CLI_SUCCESS;
02917 } else if (!strncasecmp(a->argv[e->args-1], "off", 3)) {
02918 rtcpdebug = 0;
02919 ast_cli(a->fd, "RTCP Debugging Disabled\n");
02920 return CLI_SUCCESS;
02921 }
02922 } else if (a->argc == e->args +1) {
02923 return rtcp_do_debug_ip(a);
02924 }
02925
02926 return CLI_SHOWUSAGE;
02927 }
02928
02929 static char *handle_cli_rtcp_set_stats(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
02930 {
02931 switch (cmd) {
02932 case CLI_INIT:
02933 e->command = "rtcp set stats {on|off}";
02934 e->usage =
02935 "Usage: rtcp set stats {on|off}\n"
02936 " Enable/Disable dumping of RTCP stats.\n";
02937 return NULL;
02938 case CLI_GENERATE:
02939 return NULL;
02940 }
02941
02942 if (a->argc != e->args)
02943 return CLI_SHOWUSAGE;
02944
02945 if (!strncasecmp(a->argv[e->args-1], "on", 2))
02946 rtcpstats = 1;
02947 else if (!strncasecmp(a->argv[e->args-1], "off", 3))
02948 rtcpstats = 0;
02949 else
02950 return CLI_SHOWUSAGE;
02951
02952 ast_cli(a->fd, "RTCP Stats %s\n", rtcpstats ? "Enabled" : "Disabled");
02953 return CLI_SUCCESS;
02954 }
02955
02956 static struct ast_cli_entry cli_rtp[] = {
02957 AST_CLI_DEFINE(handle_cli_rtp_set_debug, "Enable/Disable RTP debugging"),
02958 AST_CLI_DEFINE(handle_cli_rtcp_set_debug, "Enable/Disable RTCP debugging"),
02959 AST_CLI_DEFINE(handle_cli_rtcp_set_stats, "Enable/Disable RTCP stats"),
02960 };
02961
02962 static int rtp_reload(int reload)
02963 {
02964 struct ast_config *cfg;
02965 const char *s;
02966 struct ast_flags config_flags = { reload ? CONFIG_FLAG_FILEUNCHANGED : 0 };
02967
02968 cfg = ast_config_load2("rtp.conf", "rtp", config_flags);
02969 if (cfg == CONFIG_STATUS_FILEMISSING || cfg == CONFIG_STATUS_FILEUNCHANGED || cfg == CONFIG_STATUS_FILEINVALID) {
02970 return 0;
02971 }
02972
02973 rtpstart = DEFAULT_RTP_START;
02974 rtpend = DEFAULT_RTP_END;
02975 dtmftimeout = DEFAULT_DTMF_TIMEOUT;
02976 strictrtp = STRICT_RTP_OPEN;
02977 learning_min_sequential = DEFAULT_LEARNING_MIN_SEQUENTIAL;
02978 if (cfg) {
02979 if ((s = ast_variable_retrieve(cfg, "general", "rtpstart"))) {
02980 rtpstart = atoi(s);
02981 if (rtpstart < MINIMUM_RTP_PORT)
02982 rtpstart = MINIMUM_RTP_PORT;
02983 if (rtpstart > MAXIMUM_RTP_PORT)
02984 rtpstart = MAXIMUM_RTP_PORT;
02985 }
02986 if ((s = ast_variable_retrieve(cfg, "general", "rtpend"))) {
02987 rtpend = atoi(s);
02988 if (rtpend < MINIMUM_RTP_PORT)
02989 rtpend = MINIMUM_RTP_PORT;
02990 if (rtpend > MAXIMUM_RTP_PORT)
02991 rtpend = MAXIMUM_RTP_PORT;
02992 }
02993 if ((s = ast_variable_retrieve(cfg, "general", "rtcpinterval"))) {
02994 rtcpinterval = atoi(s);
02995 if (rtcpinterval == 0)
02996 rtcpinterval = 0;
02997 if (rtcpinterval < RTCP_MIN_INTERVALMS)
02998 rtcpinterval = RTCP_MIN_INTERVALMS;
02999 if (rtcpinterval > RTCP_MAX_INTERVALMS)
03000 rtcpinterval = RTCP_MAX_INTERVALMS;
03001 }
03002 if ((s = ast_variable_retrieve(cfg, "general", "rtpchecksums"))) {
03003 #ifdef SO_NO_CHECK
03004 nochecksums = ast_false(s) ? 1 : 0;
03005 #else
03006 if (ast_false(s))
03007 ast_log(LOG_WARNING, "Disabling RTP checksums is not supported on this operating system!\n");
03008 #endif
03009 }
03010 if ((s = ast_variable_retrieve(cfg, "general", "dtmftimeout"))) {
03011 dtmftimeout = atoi(s);
03012 if ((dtmftimeout < 0) || (dtmftimeout > 64000)) {
03013 ast_log(LOG_WARNING, "DTMF timeout of '%d' outside range, using default of '%d' instead\n",
03014 dtmftimeout, DEFAULT_DTMF_TIMEOUT);
03015 dtmftimeout = DEFAULT_DTMF_TIMEOUT;
03016 };
03017 }
03018 if ((s = ast_variable_retrieve(cfg, "general", "strictrtp"))) {
03019 strictrtp = ast_true(s);
03020 }
03021 if ((s = ast_variable_retrieve(cfg, "general", "probation"))) {
03022 if ((sscanf(s, "%d", &learning_min_sequential) <= 0) || learning_min_sequential <= 0) {
03023 ast_log(LOG_WARNING, "Value for 'probation' could not be read, using default of '%d' instead\n",
03024 DEFAULT_LEARNING_MIN_SEQUENTIAL);
03025 }
03026 }
03027 ast_config_destroy(cfg);
03028 }
03029 if (rtpstart >= rtpend) {
03030 ast_log(LOG_WARNING, "Unreasonable values for RTP start/end port in rtp.conf\n");
03031 rtpstart = DEFAULT_RTP_START;
03032 rtpend = DEFAULT_RTP_END;
03033 }
03034 ast_verb(2, "RTP Allocating from port range %d -> %d\n", rtpstart, rtpend);
03035 return 0;
03036 }
03037
03038 static int reload_module(void)
03039 {
03040 rtp_reload(1);
03041 return 0;
03042 }
03043
03044 static int load_module(void)
03045 {
03046 if (ast_rtp_engine_register(&asterisk_rtp_engine)) {
03047 return AST_MODULE_LOAD_DECLINE;
03048 }
03049
03050 if (ast_cli_register_multiple(cli_rtp, ARRAY_LEN(cli_rtp))) {
03051 ast_rtp_engine_unregister(&asterisk_rtp_engine);
03052 return AST_MODULE_LOAD_DECLINE;
03053 }
03054
03055 rtp_reload(0);
03056
03057 return AST_MODULE_LOAD_SUCCESS;
03058 }
03059
03060 static int unload_module(void)
03061 {
03062 ast_rtp_engine_unregister(&asterisk_rtp_engine);
03063 ast_cli_unregister_multiple(cli_rtp, ARRAY_LEN(cli_rtp));
03064
03065 return 0;
03066 }
03067
03068 AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "Asterisk RTP Stack",
03069 .load = load_module,
03070 .unload = unload_module,
03071 .reload = reload_module,
03072 .load_pri = AST_MODPRI_CHANNEL_DEPEND,
03073 );