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 #include "asterisk.h"
00030
00031 ASTERISK_FILE_VERSION(__FILE__, "$Revision: 241740 $")
00032
00033 #include <sys/time.h>
00034 #include <signal.h>
00035 #include <fcntl.h>
00036 #include <math.h>
00037
00038 #include "asterisk/rtp.h"
00039 #include "asterisk/pbx.h"
00040 #include "asterisk/frame.h"
00041 #include "asterisk/channel.h"
00042 #include "asterisk/acl.h"
00043 #include "asterisk/config.h"
00044 #include "asterisk/lock.h"
00045 #include "asterisk/utils.h"
00046 #include "asterisk/netsock.h"
00047 #include "asterisk/cli.h"
00048 #include "asterisk/manager.h"
00049 #include "asterisk/unaligned.h"
00050
00051 #define MAX_TIMESTAMP_SKEW 640
00052
00053 #define RTP_SEQ_MOD (1<<16)
00054 #define RTCP_DEFAULT_INTERVALMS 5000
00055 #define RTCP_MIN_INTERVALMS 500
00056 #define RTCP_MAX_INTERVALMS 60000
00057
00058 #define RTCP_PT_FUR 192
00059 #define RTCP_PT_SR 200
00060 #define RTCP_PT_RR 201
00061 #define RTCP_PT_SDES 202
00062 #define RTCP_PT_BYE 203
00063 #define RTCP_PT_APP 204
00064
00065 #define RTP_MTU 1200
00066
00067 #define DEFAULT_DTMF_TIMEOUT (150 * (8000 / 1000))
00068
00069 static int dtmftimeout = DEFAULT_DTMF_TIMEOUT;
00070
00071 static int rtpstart = 5000;
00072 static int rtpend = 31000;
00073 static int rtpdebug;
00074 static int rtcpdebug;
00075 static int rtcpstats;
00076 static int rtcpinterval = RTCP_DEFAULT_INTERVALMS;
00077 static int stundebug;
00078 static struct sockaddr_in rtpdebugaddr;
00079 static struct sockaddr_in rtcpdebugaddr;
00080 #ifdef SO_NO_CHECK
00081 static int nochecksums;
00082 #endif
00083 static int strictrtp;
00084
00085 enum strict_rtp_state {
00086 STRICT_RTP_OPEN = 0,
00087 STRICT_RTP_LEARN,
00088 STRICT_RTP_CLOSED,
00089 };
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101 struct rtpPayloadType {
00102 int isAstFormat;
00103 int code;
00104 };
00105
00106
00107
00108 struct ast_rtp {
00109 int s;
00110 struct ast_frame f;
00111 unsigned char rawdata[8192 + AST_FRIENDLY_OFFSET];
00112 unsigned int ssrc;
00113 unsigned int themssrc;
00114 unsigned int rxssrc;
00115 unsigned int lastts;
00116 unsigned int lastrxts;
00117 unsigned int lastividtimestamp;
00118 unsigned int lastovidtimestamp;
00119 unsigned int lastitexttimestamp;
00120 unsigned int lastotexttimestamp;
00121 unsigned int lasteventseqn;
00122 int lastrxseqno;
00123 unsigned short seedrxseqno;
00124 unsigned int seedrxts;
00125 unsigned int rxcount;
00126 unsigned int rxoctetcount;
00127 unsigned int txcount;
00128 unsigned int txoctetcount;
00129 unsigned int cycles;
00130 double rxjitter;
00131 double rxtransit;
00132 int lasttxformat;
00133 int lastrxformat;
00134
00135 int rtptimeout;
00136 int rtpholdtimeout;
00137 int rtpkeepalive;
00138
00139
00140 char resp;
00141 unsigned int lastevent;
00142 unsigned int dtmf_duration;
00143 unsigned int dtmf_timeout;
00144 unsigned int dtmfsamples;
00145
00146 unsigned int lastdigitts;
00147 char sending_digit;
00148 char send_digit;
00149 int send_payload;
00150 int send_duration;
00151 int nat;
00152 unsigned int flags;
00153 struct sockaddr_in us;
00154 struct sockaddr_in them;
00155 struct sockaddr_in altthem;
00156 struct timeval rxcore;
00157 struct timeval txcore;
00158 double drxcore;
00159 struct timeval lastrx;
00160 struct timeval dtmfmute;
00161 struct ast_smoother *smoother;
00162 int *ioid;
00163 unsigned short seqno;
00164 unsigned short rxseqno;
00165 struct sched_context *sched;
00166 struct io_context *io;
00167 void *data;
00168 ast_rtp_callback callback;
00169 #ifdef P2P_INTENSE
00170 ast_mutex_t bridge_lock;
00171 #endif
00172 struct rtpPayloadType current_RTP_PT[MAX_RTP_PT];
00173 int rtp_lookup_code_cache_isAstFormat;
00174 int rtp_lookup_code_cache_code;
00175 int rtp_lookup_code_cache_result;
00176 struct ast_rtcp *rtcp;
00177 struct ast_codec_pref pref;
00178 struct ast_rtp *bridged;
00179
00180 enum strict_rtp_state strict_rtp_state;
00181 struct sockaddr_in strict_rtp_address;
00182
00183 int set_marker_bit:1;
00184 unsigned int constantssrc:1;
00185 struct rtp_red *red;
00186 };
00187
00188 static struct ast_frame *red_t140_to_red(struct rtp_red *red);
00189 static int red_write(const void *data);
00190
00191 struct rtp_red {
00192 struct ast_frame t140;
00193 struct ast_frame t140red;
00194 unsigned char pt[RED_MAX_GENERATION];
00195 unsigned char ts[RED_MAX_GENERATION];
00196 unsigned char len[RED_MAX_GENERATION];
00197 int num_gen;
00198 int schedid;
00199 int ti;
00200 unsigned char t140red_data[64000];
00201 unsigned char buf_data[64000];
00202 int hdrlen;
00203 long int prev_ts;
00204 };
00205
00206
00207 static int ast_rtcp_write(const void *data);
00208 static void timeval2ntp(struct timeval tv, unsigned int *msw, unsigned int *lsw);
00209 static int ast_rtcp_write_sr(const void *data);
00210 static int ast_rtcp_write_rr(const void *data);
00211 static unsigned int ast_rtcp_calc_interval(struct ast_rtp *rtp);
00212 static int ast_rtp_senddigit_continuation(struct ast_rtp *rtp);
00213 int ast_rtp_senddigit_end(struct ast_rtp *rtp, char digit);
00214
00215 #define FLAG_3389_WARNING (1 << 0)
00216 #define FLAG_NAT_ACTIVE (3 << 1)
00217 #define FLAG_NAT_INACTIVE (0 << 1)
00218 #define FLAG_NAT_INACTIVE_NOWARN (1 << 1)
00219 #define FLAG_HAS_DTMF (1 << 3)
00220 #define FLAG_P2P_SENT_MARK (1 << 4)
00221 #define FLAG_P2P_NEED_DTMF (1 << 5)
00222 #define FLAG_CALLBACK_MODE (1 << 6)
00223 #define FLAG_DTMF_COMPENSATE (1 << 7)
00224 #define FLAG_HAS_STUN (1 << 8)
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236 struct ast_rtcp {
00237 int rtcp_info;
00238 int s;
00239 struct sockaddr_in us;
00240 struct sockaddr_in them;
00241 struct sockaddr_in altthem;
00242 unsigned int soc;
00243 unsigned int spc;
00244 unsigned int themrxlsr;
00245 struct timeval rxlsr;
00246 struct timeval txlsr;
00247 unsigned int expected_prior;
00248 unsigned int received_prior;
00249 int schedid;
00250 unsigned int rr_count;
00251 unsigned int sr_count;
00252 unsigned int lastsrtxcount;
00253 double accumulated_transit;
00254 double rtt;
00255 unsigned int reported_jitter;
00256 unsigned int reported_lost;
00257 char quality[AST_MAX_USER_FIELD];
00258 char quality_jitter[AST_MAX_USER_FIELD];
00259 char quality_loss[AST_MAX_USER_FIELD];
00260 char quality_rtt[AST_MAX_USER_FIELD];
00261
00262 double reported_maxjitter;
00263 double reported_minjitter;
00264 double reported_normdev_jitter;
00265 double reported_stdev_jitter;
00266 unsigned int reported_jitter_count;
00267
00268 double reported_maxlost;
00269 double reported_minlost;
00270 double reported_normdev_lost;
00271 double reported_stdev_lost;
00272
00273 double rxlost;
00274 double maxrxlost;
00275 double minrxlost;
00276 double normdev_rxlost;
00277 double stdev_rxlost;
00278 unsigned int rxlost_count;
00279
00280 double maxrxjitter;
00281 double minrxjitter;
00282 double normdev_rxjitter;
00283 double stdev_rxjitter;
00284 unsigned int rxjitter_count;
00285 double maxrtt;
00286 double minrtt;
00287 double normdevrtt;
00288 double stdevrtt;
00289 unsigned int rtt_count;
00290 int sendfur;
00291 };
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319 typedef struct { unsigned int id[4]; } __attribute__((packed)) stun_trans_id;
00320
00321 struct stun_header {
00322 unsigned short msgtype;
00323 unsigned short msglen;
00324 stun_trans_id id;
00325 unsigned char ies[0];
00326 } __attribute__((packed));
00327
00328 struct stun_attr {
00329 unsigned short attr;
00330 unsigned short len;
00331 unsigned char value[0];
00332 } __attribute__((packed));
00333
00334
00335
00336
00337 struct stun_addr {
00338 unsigned char unused;
00339 unsigned char family;
00340 unsigned short port;
00341 unsigned int addr;
00342 } __attribute__((packed));
00343
00344 #define STUN_IGNORE (0)
00345 #define STUN_ACCEPT (1)
00346
00347
00348
00349
00350
00351
00352
00353
00354 #define STUN_BINDREQ 0x0001
00355 #define STUN_BINDRESP 0x0101
00356 #define STUN_BINDERR 0x0111
00357 #define STUN_SECREQ 0x0002
00358 #define STUN_SECRESP 0x0102
00359 #define STUN_SECERR 0x0112
00360
00361
00362
00363
00364 #define STUN_MAPPED_ADDRESS 0x0001
00365 #define STUN_RESPONSE_ADDRESS 0x0002
00366 #define STUN_CHANGE_REQUEST 0x0003
00367 #define STUN_SOURCE_ADDRESS 0x0004
00368 #define STUN_CHANGED_ADDRESS 0x0005
00369 #define STUN_USERNAME 0x0006
00370 #define STUN_PASSWORD 0x0007
00371 #define STUN_MESSAGE_INTEGRITY 0x0008
00372 #define STUN_ERROR_CODE 0x0009
00373 #define STUN_UNKNOWN_ATTRIBUTES 0x000a
00374 #define STUN_REFLECTED_FROM 0x000b
00375
00376
00377 static const char *stun_msg2str(int msg)
00378 {
00379 switch (msg) {
00380 case STUN_BINDREQ:
00381 return "Binding Request";
00382 case STUN_BINDRESP:
00383 return "Binding Response";
00384 case STUN_BINDERR:
00385 return "Binding Error Response";
00386 case STUN_SECREQ:
00387 return "Shared Secret Request";
00388 case STUN_SECRESP:
00389 return "Shared Secret Response";
00390 case STUN_SECERR:
00391 return "Shared Secret Error Response";
00392 }
00393 return "Non-RFC3489 Message";
00394 }
00395
00396
00397 static const char *stun_attr2str(int msg)
00398 {
00399 switch (msg) {
00400 case STUN_MAPPED_ADDRESS:
00401 return "Mapped Address";
00402 case STUN_RESPONSE_ADDRESS:
00403 return "Response Address";
00404 case STUN_CHANGE_REQUEST:
00405 return "Change Request";
00406 case STUN_SOURCE_ADDRESS:
00407 return "Source Address";
00408 case STUN_CHANGED_ADDRESS:
00409 return "Changed Address";
00410 case STUN_USERNAME:
00411 return "Username";
00412 case STUN_PASSWORD:
00413 return "Password";
00414 case STUN_MESSAGE_INTEGRITY:
00415 return "Message Integrity";
00416 case STUN_ERROR_CODE:
00417 return "Error Code";
00418 case STUN_UNKNOWN_ATTRIBUTES:
00419 return "Unknown Attributes";
00420 case STUN_REFLECTED_FROM:
00421 return "Reflected From";
00422 }
00423 return "Non-RFC3489 Attribute";
00424 }
00425
00426
00427 struct stun_state {
00428 const char *username;
00429 const char *password;
00430 };
00431
00432 static int stun_process_attr(struct stun_state *state, struct stun_attr *attr)
00433 {
00434 if (stundebug)
00435 ast_verbose("Found STUN Attribute %s (%04x), length %d\n",
00436 stun_attr2str(ntohs(attr->attr)), ntohs(attr->attr), ntohs(attr->len));
00437 switch (ntohs(attr->attr)) {
00438 case STUN_USERNAME:
00439 state->username = (const char *) (attr->value);
00440 break;
00441 case STUN_PASSWORD:
00442 state->password = (const char *) (attr->value);
00443 break;
00444 default:
00445 if (stundebug)
00446 ast_verbose("Ignoring STUN attribute %s (%04x), length %d\n",
00447 stun_attr2str(ntohs(attr->attr)), ntohs(attr->attr), ntohs(attr->len));
00448 }
00449 return 0;
00450 }
00451
00452
00453 static void append_attr_string(struct stun_attr **attr, int attrval, const char *s, int *len, int *left)
00454 {
00455 int size = sizeof(**attr) + strlen(s);
00456 if (*left > size) {
00457 (*attr)->attr = htons(attrval);
00458 (*attr)->len = htons(strlen(s));
00459 memcpy((*attr)->value, s, strlen(s));
00460 (*attr) = (struct stun_attr *)((*attr)->value + strlen(s));
00461 *len += size;
00462 *left -= size;
00463 }
00464 }
00465
00466
00467 static void append_attr_address(struct stun_attr **attr, int attrval, struct sockaddr_in *sock_in, int *len, int *left)
00468 {
00469 int size = sizeof(**attr) + 8;
00470 struct stun_addr *addr;
00471 if (*left > size) {
00472 (*attr)->attr = htons(attrval);
00473 (*attr)->len = htons(8);
00474 addr = (struct stun_addr *)((*attr)->value);
00475 addr->unused = 0;
00476 addr->family = 0x01;
00477 addr->port = sock_in->sin_port;
00478 addr->addr = sock_in->sin_addr.s_addr;
00479 (*attr) = (struct stun_attr *)((*attr)->value + 8);
00480 *len += size;
00481 *left -= size;
00482 }
00483 }
00484
00485
00486 static int stun_send(int s, struct sockaddr_in *dst, struct stun_header *resp)
00487 {
00488 return sendto(s, resp, ntohs(resp->msglen) + sizeof(*resp), 0,
00489 (struct sockaddr *)dst, sizeof(*dst));
00490 }
00491
00492
00493 static void stun_req_id(struct stun_header *req)
00494 {
00495 int x;
00496 for (x = 0; x < 4; x++)
00497 req->id.id[x] = ast_random();
00498 }
00499
00500 size_t ast_rtp_alloc_size(void)
00501 {
00502 return sizeof(struct ast_rtp);
00503 }
00504
00505
00506 typedef int (stun_cb_f)(struct stun_attr *attr, void *arg);
00507
00508
00509
00510
00511
00512
00513
00514
00515
00516 static int stun_handle_packet(int s, struct sockaddr_in *src,
00517 unsigned char *data, size_t len, stun_cb_f *stun_cb, void *arg)
00518 {
00519 struct stun_header *hdr = (struct stun_header *)data;
00520 struct stun_attr *attr;
00521 struct stun_state st;
00522 int ret = STUN_IGNORE;
00523 int x;
00524
00525
00526
00527
00528
00529 if (len < sizeof(struct stun_header)) {
00530 ast_debug(1, "Runt STUN packet (only %d, wanting at least %d)\n", (int) len, (int) sizeof(struct stun_header));
00531 return -1;
00532 }
00533 len -= sizeof(struct stun_header);
00534 data += sizeof(struct stun_header);
00535 x = ntohs(hdr->msglen);
00536 if (stundebug)
00537 ast_verbose("STUN Packet, msg %s (%04x), length: %d\n", stun_msg2str(ntohs(hdr->msgtype)), ntohs(hdr->msgtype), x);
00538 if (x > len) {
00539 ast_debug(1, "Scrambled STUN packet length (got %d, expecting %d)\n", x, (int)len);
00540 } else
00541 len = x;
00542 memset(&st, 0, sizeof(st));
00543 while (len) {
00544 if (len < sizeof(struct stun_attr)) {
00545 ast_debug(1, "Runt Attribute (got %d, expecting %d)\n", (int)len, (int) sizeof(struct stun_attr));
00546 break;
00547 }
00548 attr = (struct stun_attr *)data;
00549
00550 x = ntohs(attr->len) + sizeof(struct stun_attr);
00551 if (x > len) {
00552 ast_debug(1, "Inconsistent Attribute (length %d exceeds remaining msg len %d)\n", x, (int)len);
00553 break;
00554 }
00555 if (stun_cb)
00556 stun_cb(attr, arg);
00557 if (stun_process_attr(&st, attr)) {
00558 ast_debug(1, "Failed to handle attribute %s (%04x)\n", stun_attr2str(ntohs(attr->attr)), ntohs(attr->attr));
00559 break;
00560 }
00561
00562
00563
00564 attr->attr = 0;
00565 data += x;
00566 len -= x;
00567 }
00568
00569
00570
00571
00572
00573
00574 *data = '\0';
00575
00576
00577
00578
00579 if (len == 0) {
00580 unsigned char respdata[1024];
00581 struct stun_header *resp = (struct stun_header *)respdata;
00582 int resplen = 0;
00583 int respleft = sizeof(respdata) - sizeof(struct stun_header);
00584
00585 resp->id = hdr->id;
00586 resp->msgtype = 0;
00587 resp->msglen = 0;
00588 attr = (struct stun_attr *)resp->ies;
00589 switch (ntohs(hdr->msgtype)) {
00590 case STUN_BINDREQ:
00591 if (stundebug)
00592 ast_verbose("STUN Bind Request, username: %s\n",
00593 st.username ? st.username : "<none>");
00594 if (st.username)
00595 append_attr_string(&attr, STUN_USERNAME, st.username, &resplen, &respleft);
00596 append_attr_address(&attr, STUN_MAPPED_ADDRESS, src, &resplen, &respleft);
00597 resp->msglen = htons(resplen);
00598 resp->msgtype = htons(STUN_BINDRESP);
00599 stun_send(s, src, resp);
00600 ret = STUN_ACCEPT;
00601 break;
00602 default:
00603 if (stundebug)
00604 ast_verbose("Dunno what to do with STUN message %04x (%s)\n", ntohs(hdr->msgtype), stun_msg2str(ntohs(hdr->msgtype)));
00605 }
00606 }
00607 return ret;
00608 }
00609
00610
00611
00612
00613
00614 static int stun_get_mapped(struct stun_attr *attr, void *arg)
00615 {
00616 struct stun_addr *addr = (struct stun_addr *)(attr + 1);
00617 struct sockaddr_in *sa = (struct sockaddr_in *)arg;
00618
00619 if (ntohs(attr->attr) != STUN_MAPPED_ADDRESS || ntohs(attr->len) != 8)
00620 return 1;
00621 sa->sin_port = addr->port;
00622 sa->sin_addr.s_addr = addr->addr;
00623 return 0;
00624 }
00625
00626
00627
00628
00629
00630
00631
00632
00633
00634
00635
00636
00637
00638
00639
00640 int ast_stun_request(int s, struct sockaddr_in *dst,
00641 const char *username, struct sockaddr_in *answer)
00642 {
00643 struct stun_header *req;
00644 unsigned char reqdata[1024];
00645 int reqlen, reqleft;
00646 struct stun_attr *attr;
00647 int res = 0;
00648 int retry;
00649
00650 req = (struct stun_header *)reqdata;
00651 stun_req_id(req);
00652 reqlen = 0;
00653 reqleft = sizeof(reqdata) - sizeof(struct stun_header);
00654 req->msgtype = 0;
00655 req->msglen = 0;
00656 attr = (struct stun_attr *)req->ies;
00657 if (username)
00658 append_attr_string(&attr, STUN_USERNAME, username, &reqlen, &reqleft);
00659 req->msglen = htons(reqlen);
00660 req->msgtype = htons(STUN_BINDREQ);
00661 for (retry = 0; retry < 3; retry++) {
00662
00663 unsigned char reply_buf[1024];
00664 fd_set rfds;
00665 struct timeval to = { 3, 0 };
00666 struct sockaddr_in src;
00667 socklen_t srclen;
00668
00669 res = stun_send(s, dst, req);
00670 if (res < 0) {
00671 ast_log(LOG_WARNING, "ast_stun_request send #%d failed error %d, retry\n",
00672 retry, res);
00673 continue;
00674 }
00675 if (answer == NULL)
00676 break;
00677 FD_ZERO(&rfds);
00678 FD_SET(s, &rfds);
00679 res = ast_select(s + 1, &rfds, NULL, NULL, &to);
00680 if (res <= 0)
00681 continue;
00682 memset(&src, '\0', sizeof(src));
00683 srclen = sizeof(src);
00684
00685
00686
00687 res = recvfrom(s, reply_buf, sizeof(reply_buf) - 1,
00688 0, (struct sockaddr *)&src, &srclen);
00689 if (res < 0) {
00690 ast_log(LOG_WARNING, "ast_stun_request recvfrom #%d failed error %d, retry\n",
00691 retry, res);
00692 continue;
00693 }
00694 memset(answer, '\0', sizeof(struct sockaddr_in));
00695 stun_handle_packet(s, &src, reply_buf, res,
00696 stun_get_mapped, answer);
00697 res = 0;
00698 break;
00699 }
00700 return res;
00701 }
00702
00703
00704
00705
00706 void ast_rtp_stun_request(struct ast_rtp *rtp, struct sockaddr_in *suggestion, const char *username)
00707 {
00708 ast_stun_request(rtp->s, suggestion, username, NULL);
00709 }
00710
00711
00712 static AST_RWLIST_HEAD_STATIC(protos, ast_rtp_protocol);
00713
00714 static void timeval2ntp(struct timeval when, unsigned int *msw, unsigned int *lsw)
00715 {
00716 unsigned int sec, usec, frac;
00717 sec = when.tv_sec + 2208988800u;
00718 usec = when.tv_usec;
00719 frac = (usec << 12) + (usec << 8) - ((usec * 3650) >> 6);
00720 *msw = sec;
00721 *lsw = frac;
00722 }
00723
00724 int ast_rtp_fd(struct ast_rtp *rtp)
00725 {
00726 return rtp->s;
00727 }
00728
00729 int ast_rtcp_fd(struct ast_rtp *rtp)
00730 {
00731 if (rtp->rtcp)
00732 return rtp->rtcp->s;
00733 return -1;
00734 }
00735
00736 static int rtp_get_rate(int subclass)
00737 {
00738 return (subclass == AST_FORMAT_G722) ? 8000 : ast_format_rate(subclass);
00739 }
00740
00741 unsigned int ast_rtcp_calc_interval(struct ast_rtp *rtp)
00742 {
00743 unsigned int interval;
00744
00745
00746 interval = rtcpinterval;
00747 return interval;
00748 }
00749
00750
00751 void ast_rtp_set_rtptimers_onhold(struct ast_rtp *rtp)
00752 {
00753 rtp->rtptimeout = (-1) * rtp->rtptimeout;
00754 rtp->rtpholdtimeout = (-1) * rtp->rtpholdtimeout;
00755 }
00756
00757
00758 void ast_rtp_set_rtptimeout(struct ast_rtp *rtp, int timeout)
00759 {
00760 rtp->rtptimeout = timeout;
00761 }
00762
00763
00764 void ast_rtp_set_rtpholdtimeout(struct ast_rtp *rtp, int timeout)
00765 {
00766 rtp->rtpholdtimeout = timeout;
00767 }
00768
00769
00770 void ast_rtp_set_rtpkeepalive(struct ast_rtp *rtp, int period)
00771 {
00772 rtp->rtpkeepalive = period;
00773 }
00774
00775
00776 int ast_rtp_get_rtptimeout(struct ast_rtp *rtp)
00777 {
00778 if (rtp->rtptimeout < 0)
00779 return 0;
00780 return rtp->rtptimeout;
00781 }
00782
00783
00784 int ast_rtp_get_rtpholdtimeout(struct ast_rtp *rtp)
00785 {
00786 if (rtp->rtptimeout < 0)
00787 return 0;
00788 return rtp->rtpholdtimeout;
00789 }
00790
00791
00792 int ast_rtp_get_rtpkeepalive(struct ast_rtp *rtp)
00793 {
00794 return rtp->rtpkeepalive;
00795 }
00796
00797 void ast_rtp_set_data(struct ast_rtp *rtp, void *data)
00798 {
00799 rtp->data = data;
00800 }
00801
00802 void ast_rtp_set_callback(struct ast_rtp *rtp, ast_rtp_callback callback)
00803 {
00804 rtp->callback = callback;
00805 }
00806
00807 void ast_rtp_setnat(struct ast_rtp *rtp, int nat)
00808 {
00809 rtp->nat = nat;
00810 }
00811
00812 int ast_rtp_getnat(struct ast_rtp *rtp)
00813 {
00814 return ast_test_flag(rtp, FLAG_NAT_ACTIVE);
00815 }
00816
00817 void ast_rtp_setdtmf(struct ast_rtp *rtp, int dtmf)
00818 {
00819 ast_set2_flag(rtp, dtmf ? 1 : 0, FLAG_HAS_DTMF);
00820 }
00821
00822 void ast_rtp_setdtmfcompensate(struct ast_rtp *rtp, int compensate)
00823 {
00824 ast_set2_flag(rtp, compensate ? 1 : 0, FLAG_DTMF_COMPENSATE);
00825 }
00826
00827 void ast_rtp_setstun(struct ast_rtp *rtp, int stun_enable)
00828 {
00829 ast_set2_flag(rtp, stun_enable ? 1 : 0, FLAG_HAS_STUN);
00830 }
00831
00832 static void rtp_bridge_lock(struct ast_rtp *rtp)
00833 {
00834 #ifdef P2P_INTENSE
00835 ast_mutex_lock(&rtp->bridge_lock);
00836 #endif
00837 return;
00838 }
00839
00840 static void rtp_bridge_unlock(struct ast_rtp *rtp)
00841 {
00842 #ifdef P2P_INTENSE
00843 ast_mutex_unlock(&rtp->bridge_lock);
00844 #endif
00845 return;
00846 }
00847
00848
00849 static double normdev_compute(double normdev, double sample, unsigned int sample_count)
00850 {
00851 normdev = normdev * sample_count + sample;
00852 sample_count++;
00853
00854 return normdev / sample_count;
00855 }
00856
00857 static double stddev_compute(double stddev, double sample, double normdev, double normdev_curent, unsigned int sample_count)
00858 {
00859
00860
00861
00862
00863
00864
00865 #define SQUARE(x) ((x) * (x))
00866
00867 stddev = sample_count * stddev;
00868 sample_count++;
00869
00870 return stddev +
00871 ( sample_count * SQUARE( (sample - normdev) / sample_count ) ) +
00872 ( SQUARE(sample - normdev_curent) / sample_count );
00873
00874 #undef SQUARE
00875 }
00876
00877 static struct ast_frame *send_dtmf(struct ast_rtp *rtp, enum ast_frame_type type)
00878 {
00879 if (((ast_test_flag(rtp, FLAG_DTMF_COMPENSATE) && type == AST_FRAME_DTMF_END) ||
00880 (type == AST_FRAME_DTMF_BEGIN)) && ast_tvcmp(ast_tvnow(), rtp->dtmfmute) < 0) {
00881 ast_debug(1, "Ignore potential DTMF echo from '%s'\n", ast_inet_ntoa(rtp->them.sin_addr));
00882 rtp->resp = 0;
00883 rtp->dtmfsamples = 0;
00884 return &ast_null_frame;
00885 }
00886 ast_debug(1, "Sending dtmf: %d (%c), at %s\n", rtp->resp, rtp->resp, ast_inet_ntoa(rtp->them.sin_addr));
00887 if (rtp->resp == 'X') {
00888 rtp->f.frametype = AST_FRAME_CONTROL;
00889 rtp->f.subclass = AST_CONTROL_FLASH;
00890 } else {
00891 rtp->f.frametype = type;
00892 rtp->f.subclass = rtp->resp;
00893 }
00894 rtp->f.datalen = 0;
00895 rtp->f.samples = 0;
00896 rtp->f.mallocd = 0;
00897 rtp->f.src = "RTP";
00898 return &rtp->f;
00899
00900 }
00901
00902 static inline int rtp_debug_test_addr(struct sockaddr_in *addr)
00903 {
00904 if (rtpdebug == 0)
00905 return 0;
00906 if (rtpdebugaddr.sin_addr.s_addr) {
00907 if (((ntohs(rtpdebugaddr.sin_port) != 0)
00908 && (rtpdebugaddr.sin_port != addr->sin_port))
00909 || (rtpdebugaddr.sin_addr.s_addr != addr->sin_addr.s_addr))
00910 return 0;
00911 }
00912 return 1;
00913 }
00914
00915 static inline int rtcp_debug_test_addr(struct sockaddr_in *addr)
00916 {
00917 if (rtcpdebug == 0)
00918 return 0;
00919 if (rtcpdebugaddr.sin_addr.s_addr) {
00920 if (((ntohs(rtcpdebugaddr.sin_port) != 0)
00921 && (rtcpdebugaddr.sin_port != addr->sin_port))
00922 || (rtcpdebugaddr.sin_addr.s_addr != addr->sin_addr.s_addr))
00923 return 0;
00924 }
00925 return 1;
00926 }
00927
00928
00929 static struct ast_frame *process_cisco_dtmf(struct ast_rtp *rtp, unsigned char *data, int len)
00930 {
00931 unsigned int event;
00932 char resp = 0;
00933 struct ast_frame *f = NULL;
00934 unsigned char seq;
00935 unsigned int flags;
00936 unsigned int power;
00937
00938
00939 if (len < 4)
00940 return f;
00941
00942
00943
00944
00945
00946
00947
00948
00949
00950
00951
00952
00953
00954
00955
00956
00957
00958
00959
00960
00961
00962
00963
00964
00965
00966
00967
00968
00969
00970
00971
00972 seq = data[0];
00973 flags = data[1];
00974 power = data[2];
00975 event = data[3] & 0x1f;
00976
00977 if (option_debug > 2 || rtpdebug)
00978 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);
00979 if (event < 10) {
00980 resp = '0' + event;
00981 } else if (event < 11) {
00982 resp = '*';
00983 } else if (event < 12) {
00984 resp = '#';
00985 } else if (event < 16) {
00986 resp = 'A' + (event - 12);
00987 } else if (event < 17) {
00988 resp = 'X';
00989 }
00990 if ((!rtp->resp && power) || (rtp->resp && (rtp->resp != resp))) {
00991 rtp->resp = resp;
00992
00993 if (!ast_test_flag(rtp, FLAG_DTMF_COMPENSATE)) {
00994 f = send_dtmf(rtp, AST_FRAME_DTMF_BEGIN);
00995 rtp->dtmfsamples = 0;
00996 }
00997 } else if ((rtp->resp == resp) && !power) {
00998 f = send_dtmf(rtp, AST_FRAME_DTMF_END);
00999 f->samples = rtp->dtmfsamples * (rtp_get_rate(f->subclass) / 1000);
01000 rtp->resp = 0;
01001 } else if (rtp->resp == resp)
01002 rtp->dtmfsamples += 20 * (rtp_get_rate(f->subclass) / 1000);
01003 rtp->dtmf_timeout = dtmftimeout;
01004 return f;
01005 }
01006
01007
01008
01009
01010
01011
01012
01013
01014
01015
01016
01017
01018
01019 static struct ast_frame *process_rfc2833(struct ast_rtp *rtp, unsigned char *data, int len, unsigned int seqno, unsigned int timestamp)
01020 {
01021 unsigned int event;
01022 unsigned int event_end;
01023 unsigned int samples;
01024 char resp = 0;
01025 struct ast_frame *f = NULL;
01026
01027
01028 event = ntohl(*((unsigned int *)(data)));
01029 event >>= 24;
01030 event_end = ntohl(*((unsigned int *)(data)));
01031 event_end <<= 8;
01032 event_end >>= 24;
01033 samples = ntohl(*((unsigned int *)(data)));
01034 samples &= 0xFFFF;
01035
01036
01037 if (rtpdebug || option_debug > 2)
01038 ast_debug(0, "- RTP 2833 Event: %08x (len = %d)\n", event, len);
01039
01040
01041 if (event < 10) {
01042 resp = '0' + event;
01043 } else if (event < 11) {
01044 resp = '*';
01045 } else if (event < 12) {
01046 resp = '#';
01047 } else if (event < 16) {
01048 resp = 'A' + (event - 12);
01049 } else if (event < 17) {
01050 resp = 'X';
01051 } else {
01052
01053 ast_log(LOG_DEBUG, "Ignoring RTP 2833 Event: %08x. Not a DTMF Digit.\n", event);
01054 return &ast_null_frame;
01055 }
01056
01057 if (ast_test_flag(rtp, FLAG_DTMF_COMPENSATE)) {
01058 if ((rtp->lastevent != timestamp) || (rtp->resp && rtp->resp != resp)) {
01059 rtp->resp = resp;
01060 rtp->dtmf_timeout = 0;
01061 f = send_dtmf(rtp, AST_FRAME_DTMF_END);
01062 f->len = 0;
01063 rtp->lastevent = timestamp;
01064 }
01065 } else {
01066
01067
01068
01069
01070
01071 unsigned int new_duration = rtp->dtmf_duration;
01072 unsigned int last_duration = new_duration & 0xFFFF;
01073
01074 if (last_duration > 64000 && samples < last_duration)
01075 new_duration += 0xFFFF + 1;
01076 new_duration = (new_duration & ~0xFFFF) | samples;
01077
01078 if (event_end & 0x80) {
01079
01080 if ((rtp->lastevent != seqno) && rtp->resp) {
01081 rtp->dtmf_duration = new_duration;
01082 f = send_dtmf(rtp, AST_FRAME_DTMF_END);
01083 f->len = ast_tvdiff_ms(ast_samp2tv(rtp->dtmf_duration, rtp_get_rate(f->subclass)), ast_tv(0, 0));
01084 rtp->resp = 0;
01085 rtp->dtmf_duration = rtp->dtmf_timeout = 0;
01086 }
01087 } else {
01088
01089
01090 if (rtp->resp && rtp->resp != resp) {
01091
01092 f = send_dtmf(rtp, AST_FRAME_DTMF_END);
01093 f->len = ast_tvdiff_ms(ast_samp2tv(rtp->dtmf_duration, rtp_get_rate(f->subclass)), ast_tv(0, 0));
01094 rtp->resp = 0;
01095 rtp->dtmf_duration = rtp->dtmf_timeout = 0;
01096 }
01097
01098
01099 if (rtp->resp) {
01100
01101 rtp->dtmf_duration = new_duration;
01102 } else {
01103
01104 rtp->resp = resp;
01105 f = send_dtmf(rtp, AST_FRAME_DTMF_BEGIN);
01106 rtp->dtmf_duration = samples;
01107 }
01108
01109 rtp->dtmf_timeout = timestamp + rtp->dtmf_duration + dtmftimeout;
01110 }
01111
01112 rtp->lastevent = seqno;
01113 }
01114
01115 rtp->dtmfsamples = samples;
01116
01117 return f;
01118 }
01119
01120
01121
01122
01123
01124
01125
01126 static struct ast_frame *process_rfc3389(struct ast_rtp *rtp, unsigned char *data, int len)
01127 {
01128 struct ast_frame *f = NULL;
01129
01130
01131
01132 if (rtpdebug)
01133 ast_debug(0, "- RTP 3389 Comfort noise event: Level %d (len = %d)\n", rtp->lastrxformat, len);
01134
01135 if (!(ast_test_flag(rtp, FLAG_3389_WARNING))) {
01136 ast_log(LOG_NOTICE, "Comfort noise support incomplete in Asterisk (RFC 3389). Please turn off on client if possible. Client IP: %s\n",
01137 ast_inet_ntoa(rtp->them.sin_addr));
01138 ast_set_flag(rtp, FLAG_3389_WARNING);
01139 }
01140
01141
01142 if (!len)
01143 return NULL;
01144 if (len < 24) {
01145 rtp->f.data.ptr = rtp->rawdata + AST_FRIENDLY_OFFSET;
01146 rtp->f.datalen = len - 1;
01147 rtp->f.offset = AST_FRIENDLY_OFFSET;
01148 memcpy(rtp->f.data.ptr, data + 1, len - 1);
01149 } else {
01150 rtp->f.data.ptr = NULL;
01151 rtp->f.offset = 0;
01152 rtp->f.datalen = 0;
01153 }
01154 rtp->f.frametype = AST_FRAME_CNG;
01155 rtp->f.subclass = data[0] & 0x7f;
01156 rtp->f.samples = 0;
01157 rtp->f.delivery.tv_usec = rtp->f.delivery.tv_sec = 0;
01158 f = &rtp->f;
01159 return f;
01160 }
01161
01162 static int rtpread(int *id, int fd, short events, void *cbdata)
01163 {
01164 struct ast_rtp *rtp = cbdata;
01165 struct ast_frame *f;
01166 f = ast_rtp_read(rtp);
01167 if (f) {
01168 if (rtp->callback)
01169 rtp->callback(rtp, f, rtp->data);
01170 }
01171 return 1;
01172 }
01173
01174 struct ast_frame *ast_rtcp_read(struct ast_rtp *rtp)
01175 {
01176 socklen_t len;
01177 int position, i, packetwords;
01178 int res;
01179 struct sockaddr_in sock_in;
01180 unsigned int rtcpdata[8192 + AST_FRIENDLY_OFFSET];
01181 unsigned int *rtcpheader;
01182 int pt;
01183 struct timeval now;
01184 unsigned int length;
01185 int rc;
01186 double rttsec;
01187 uint64_t rtt = 0;
01188 unsigned int dlsr;
01189 unsigned int lsr;
01190 unsigned int msw;
01191 unsigned int lsw;
01192 unsigned int comp;
01193 struct ast_frame *f = &ast_null_frame;
01194
01195 double reported_jitter;
01196 double reported_normdev_jitter_current;
01197 double normdevrtt_current;
01198 double reported_lost;
01199 double reported_normdev_lost_current;
01200
01201 if (!rtp || !rtp->rtcp)
01202 return &ast_null_frame;
01203
01204 len = sizeof(sock_in);
01205
01206 res = recvfrom(rtp->rtcp->s, rtcpdata + AST_FRIENDLY_OFFSET, sizeof(rtcpdata) - sizeof(unsigned int) * AST_FRIENDLY_OFFSET,
01207 0, (struct sockaddr *)&sock_in, &len);
01208 rtcpheader = (unsigned int *)(rtcpdata + AST_FRIENDLY_OFFSET);
01209
01210 if (res < 0) {
01211 ast_assert(errno != EBADF);
01212 if (errno != EAGAIN) {
01213 ast_log(LOG_WARNING, "RTCP Read error: %s. Hanging up.\n", strerror(errno));
01214 return NULL;
01215 }
01216 return &ast_null_frame;
01217 }
01218
01219 packetwords = res / 4;
01220
01221 if (rtp->nat) {
01222
01223 if (((rtp->rtcp->them.sin_addr.s_addr != sock_in.sin_addr.s_addr) ||
01224 (rtp->rtcp->them.sin_port != sock_in.sin_port)) &&
01225 ((rtp->rtcp->altthem.sin_addr.s_addr != sock_in.sin_addr.s_addr) ||
01226 (rtp->rtcp->altthem.sin_port != sock_in.sin_port))) {
01227 memcpy(&rtp->rtcp->them, &sock_in, sizeof(rtp->rtcp->them));
01228 if (option_debug || rtpdebug)
01229 ast_debug(0, "RTCP NAT: Got RTCP from other end. Now sending to address %s:%d\n", ast_inet_ntoa(rtp->rtcp->them.sin_addr), ntohs(rtp->rtcp->them.sin_port));
01230 }
01231 }
01232
01233 ast_debug(1, "Got RTCP report of %d bytes\n", res);
01234
01235
01236 position = 0;
01237 while (position < packetwords) {
01238 i = position;
01239 length = ntohl(rtcpheader[i]);
01240 pt = (length & 0xff0000) >> 16;
01241 rc = (length & 0x1f000000) >> 24;
01242 length &= 0xffff;
01243
01244 if ((i + length) > packetwords) {
01245 if (option_debug || rtpdebug)
01246 ast_log(LOG_DEBUG, "RTCP Read too short\n");
01247 return &ast_null_frame;
01248 }
01249
01250 if (rtcp_debug_test_addr(&sock_in)) {
01251 ast_verbose("\n\nGot RTCP from %s:%d\n", ast_inet_ntoa(sock_in.sin_addr), ntohs(sock_in.sin_port));
01252 ast_verbose("PT: %d(%s)\n", pt, (pt == 200) ? "Sender Report" : (pt == 201) ? "Receiver Report" : (pt == 192) ? "H.261 FUR" : "Unknown");
01253 ast_verbose("Reception reports: %d\n", rc);
01254 ast_verbose("SSRC of sender: %u\n", rtcpheader[i + 1]);
01255 }
01256
01257 i += 2;
01258
01259 switch (pt) {
01260 case RTCP_PT_SR:
01261 gettimeofday(&rtp->rtcp->rxlsr,NULL);
01262 rtp->rtcp->spc = ntohl(rtcpheader[i+3]);
01263 rtp->rtcp->soc = ntohl(rtcpheader[i + 4]);
01264 rtp->rtcp->themrxlsr = ((ntohl(rtcpheader[i]) & 0x0000ffff) << 16) | ((ntohl(rtcpheader[i + 1]) & 0xffff0000) >> 16);
01265
01266 if (rtcp_debug_test_addr(&sock_in)) {
01267 ast_verbose("NTP timestamp: %lu.%010lu\n", (unsigned long) ntohl(rtcpheader[i]), (unsigned long) ntohl(rtcpheader[i + 1]) * 4096);
01268 ast_verbose("RTP timestamp: %lu\n", (unsigned long) ntohl(rtcpheader[i + 2]));
01269 ast_verbose("SPC: %lu\tSOC: %lu\n", (unsigned long) ntohl(rtcpheader[i + 3]), (unsigned long) ntohl(rtcpheader[i + 4]));
01270 }
01271 i += 5;
01272 if (rc < 1)
01273 break;
01274
01275 case RTCP_PT_RR:
01276
01277
01278 gettimeofday(&now, NULL);
01279 timeval2ntp(now, &msw, &lsw);
01280 if (ntohl(rtcpheader[i + 4]) && ntohl(rtcpheader[i + 5])) {
01281 comp = ((msw & 0xffff) << 16) | ((lsw & 0xffff0000) >> 16);
01282 lsr = ntohl(rtcpheader[i + 4]);
01283 dlsr = ntohl(rtcpheader[i + 5]);
01284 rtt = comp - lsr - dlsr;
01285
01286
01287
01288 if (rtt < 4294) {
01289 rtt = (rtt * 1000000) >> 16;
01290 } else {
01291 rtt = (rtt * 1000) >> 16;
01292 rtt *= 1000;
01293 }
01294 rtt = rtt / 1000.;
01295 rttsec = rtt / 1000.;
01296 rtp->rtcp->rtt = rttsec;
01297
01298 if (comp - dlsr >= lsr) {
01299 rtp->rtcp->accumulated_transit += rttsec;
01300
01301 if (rtp->rtcp->rtt_count == 0)
01302 rtp->rtcp->minrtt = rttsec;
01303
01304 if (rtp->rtcp->maxrtt<rttsec)
01305 rtp->rtcp->maxrtt = rttsec;
01306
01307 if (rtp->rtcp->minrtt>rttsec)
01308 rtp->rtcp->minrtt = rttsec;
01309
01310 normdevrtt_current = normdev_compute(rtp->rtcp->normdevrtt, rttsec, rtp->rtcp->rtt_count);
01311
01312 rtp->rtcp->stdevrtt = stddev_compute(rtp->rtcp->stdevrtt, rttsec, rtp->rtcp->normdevrtt, normdevrtt_current, rtp->rtcp->rtt_count);
01313
01314 rtp->rtcp->normdevrtt = normdevrtt_current;
01315
01316 rtp->rtcp->rtt_count++;
01317 } else if (rtcp_debug_test_addr(&sock_in)) {
01318 ast_verbose("Internal RTCP NTP clock skew detected: "
01319 "lsr=%u, now=%u, dlsr=%u (%d:%03dms), "
01320 "diff=%d\n",
01321 lsr, comp, dlsr, dlsr / 65536,
01322 (dlsr % 65536) * 1000 / 65536,
01323 dlsr - (comp - lsr));
01324 }
01325 }
01326
01327 rtp->rtcp->reported_jitter = ntohl(rtcpheader[i + 3]);
01328 reported_jitter = (double) rtp->rtcp->reported_jitter;
01329
01330 if (rtp->rtcp->reported_jitter_count == 0)
01331 rtp->rtcp->reported_minjitter = reported_jitter;
01332
01333 if (reported_jitter < rtp->rtcp->reported_minjitter)
01334 rtp->rtcp->reported_minjitter = reported_jitter;
01335
01336 if (reported_jitter > rtp->rtcp->reported_maxjitter)
01337 rtp->rtcp->reported_maxjitter = reported_jitter;
01338
01339 reported_normdev_jitter_current = normdev_compute(rtp->rtcp->reported_normdev_jitter, reported_jitter, rtp->rtcp->reported_jitter_count);
01340
01341 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);
01342
01343 rtp->rtcp->reported_normdev_jitter = reported_normdev_jitter_current;
01344
01345 rtp->rtcp->reported_lost = ntohl(rtcpheader[i + 1]) & 0xffffff;
01346
01347 reported_lost = (double) rtp->rtcp->reported_lost;
01348
01349
01350 if (rtp->rtcp->reported_jitter_count == 0)
01351 rtp->rtcp->reported_minlost = reported_lost;
01352
01353 if (reported_lost < rtp->rtcp->reported_minlost)
01354 rtp->rtcp->reported_minlost = reported_lost;
01355
01356 if (reported_lost > rtp->rtcp->reported_maxlost)
01357 rtp->rtcp->reported_maxlost = reported_lost;
01358
01359 reported_normdev_lost_current = normdev_compute(rtp->rtcp->reported_normdev_lost, reported_lost, rtp->rtcp->reported_jitter_count);
01360
01361 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);
01362
01363 rtp->rtcp->reported_normdev_lost = reported_normdev_lost_current;
01364
01365 rtp->rtcp->reported_jitter_count++;
01366
01367 if (rtcp_debug_test_addr(&sock_in)) {
01368 ast_verbose(" Fraction lost: %ld\n", (((long) ntohl(rtcpheader[i + 1]) & 0xff000000) >> 24));
01369 ast_verbose(" Packets lost so far: %d\n", rtp->rtcp->reported_lost);
01370 ast_verbose(" Highest sequence number: %ld\n", (long) (ntohl(rtcpheader[i + 2]) & 0xffff));
01371 ast_verbose(" Sequence number cycles: %ld\n", (long) (ntohl(rtcpheader[i + 2]) & 0xffff) >> 16);
01372 ast_verbose(" Interarrival jitter: %u\n", rtp->rtcp->reported_jitter);
01373 ast_verbose(" Last SR(our NTP): %lu.%010lu\n",(unsigned long) ntohl(rtcpheader[i + 4]) >> 16,((unsigned long) ntohl(rtcpheader[i + 4]) << 16) * 4096);
01374 ast_verbose(" DLSR: %4.4f (sec)\n",ntohl(rtcpheader[i + 5])/65536.0);
01375 if (rtt)
01376 ast_verbose(" RTT: %lu(sec)\n", (unsigned long) rtt);
01377 }
01378
01379 if (rtt) {
01380 manager_event(EVENT_FLAG_REPORTING, "RTCPReceived", "From: %s:%d\r\n"
01381 "PT: %d(%s)\r\n"
01382 "ReceptionReports: %d\r\n"
01383 "SenderSSRC: %u\r\n"
01384 "FractionLost: %ld\r\n"
01385 "PacketsLost: %d\r\n"
01386 "HighestSequence: %ld\r\n"
01387 "SequenceNumberCycles: %ld\r\n"
01388 "IAJitter: %u\r\n"
01389 "LastSR: %lu.%010lu\r\n"
01390 "DLSR: %4.4f(sec)\r\n"
01391 "RTT: %llu(sec)\r\n",
01392 ast_inet_ntoa(sock_in.sin_addr), ntohs(sock_in.sin_port),
01393 pt, (pt == 200) ? "Sender Report" : (pt == 201) ? "Receiver Report" : (pt == 192) ? "H.261 FUR" : "Unknown",
01394 rc,
01395 rtcpheader[i + 1],
01396 (((long) ntohl(rtcpheader[i + 1]) & 0xff000000) >> 24),
01397 rtp->rtcp->reported_lost,
01398 (long) (ntohl(rtcpheader[i + 2]) & 0xffff),
01399 (long) (ntohl(rtcpheader[i + 2]) & 0xffff) >> 16,
01400 rtp->rtcp->reported_jitter,
01401 (unsigned long) ntohl(rtcpheader[i + 4]) >> 16, ((unsigned long) ntohl(rtcpheader[i + 4]) << 16) * 4096,
01402 ntohl(rtcpheader[i + 5])/65536.0,
01403 (unsigned long long)rtt);
01404 } else {
01405 manager_event(EVENT_FLAG_REPORTING, "RTCPReceived", "From: %s:%d\r\n"
01406 "PT: %d(%s)\r\n"
01407 "ReceptionReports: %d\r\n"
01408 "SenderSSRC: %u\r\n"
01409 "FractionLost: %ld\r\n"
01410 "PacketsLost: %d\r\n"
01411 "HighestSequence: %ld\r\n"
01412 "SequenceNumberCycles: %ld\r\n"
01413 "IAJitter: %u\r\n"
01414 "LastSR: %lu.%010lu\r\n"
01415 "DLSR: %4.4f(sec)\r\n",
01416 ast_inet_ntoa(sock_in.sin_addr), ntohs(sock_in.sin_port),
01417 pt, (pt == 200) ? "Sender Report" : (pt == 201) ? "Receiver Report" : (pt == 192) ? "H.261 FUR" : "Unknown",
01418 rc,
01419 rtcpheader[i + 1],
01420 (((long) ntohl(rtcpheader[i + 1]) & 0xff000000) >> 24),
01421 rtp->rtcp->reported_lost,
01422 (long) (ntohl(rtcpheader[i + 2]) & 0xffff),
01423 (long) (ntohl(rtcpheader[i + 2]) & 0xffff) >> 16,
01424 rtp->rtcp->reported_jitter,
01425 (unsigned long) ntohl(rtcpheader[i + 4]) >> 16,
01426 ((unsigned long) ntohl(rtcpheader[i + 4]) << 16) * 4096,
01427 ntohl(rtcpheader[i + 5])/65536.0);
01428 }
01429 break;
01430 case RTCP_PT_FUR:
01431 if (rtcp_debug_test_addr(&sock_in))
01432 ast_verbose("Received an RTCP Fast Update Request\n");
01433 rtp->f.frametype = AST_FRAME_CONTROL;
01434 rtp->f.subclass = AST_CONTROL_VIDUPDATE;
01435 rtp->f.datalen = 0;
01436 rtp->f.samples = 0;
01437 rtp->f.mallocd = 0;
01438 rtp->f.src = "RTP";
01439 f = &rtp->f;
01440 break;
01441 case RTCP_PT_SDES:
01442 if (rtcp_debug_test_addr(&sock_in))
01443 ast_verbose("Received an SDES from %s:%d\n", ast_inet_ntoa(rtp->rtcp->them.sin_addr), ntohs(rtp->rtcp->them.sin_port));
01444 break;
01445 case RTCP_PT_BYE:
01446 if (rtcp_debug_test_addr(&sock_in))
01447 ast_verbose("Received a BYE from %s:%d\n", ast_inet_ntoa(rtp->rtcp->them.sin_addr), ntohs(rtp->rtcp->them.sin_port));
01448 break;
01449 default:
01450 ast_debug(1, "Unknown RTCP packet (pt=%d) received from %s:%d\n", pt, ast_inet_ntoa(rtp->rtcp->them.sin_addr), ntohs(rtp->rtcp->them.sin_port));
01451 break;
01452 }
01453 position += (length + 1);
01454 }
01455 rtp->rtcp->rtcp_info = 1;
01456 return f;
01457 }
01458
01459 static void calc_rxstamp(struct timeval *when, struct ast_rtp *rtp, unsigned int timestamp, int mark)
01460 {
01461 struct timeval now;
01462 struct timeval tmp;
01463 double transit;
01464 double current_time;
01465 double d;
01466 double dtv;
01467 double prog;
01468 double normdev_rxjitter_current;
01469 int rate = rtp_get_rate(rtp->f.subclass);
01470
01471 if ((!rtp->rxcore.tv_sec && !rtp->rxcore.tv_usec) || mark) {
01472 gettimeofday(&rtp->rxcore, NULL);
01473 rtp->drxcore = (double) rtp->rxcore.tv_sec + (double) rtp->rxcore.tv_usec / 1000000;
01474
01475 rtp->seedrxts = timestamp;
01476 tmp = ast_samp2tv(timestamp, rate);
01477 rtp->rxcore = ast_tvsub(rtp->rxcore, tmp);
01478
01479 rtp->rxcore.tv_usec -= rtp->rxcore.tv_usec % 100;
01480 }
01481
01482 gettimeofday(&now,NULL);
01483
01484 tmp = ast_samp2tv(timestamp, rate);
01485 *when = ast_tvadd(rtp->rxcore, tmp);
01486
01487 prog = (double)((timestamp-rtp->seedrxts)/(float)(rate));
01488 dtv = (double)rtp->drxcore + (double)(prog);
01489 current_time = (double)now.tv_sec + (double)now.tv_usec/1000000;
01490 transit = current_time - dtv;
01491 d = transit - rtp->rxtransit;
01492 rtp->rxtransit = transit;
01493 if (d<0)
01494 d=-d;
01495 rtp->rxjitter += (1./16.) * (d - rtp->rxjitter);
01496
01497 if (rtp->rtcp) {
01498 if (rtp->rxjitter > rtp->rtcp->maxrxjitter)
01499 rtp->rtcp->maxrxjitter = rtp->rxjitter;
01500 if (rtp->rtcp->rxjitter_count == 1)
01501 rtp->rtcp->minrxjitter = rtp->rxjitter;
01502 if (rtp->rxjitter < rtp->rtcp->minrxjitter)
01503 rtp->rtcp->minrxjitter = rtp->rxjitter;
01504
01505 normdev_rxjitter_current = normdev_compute(rtp->rtcp->normdev_rxjitter,rtp->rxjitter,rtp->rtcp->rxjitter_count);
01506 rtp->rtcp->stdev_rxjitter = stddev_compute(rtp->rtcp->stdev_rxjitter,rtp->rxjitter,rtp->rtcp->normdev_rxjitter,normdev_rxjitter_current,rtp->rtcp->rxjitter_count);
01507
01508 rtp->rtcp->normdev_rxjitter = normdev_rxjitter_current;
01509 rtp->rtcp->rxjitter_count++;
01510 }
01511 }
01512
01513
01514 static int bridge_p2p_rtp_write(struct ast_rtp *rtp, struct ast_rtp *bridged, unsigned int *rtpheader, int len, int hdrlen)
01515 {
01516 int res = 0, payload = 0, bridged_payload = 0, mark;
01517 struct rtpPayloadType rtpPT;
01518 int reconstruct = ntohl(rtpheader[0]);
01519
01520
01521 payload = (reconstruct & 0x7f0000) >> 16;
01522 mark = (((reconstruct & 0x800000) >> 23) != 0);
01523
01524
01525 rtpPT = ast_rtp_lookup_pt(rtp, payload);
01526
01527
01528 if (ast_test_flag(rtp, FLAG_P2P_NEED_DTMF) && !rtpPT.isAstFormat && rtpPT.code == AST_RTP_DTMF)
01529 return -1;
01530
01531
01532 bridged_payload = ast_rtp_lookup_code(bridged, rtpPT.isAstFormat, rtpPT.code);
01533
01534
01535 if (!bridged->current_RTP_PT[bridged_payload].code)
01536 return -1;
01537
01538
01539
01540 if (!ast_test_flag(rtp, FLAG_P2P_SENT_MARK)) {
01541 mark = 1;
01542 ast_set_flag(rtp, FLAG_P2P_SENT_MARK);
01543 }
01544
01545
01546 reconstruct &= 0xFF80FFFF;
01547 reconstruct |= (bridged_payload << 16);
01548 reconstruct |= (mark << 23);
01549 rtpheader[0] = htonl(reconstruct);
01550
01551
01552 res = sendto(bridged->s, (void *)rtpheader, len, 0, (struct sockaddr *)&bridged->them, sizeof(bridged->them));
01553 if (res < 0) {
01554 if (!bridged->nat || (bridged->nat && (ast_test_flag(bridged, FLAG_NAT_ACTIVE) == FLAG_NAT_ACTIVE))) {
01555 ast_debug(1, "RTP Transmission error of packet to %s:%d: %s\n", ast_inet_ntoa(bridged->them.sin_addr), ntohs(bridged->them.sin_port), strerror(errno));
01556 } else if (((ast_test_flag(bridged, FLAG_NAT_ACTIVE) == FLAG_NAT_INACTIVE) || rtpdebug) && !ast_test_flag(bridged, FLAG_NAT_INACTIVE_NOWARN)) {
01557 if (option_debug || rtpdebug)
01558 ast_debug(0, "RTP NAT: Can't write RTP to private address %s:%d, waiting for other end to send audio...\n", ast_inet_ntoa(bridged->them.sin_addr), ntohs(bridged->them.sin_port));
01559 ast_set_flag(bridged, FLAG_NAT_INACTIVE_NOWARN);
01560 }
01561 return 0;
01562 } else if (rtp_debug_test_addr(&bridged->them))
01563 ast_verbose("Sent RTP P2P packet to %s:%u (type %-2.2d, len %-6.6u)\n", ast_inet_ntoa(bridged->them.sin_addr), ntohs(bridged->them.sin_port), bridged_payload, len - hdrlen);
01564
01565 return 0;
01566 }
01567
01568 struct ast_frame *ast_rtp_read(struct ast_rtp *rtp)
01569 {
01570 int res;
01571 struct sockaddr_in sock_in;
01572 socklen_t len;
01573 unsigned int seqno;
01574 int version;
01575 int payloadtype;
01576 int hdrlen = 12;
01577 int padding;
01578 int mark;
01579 int ext;
01580 int cc;
01581 unsigned int ssrc;
01582 unsigned int timestamp;
01583 unsigned int *rtpheader;
01584 struct rtpPayloadType rtpPT;
01585 struct ast_rtp *bridged = NULL;
01586 int prev_seqno;
01587
01588
01589 if (rtp->sending_digit)
01590 ast_rtp_senddigit_continuation(rtp);
01591
01592 len = sizeof(sock_in);
01593
01594
01595 res = recvfrom(rtp->s, rtp->rawdata + AST_FRIENDLY_OFFSET, sizeof(rtp->rawdata) - AST_FRIENDLY_OFFSET,
01596 0, (struct sockaddr *)&sock_in, &len);
01597
01598
01599 if (rtp->strict_rtp_state == STRICT_RTP_LEARN) {
01600
01601 memcpy(&rtp->strict_rtp_address, &sock_in, sizeof(rtp->strict_rtp_address));
01602
01603 rtp->strict_rtp_state = STRICT_RTP_CLOSED;
01604 ast_debug(1, "Learned remote address is %s:%d for strict RTP purposes, now protecting the port.\n", ast_inet_ntoa(rtp->strict_rtp_address.sin_addr), ntohs(rtp->strict_rtp_address.sin_port));
01605 } else if (rtp->strict_rtp_state == STRICT_RTP_CLOSED) {
01606
01607 if ((rtp->strict_rtp_address.sin_addr.s_addr != sock_in.sin_addr.s_addr) || (rtp->strict_rtp_address.sin_port != sock_in.sin_port)) {
01608 ast_debug(1, "Received RTP packet from %s:%d, dropping due to strict RTP protection. Expected it to be from %s:%d\n", ast_inet_ntoa(sock_in.sin_addr), ntohs(sock_in.sin_port), ast_inet_ntoa(rtp->strict_rtp_address.sin_addr), ntohs(rtp->strict_rtp_address.sin_port));
01609 return &ast_null_frame;
01610 }
01611 }
01612
01613 rtpheader = (unsigned int *)(rtp->rawdata + AST_FRIENDLY_OFFSET);
01614 if (res < 0) {
01615 ast_assert(errno != EBADF);
01616 if (errno != EAGAIN) {
01617 ast_log(LOG_WARNING, "RTP Read error: %s. Hanging up.\n", strerror(errno));
01618 return NULL;
01619 }
01620 return &ast_null_frame;
01621 }
01622
01623 if (res < hdrlen) {
01624 ast_log(LOG_WARNING, "RTP Read too short\n");
01625 return &ast_null_frame;
01626 }
01627
01628
01629 seqno = ntohl(rtpheader[0]);
01630
01631
01632 version = (seqno & 0xC0000000) >> 30;
01633 if (!version) {
01634
01635
01636
01637
01638
01639 if ((stun_handle_packet(rtp->s, &sock_in, rtp->rawdata + AST_FRIENDLY_OFFSET, res, NULL, NULL) == STUN_ACCEPT) &&
01640 (!rtp->them.sin_port && !rtp->them.sin_addr.s_addr)) {
01641 memcpy(&rtp->them, &sock_in, sizeof(rtp->them));
01642 }
01643 return &ast_null_frame;
01644 }
01645
01646 #if 0
01647
01648 if (!rtp->them.sin_addr.s_addr || !rtp->them.sin_port)
01649 return &ast_null_frame;
01650 #endif
01651
01652
01653 if (rtp->nat) {
01654 if (((rtp->them.sin_addr.s_addr != sock_in.sin_addr.s_addr) ||
01655 (rtp->them.sin_port != sock_in.sin_port)) &&
01656 ((rtp->altthem.sin_addr.s_addr != sock_in.sin_addr.s_addr) ||
01657 (rtp->altthem.sin_port != sock_in.sin_port))) {
01658 rtp->them = sock_in;
01659 if (rtp->rtcp) {
01660 int h = 0;
01661 memcpy(&rtp->rtcp->them, &sock_in, sizeof(rtp->rtcp->them));
01662 h = ntohs(rtp->them.sin_port);
01663 rtp->rtcp->them.sin_port = htons(h + 1);
01664 }
01665 rtp->rxseqno = 0;
01666 ast_set_flag(rtp, FLAG_NAT_ACTIVE);
01667 if (option_debug || rtpdebug)
01668 ast_debug(0, "RTP NAT: Got audio from other end. Now sending to address %s:%d\n", ast_inet_ntoa(rtp->them.sin_addr), ntohs(rtp->them.sin_port));
01669 }
01670 }
01671
01672
01673 if ((bridged = ast_rtp_get_bridged(rtp)) && !bridge_p2p_rtp_write(rtp, bridged, rtpheader, res, hdrlen))
01674 return &ast_null_frame;
01675
01676 if (version != 2)
01677 return &ast_null_frame;
01678
01679 payloadtype = (seqno & 0x7f0000) >> 16;
01680 padding = seqno & (1 << 29);
01681 mark = seqno & (1 << 23);
01682 ext = seqno & (1 << 28);
01683 cc = (seqno & 0xF000000) >> 24;
01684 seqno &= 0xffff;
01685 timestamp = ntohl(rtpheader[1]);
01686 ssrc = ntohl(rtpheader[2]);
01687
01688 if (!mark && rtp->rxssrc && rtp->rxssrc != ssrc) {
01689 if (option_debug || rtpdebug)
01690 ast_debug(0, "Forcing Marker bit, because SSRC has changed\n");
01691 mark = 1;
01692 }
01693
01694 rtp->rxssrc = ssrc;
01695
01696 if (padding) {
01697
01698 res -= rtp->rawdata[AST_FRIENDLY_OFFSET + res - 1];
01699 }
01700
01701 if (cc) {
01702
01703 hdrlen += cc*4;
01704 }
01705
01706 if (ext) {
01707
01708 hdrlen += (ntohl(rtpheader[hdrlen/4]) & 0xffff) << 2;
01709 hdrlen += 4;
01710 if (option_debug) {
01711 int profile;
01712 profile = (ntohl(rtpheader[3]) & 0xffff0000) >> 16;
01713 if (profile == 0x505a)
01714 ast_debug(1, "Found Zfone extension in RTP stream - zrtp - not supported.\n");
01715 else
01716 ast_debug(1, "Found unknown RTP Extensions %x\n", profile);
01717 }
01718 }
01719
01720 if (res < hdrlen) {
01721 ast_log(LOG_WARNING, "RTP Read too short (%d, expecting %d)\n", res, hdrlen);
01722 return &ast_null_frame;
01723 }
01724
01725 rtp->rxcount++;
01726
01727 if (rtp->rxcount==1) {
01728
01729 rtp->seedrxseqno = seqno;
01730 }
01731
01732
01733 if (rtp->rtcp && rtp->rtcp->them.sin_addr.s_addr && rtp->rtcp->schedid < 1) {
01734
01735 rtp->rtcp->schedid = ast_sched_add(rtp->sched, ast_rtcp_calc_interval(rtp), ast_rtcp_write, rtp);
01736 }
01737 if ((int)rtp->lastrxseqno - (int)seqno > 100)
01738 rtp->cycles += RTP_SEQ_MOD;
01739
01740 prev_seqno = rtp->lastrxseqno;
01741
01742 rtp->lastrxseqno = seqno;
01743
01744 if (!rtp->themssrc)
01745 rtp->themssrc = ntohl(rtpheader[2]);
01746
01747 if (rtp_debug_test_addr(&sock_in))
01748 ast_verbose("Got RTP packet from %s:%u (type %-2.2d, seq %-6.6u, ts %-6.6u, len %-6.6u)\n",
01749 ast_inet_ntoa(sock_in.sin_addr), ntohs(sock_in.sin_port), payloadtype, seqno, timestamp,res - hdrlen);
01750
01751 rtpPT = ast_rtp_lookup_pt(rtp, payloadtype);
01752 if (!rtpPT.isAstFormat) {
01753 struct ast_frame *f = NULL;
01754
01755
01756 if (rtpPT.code == AST_RTP_DTMF) {
01757
01758 if (rtp_debug_test_addr(&sock_in)) {
01759 unsigned char *data;
01760 unsigned int event;
01761 unsigned int event_end;
01762 unsigned int duration;
01763 data = rtp->rawdata + AST_FRIENDLY_OFFSET + hdrlen;
01764 event = ntohl(*((unsigned int *)(data)));
01765 event >>= 24;
01766 event_end = ntohl(*((unsigned int *)(data)));
01767 event_end <<= 8;
01768 event_end >>= 24;
01769 duration = ntohl(*((unsigned int *)(data)));
01770 duration &= 0xFFFF;
01771 ast_verbose("Got RTP RFC2833 from %s:%u (type %-2.2d, seq %-6.6u, ts %-6.6u, len %-6.6u, mark %d, event %08x, end %d, duration %-5.5d) \n", ast_inet_ntoa(sock_in.sin_addr), ntohs(sock_in.sin_port), payloadtype, seqno, timestamp, res - hdrlen, (mark?1:0), event, ((event_end & 0x80)?1:0), duration);
01772 }
01773 f = process_rfc2833(rtp, rtp->rawdata + AST_FRIENDLY_OFFSET + hdrlen, res - hdrlen, seqno, timestamp);
01774 } else if (rtpPT.code == AST_RTP_CISCO_DTMF) {
01775
01776 if (rtp->lastevent <= seqno || (rtp->lastevent >= 65530 && seqno <= 6)) {
01777 f = process_cisco_dtmf(rtp, rtp->rawdata + AST_FRIENDLY_OFFSET + hdrlen, res - hdrlen);
01778 rtp->lastevent = seqno;
01779 }
01780 } else if (rtpPT.code == AST_RTP_CN) {
01781
01782 f = process_rfc3389(rtp, rtp->rawdata + AST_FRIENDLY_OFFSET + hdrlen, res - hdrlen);
01783 } else {
01784 ast_log(LOG_NOTICE, "Unknown RTP codec %d received from '%s'\n", payloadtype, ast_inet_ntoa(rtp->them.sin_addr));
01785 }
01786 return f ? f : &ast_null_frame;
01787 }
01788 rtp->lastrxformat = rtp->f.subclass = rtpPT.code;
01789 rtp->f.frametype = (rtp->f.subclass & AST_FORMAT_AUDIO_MASK) ? AST_FRAME_VOICE : (rtp->f.subclass & AST_FORMAT_VIDEO_MASK) ? AST_FRAME_VIDEO : AST_FRAME_TEXT;
01790
01791 rtp->rxseqno = seqno;
01792
01793 if (rtp->dtmf_timeout && rtp->dtmf_timeout < timestamp) {
01794 rtp->dtmf_timeout = 0;
01795
01796 if (rtp->resp) {
01797 struct ast_frame *f;
01798 f = send_dtmf(rtp, AST_FRAME_DTMF_END);
01799 f->len = ast_tvdiff_ms(ast_samp2tv(rtp->dtmf_duration, rtp_get_rate(f->subclass)), ast_tv(0, 0));
01800 rtp->resp = 0;
01801 rtp->dtmf_timeout = rtp->dtmf_duration = 0;
01802 return f;
01803 }
01804 }
01805
01806
01807 rtp->lastrxts = timestamp;
01808
01809 rtp->f.mallocd = 0;
01810 rtp->f.datalen = res - hdrlen;
01811 rtp->f.data.ptr = rtp->rawdata + hdrlen + AST_FRIENDLY_OFFSET;
01812 rtp->f.offset = hdrlen + AST_FRIENDLY_OFFSET;
01813 rtp->f.seqno = seqno;
01814
01815 if (rtp->f.subclass == AST_FORMAT_T140 && (int)seqno - (prev_seqno+1) > 0 && (int)seqno - (prev_seqno+1) < 10) {
01816 unsigned char *data = rtp->f.data.ptr;
01817
01818 memmove(rtp->f.data.ptr+3, rtp->f.data.ptr, rtp->f.datalen);
01819 rtp->f.datalen +=3;
01820 *data++ = 0xEF;
01821 *data++ = 0xBF;
01822 *data = 0xBD;
01823 }
01824
01825 if (rtp->f.subclass == AST_FORMAT_T140RED) {
01826 unsigned char *data = rtp->f.data.ptr;
01827 unsigned char *header_end;
01828 int num_generations;
01829 int header_length;
01830 int length;
01831 int diff =(int)seqno - (prev_seqno+1);
01832 int x;
01833
01834 rtp->f.subclass = AST_FORMAT_T140;
01835 header_end = memchr(data, ((*data) & 0x7f), rtp->f.datalen);
01836 if (header_end == NULL) {
01837 return &ast_null_frame;
01838 }
01839 header_end++;
01840
01841 header_length = header_end - data;
01842 num_generations = header_length / 4;
01843 length = header_length;
01844
01845 if (!diff) {
01846 for (x = 0; x < num_generations; x++)
01847 length += data[x * 4 + 3];
01848
01849 if (!(rtp->f.datalen - length))
01850 return &ast_null_frame;
01851
01852 rtp->f.data.ptr += length;
01853 rtp->f.datalen -= length;
01854 } else if (diff > num_generations && diff < 10) {
01855 length -= 3;
01856 rtp->f.data.ptr += length;
01857 rtp->f.datalen -= length;
01858
01859 data = rtp->f.data.ptr;
01860 *data++ = 0xEF;
01861 *data++ = 0xBF;
01862 *data = 0xBD;
01863 } else {
01864 for ( x = 0; x < num_generations - diff; x++)
01865 length += data[x * 4 + 3];
01866
01867 rtp->f.data.ptr += length;
01868 rtp->f.datalen -= length;
01869 }
01870 }
01871
01872 if (rtp->f.subclass & AST_FORMAT_AUDIO_MASK) {
01873 rtp->f.samples = ast_codec_get_samples(&rtp->f);
01874 if (rtp->f.subclass == AST_FORMAT_SLINEAR)
01875 ast_frame_byteswap_be(&rtp->f);
01876 calc_rxstamp(&rtp->f.delivery, rtp, timestamp, mark);
01877
01878 ast_set_flag(&rtp->f, AST_FRFLAG_HAS_TIMING_INFO);
01879 rtp->f.ts = timestamp / (rtp_get_rate(rtp->f.subclass) / 1000);
01880 rtp->f.len = rtp->f.samples / ( (ast_format_rate(rtp->f.subclass) == 16000) ? 16 : 8 );
01881 } else if (rtp->f.subclass & AST_FORMAT_VIDEO_MASK) {
01882
01883 if (!rtp->lastividtimestamp)
01884 rtp->lastividtimestamp = timestamp;
01885 rtp->f.samples = timestamp - rtp->lastividtimestamp;
01886 rtp->lastividtimestamp = timestamp;
01887 rtp->f.delivery.tv_sec = 0;
01888 rtp->f.delivery.tv_usec = 0;
01889
01890
01891
01892
01893
01894 if (mark)
01895 rtp->f.subclass |= 0x1;
01896 } else {
01897
01898 if (!rtp->lastitexttimestamp)
01899 rtp->lastitexttimestamp = timestamp;
01900 rtp->f.samples = timestamp - rtp->lastitexttimestamp;
01901 rtp->lastitexttimestamp = timestamp;
01902 rtp->f.delivery.tv_sec = 0;
01903 rtp->f.delivery.tv_usec = 0;
01904 }
01905 rtp->f.src = "RTP";
01906 return &rtp->f;
01907 }
01908
01909
01910
01911 static struct {
01912 struct rtpPayloadType payloadType;
01913 char* type;
01914 char* subtype;
01915 } mimeTypes[] = {
01916 {{1, AST_FORMAT_G723_1}, "audio", "G723"},
01917 {{1, AST_FORMAT_GSM}, "audio", "GSM"},
01918 {{1, AST_FORMAT_ULAW}, "audio", "PCMU"},
01919 {{1, AST_FORMAT_ULAW}, "audio", "G711U"},
01920 {{1, AST_FORMAT_ALAW}, "audio", "PCMA"},
01921 {{1, AST_FORMAT_ALAW}, "audio", "G711A"},
01922 {{1, AST_FORMAT_G726}, "audio", "G726-32"},
01923 {{1, AST_FORMAT_ADPCM}, "audio", "DVI4"},
01924 {{1, AST_FORMAT_SLINEAR}, "audio", "L16"},
01925 {{1, AST_FORMAT_LPC10}, "audio", "LPC"},
01926 {{1, AST_FORMAT_G729A}, "audio", "G729"},
01927 {{1, AST_FORMAT_G729A}, "audio", "G729A"},
01928 {{1, AST_FORMAT_G729A}, "audio", "G.729"},
01929 {{1, AST_FORMAT_SPEEX}, "audio", "speex"},
01930 {{1, AST_FORMAT_ILBC}, "audio", "iLBC"},
01931 {{1, AST_FORMAT_G722}, "audio", "G722"},
01932 {{1, AST_FORMAT_G726_AAL2}, "audio", "AAL2-G726-32"},
01933 {{0, AST_RTP_DTMF}, "audio", "telephone-event"},
01934 {{0, AST_RTP_CISCO_DTMF}, "audio", "cisco-telephone-event"},
01935 {{0, AST_RTP_CN}, "audio", "CN"},
01936 {{1, AST_FORMAT_JPEG}, "video", "JPEG"},
01937 {{1, AST_FORMAT_PNG}, "video", "PNG"},
01938 {{1, AST_FORMAT_H261}, "video", "H261"},
01939 {{1, AST_FORMAT_H263}, "video", "H263"},
01940 {{1, AST_FORMAT_H263_PLUS}, "video", "h263-1998"},
01941 {{1, AST_FORMAT_H264}, "video", "H264"},
01942 {{1, AST_FORMAT_MP4_VIDEO}, "video", "MP4V-ES"},
01943 {{1, AST_FORMAT_T140RED}, "text", "RED"},
01944 {{1, AST_FORMAT_T140}, "text", "T140"},
01945 };
01946
01947
01948
01949
01950
01951
01952
01953
01954
01955
01956
01957 static struct rtpPayloadType static_RTP_PT[MAX_RTP_PT] = {
01958 [0] = {1, AST_FORMAT_ULAW},
01959 #ifdef USE_DEPRECATED_G726
01960 [2] = {1, AST_FORMAT_G726},
01961 #endif
01962 [3] = {1, AST_FORMAT_GSM},
01963 [4] = {1, AST_FORMAT_G723_1},
01964 [5] = {1, AST_FORMAT_ADPCM},
01965 [6] = {1, AST_FORMAT_ADPCM},
01966 [7] = {1, AST_FORMAT_LPC10},
01967 [8] = {1, AST_FORMAT_ALAW},
01968 [9] = {1, AST_FORMAT_G722},
01969 [10] = {1, AST_FORMAT_SLINEAR},
01970 [11] = {1, AST_FORMAT_SLINEAR},
01971 [13] = {0, AST_RTP_CN},
01972 [16] = {1, AST_FORMAT_ADPCM},
01973 [17] = {1, AST_FORMAT_ADPCM},
01974 [18] = {1, AST_FORMAT_G729A},
01975 [19] = {0, AST_RTP_CN},
01976 [26] = {1, AST_FORMAT_JPEG},
01977 [31] = {1, AST_FORMAT_H261},
01978 [34] = {1, AST_FORMAT_H263},
01979 [97] = {1, AST_FORMAT_ILBC},
01980 [98] = {1, AST_FORMAT_H263_PLUS},
01981 [99] = {1, AST_FORMAT_H264},
01982 [101] = {0, AST_RTP_DTMF},
01983 [103] = {1, AST_FORMAT_H263_PLUS},
01984 [104] = {1, AST_FORMAT_MP4_VIDEO},
01985 [105] = {1, AST_FORMAT_T140RED},
01986 [106] = {1, AST_FORMAT_T140},
01987 [110] = {1, AST_FORMAT_SPEEX},
01988 [111] = {1, AST_FORMAT_G726},
01989 [112] = {1, AST_FORMAT_G726_AAL2},
01990 [121] = {0, AST_RTP_CISCO_DTMF},
01991 };
01992
01993 void ast_rtp_pt_clear(struct ast_rtp* rtp)
01994 {
01995 int i;
01996
01997 if (!rtp)
01998 return;
01999
02000 rtp_bridge_lock(rtp);
02001
02002 for (i = 0; i < MAX_RTP_PT; ++i) {
02003 rtp->current_RTP_PT[i].isAstFormat = 0;
02004 rtp->current_RTP_PT[i].code = 0;
02005 }
02006
02007 rtp->rtp_lookup_code_cache_isAstFormat = 0;
02008 rtp->rtp_lookup_code_cache_code = 0;
02009 rtp->rtp_lookup_code_cache_result = 0;
02010
02011 rtp_bridge_unlock(rtp);
02012 }
02013
02014 void ast_rtp_pt_default(struct ast_rtp* rtp)
02015 {
02016 int i;
02017
02018 rtp_bridge_lock(rtp);
02019
02020
02021 for (i = 0; i < MAX_RTP_PT; ++i) {
02022 rtp->current_RTP_PT[i].isAstFormat = static_RTP_PT[i].isAstFormat;
02023 rtp->current_RTP_PT[i].code = static_RTP_PT[i].code;
02024 }
02025
02026 rtp->rtp_lookup_code_cache_isAstFormat = 0;
02027 rtp->rtp_lookup_code_cache_code = 0;
02028 rtp->rtp_lookup_code_cache_result = 0;
02029
02030 rtp_bridge_unlock(rtp);
02031 }
02032
02033 void ast_rtp_pt_copy(struct ast_rtp *dest, struct ast_rtp *src)
02034 {
02035 unsigned int i;
02036
02037 rtp_bridge_lock(dest);
02038 rtp_bridge_lock(src);
02039
02040 for (i = 0; i < MAX_RTP_PT; ++i) {
02041 dest->current_RTP_PT[i].isAstFormat =
02042 src->current_RTP_PT[i].isAstFormat;
02043 dest->current_RTP_PT[i].code =
02044 src->current_RTP_PT[i].code;
02045 }
02046 dest->rtp_lookup_code_cache_isAstFormat = 0;
02047 dest->rtp_lookup_code_cache_code = 0;
02048 dest->rtp_lookup_code_cache_result = 0;
02049
02050 rtp_bridge_unlock(src);
02051 rtp_bridge_unlock(dest);
02052 }
02053
02054
02055 static struct ast_rtp_protocol *get_proto(struct ast_channel *chan)
02056 {
02057 struct ast_rtp_protocol *cur = NULL;
02058
02059 AST_RWLIST_RDLOCK(&protos);
02060 AST_RWLIST_TRAVERSE(&protos, cur, list) {
02061 if (cur->type == chan->tech->type)
02062 break;
02063 }
02064 AST_RWLIST_UNLOCK(&protos);
02065
02066 return cur;
02067 }
02068
02069 int ast_rtp_early_bridge(struct ast_channel *c0, struct ast_channel *c1)
02070 {
02071 struct ast_rtp *destp = NULL, *srcp = NULL;
02072 struct ast_rtp *vdestp = NULL, *vsrcp = NULL;
02073 struct ast_rtp *tdestp = NULL, *tsrcp = NULL;
02074 struct ast_rtp_protocol *destpr = NULL, *srcpr = NULL;
02075 enum ast_rtp_get_result audio_dest_res = AST_RTP_GET_FAILED, video_dest_res = AST_RTP_GET_FAILED, text_dest_res = AST_RTP_GET_FAILED;
02076 enum ast_rtp_get_result audio_src_res = AST_RTP_GET_FAILED, video_src_res = AST_RTP_GET_FAILED, text_src_res = AST_RTP_GET_FAILED;
02077 int srccodec, destcodec, nat_active = 0;
02078
02079
02080 ast_channel_lock(c0);
02081 if (c1) {
02082 while (ast_channel_trylock(c1)) {
02083 ast_channel_unlock(c0);
02084 usleep(1);
02085 ast_channel_lock(c0);
02086 }
02087 }
02088
02089
02090 destpr = get_proto(c0);
02091 if (c1)
02092 srcpr = get_proto(c1);
02093 if (!destpr) {
02094 ast_debug(1, "Channel '%s' has no RTP, not doing anything\n", c0->name);
02095 ast_channel_unlock(c0);
02096 if (c1)
02097 ast_channel_unlock(c1);
02098 return -1;
02099 }
02100 if (!srcpr) {
02101 ast_debug(1, "Channel '%s' has no RTP, not doing anything\n", c1 ? c1->name : "<unspecified>");
02102 ast_channel_unlock(c0);
02103 if (c1)
02104 ast_channel_unlock(c1);
02105 return -1;
02106 }
02107
02108
02109 audio_dest_res = destpr->get_rtp_info(c0, &destp);
02110 video_dest_res = destpr->get_vrtp_info ? destpr->get_vrtp_info(c0, &vdestp) : AST_RTP_GET_FAILED;
02111 text_dest_res = destpr->get_trtp_info ? destpr->get_trtp_info(c0, &tdestp) : AST_RTP_GET_FAILED;
02112 if (srcpr) {
02113 audio_src_res = srcpr->get_rtp_info(c1, &srcp);
02114 video_src_res = srcpr->get_vrtp_info ? srcpr->get_vrtp_info(c1, &vsrcp) : AST_RTP_GET_FAILED;
02115 text_src_res = srcpr->get_trtp_info ? srcpr->get_trtp_info(c1, &tsrcp) : AST_RTP_GET_FAILED;
02116 }
02117
02118
02119 if (audio_dest_res != AST_RTP_TRY_NATIVE || (video_dest_res != AST_RTP_GET_FAILED && video_dest_res != AST_RTP_TRY_NATIVE)) {
02120
02121 ast_channel_unlock(c0);
02122 if (c1)
02123 ast_channel_unlock(c1);
02124 return -1;
02125 }
02126 if (audio_src_res == AST_RTP_TRY_NATIVE && (video_src_res == AST_RTP_GET_FAILED || video_src_res == AST_RTP_TRY_NATIVE) && srcpr->get_codec)
02127 srccodec = srcpr->get_codec(c1);
02128 else
02129 srccodec = 0;
02130 if (audio_dest_res == AST_RTP_TRY_NATIVE && (video_dest_res == AST_RTP_GET_FAILED || video_dest_res == AST_RTP_TRY_NATIVE) && destpr->get_codec)
02131 destcodec = destpr->get_codec(c0);
02132 else
02133 destcodec = 0;
02134
02135 if (srcp && !(srccodec & destcodec)) {
02136 ast_channel_unlock(c0);
02137 ast_channel_unlock(c1);
02138 return 0;
02139 }
02140
02141 if (audio_src_res == AST_RTP_TRY_NATIVE && !srcp->them.sin_addr.s_addr)
02142 srcp = NULL;
02143 if (srcp && (srcp->nat || ast_test_flag(srcp, FLAG_NAT_ACTIVE)))
02144 nat_active = 1;
02145
02146 if (destpr->set_rtp_peer(c0, srcp, vsrcp, tsrcp, srccodec, nat_active))
02147 ast_log(LOG_WARNING, "Channel '%s' failed to setup early bridge to '%s'\n", c0->name, c1 ? c1->name : "<unspecified>");
02148 ast_channel_unlock(c0);
02149 if (c1)
02150 ast_channel_unlock(c1);
02151 ast_debug(1, "Setting early bridge SDP of '%s' with that of '%s'\n", c0->name, c1 ? c1->name : "<unspecified>");
02152 return 0;
02153 }
02154
02155 int ast_rtp_make_compatible(struct ast_channel *dest, struct ast_channel *src, int media)
02156 {
02157 struct ast_rtp *destp = NULL, *srcp = NULL;
02158 struct ast_rtp *vdestp = NULL, *vsrcp = NULL;
02159 struct ast_rtp *tdestp = NULL, *tsrcp = NULL;
02160 struct ast_rtp_protocol *destpr = NULL, *srcpr = NULL;
02161 enum ast_rtp_get_result audio_dest_res = AST_RTP_GET_FAILED, video_dest_res = AST_RTP_GET_FAILED, text_dest_res = AST_RTP_GET_FAILED;
02162 enum ast_rtp_get_result audio_src_res = AST_RTP_GET_FAILED, video_src_res = AST_RTP_GET_FAILED, text_src_res = AST_RTP_GET_FAILED;
02163 int srccodec, destcodec;
02164
02165
02166 ast_channel_lock(dest);
02167 while (ast_channel_trylock(src)) {
02168 ast_channel_unlock(dest);
02169 usleep(1);
02170 ast_channel_lock(dest);
02171 }
02172
02173
02174 if (!(destpr = get_proto(dest))) {
02175 ast_debug(1, "Channel '%s' has no RTP, not doing anything\n", dest->name);
02176 ast_channel_unlock(dest);
02177 ast_channel_unlock(src);
02178 return 0;
02179 }
02180 if (!(srcpr = get_proto(src))) {
02181 ast_debug(1, "Channel '%s' has no RTP, not doing anything\n", src->name);
02182 ast_channel_unlock(dest);
02183 ast_channel_unlock(src);
02184 return 0;
02185 }
02186
02187
02188 audio_dest_res = destpr->get_rtp_info(dest, &destp);
02189 video_dest_res = destpr->get_vrtp_info ? destpr->get_vrtp_info(dest, &vdestp) : AST_RTP_GET_FAILED;
02190 text_dest_res = destpr->get_trtp_info ? destpr->get_trtp_info(dest, &tdestp) : AST_RTP_GET_FAILED;
02191 audio_src_res = srcpr->get_rtp_info(src, &srcp);
02192 video_src_res = srcpr->get_vrtp_info ? srcpr->get_vrtp_info(src, &vsrcp) : AST_RTP_GET_FAILED;
02193 text_src_res = srcpr->get_trtp_info ? srcpr->get_trtp_info(src, &tsrcp) : AST_RTP_GET_FAILED;
02194
02195
02196 if (srcpr->get_codec)
02197 srccodec = srcpr->get_codec(src);
02198 else
02199 srccodec = 0;
02200 if (destpr->get_codec)
02201 destcodec = destpr->get_codec(dest);
02202 else
02203 destcodec = 0;
02204
02205
02206 if (audio_dest_res != AST_RTP_TRY_NATIVE || (video_dest_res != AST_RTP_GET_FAILED && video_dest_res != AST_RTP_TRY_NATIVE) || audio_src_res != AST_RTP_TRY_NATIVE || (video_src_res != AST_RTP_GET_FAILED && video_src_res != AST_RTP_TRY_NATIVE) || !(srccodec & destcodec)) {
02207
02208 ast_channel_unlock(dest);
02209 ast_channel_unlock(src);
02210 return 0;
02211 }
02212 ast_rtp_pt_copy(destp, srcp);
02213 if (vdestp && vsrcp)
02214 ast_rtp_pt_copy(vdestp, vsrcp);
02215 if (tdestp && tsrcp)
02216 ast_rtp_pt_copy(tdestp, tsrcp);
02217 if (media) {
02218
02219 if (destpr->set_rtp_peer(dest, srcp, vsrcp, tsrcp, srccodec, ast_test_flag(srcp, FLAG_NAT_ACTIVE)))
02220 ast_log(LOG_WARNING, "Channel '%s' failed to setup early bridge to '%s'\n", dest->name, src->name);
02221 }
02222 ast_channel_unlock(dest);
02223 ast_channel_unlock(src);
02224 ast_debug(1, "Seeded SDP of '%s' with that of '%s'\n", dest->name, src->name);
02225 return 1;
02226 }
02227
02228
02229
02230
02231
02232 void ast_rtp_set_m_type(struct ast_rtp* rtp, int pt)
02233 {
02234 if (pt < 0 || pt >= MAX_RTP_PT || static_RTP_PT[pt].code == 0)
02235 return;
02236
02237 rtp_bridge_lock(rtp);
02238 rtp->current_RTP_PT[pt] = static_RTP_PT[pt];
02239 rtp_bridge_unlock(rtp);
02240 }
02241
02242
02243
02244 void ast_rtp_unset_m_type(struct ast_rtp* rtp, int pt)
02245 {
02246 if (pt < 0 || pt >= MAX_RTP_PT)
02247 return;
02248
02249 rtp_bridge_lock(rtp);
02250 rtp->current_RTP_PT[pt].isAstFormat = 0;
02251 rtp->current_RTP_PT[pt].code = 0;
02252 rtp_bridge_unlock(rtp);
02253 }
02254
02255
02256
02257
02258
02259 int ast_rtp_set_rtpmap_type(struct ast_rtp *rtp, int pt,
02260 char *mimeType, char *mimeSubtype,
02261 enum ast_rtp_options options)
02262 {
02263 unsigned int i;
02264 int found = 0;
02265
02266 if (pt < 0 || pt >= MAX_RTP_PT)
02267 return -1;
02268
02269 rtp_bridge_lock(rtp);
02270
02271 for (i = 0; i < ARRAY_LEN(mimeTypes); ++i) {
02272 if (strcasecmp(mimeSubtype, mimeTypes[i].subtype) == 0 &&
02273 strcasecmp(mimeType, mimeTypes[i].type) == 0) {
02274 found = 1;
02275 rtp->current_RTP_PT[pt] = mimeTypes[i].payloadType;
02276 if ((mimeTypes[i].payloadType.code == AST_FORMAT_G726) &&
02277 mimeTypes[i].payloadType.isAstFormat &&
02278 (options & AST_RTP_OPT_G726_NONSTANDARD))
02279 rtp->current_RTP_PT[pt].code = AST_FORMAT_G726_AAL2;
02280 break;
02281 }
02282 }
02283
02284 rtp_bridge_unlock(rtp);
02285
02286 return (found ? 0 : -1);
02287 }
02288
02289
02290
02291 void ast_rtp_get_current_formats(struct ast_rtp* rtp,
02292 int* astFormats, int* nonAstFormats)
02293 {
02294 int pt;
02295
02296 rtp_bridge_lock(rtp);
02297
02298 *astFormats = *nonAstFormats = 0;
02299 for (pt = 0; pt < MAX_RTP_PT; ++pt) {
02300 if (rtp->current_RTP_PT[pt].isAstFormat) {
02301 *astFormats |= rtp->current_RTP_PT[pt].code;
02302 } else {
02303 *nonAstFormats |= rtp->current_RTP_PT[pt].code;
02304 }
02305 }
02306
02307 rtp_bridge_unlock(rtp);
02308 }
02309
02310 struct rtpPayloadType ast_rtp_lookup_pt(struct ast_rtp* rtp, int pt)
02311 {
02312 struct rtpPayloadType result;
02313
02314 result.isAstFormat = result.code = 0;
02315
02316 if (pt < 0 || pt >= MAX_RTP_PT)
02317 return result;
02318
02319
02320 rtp_bridge_lock(rtp);
02321 result = rtp->current_RTP_PT[pt];
02322 rtp_bridge_unlock(rtp);
02323
02324
02325 if (!result.code)
02326 result = static_RTP_PT[pt];
02327
02328 return result;
02329 }
02330
02331
02332 int ast_rtp_lookup_code(struct ast_rtp* rtp, const int isAstFormat, const int code)
02333 {
02334 int pt = 0;
02335
02336 rtp_bridge_lock(rtp);
02337
02338 if (isAstFormat == rtp->rtp_lookup_code_cache_isAstFormat &&
02339 code == rtp->rtp_lookup_code_cache_code) {
02340
02341 pt = rtp->rtp_lookup_code_cache_result;
02342 rtp_bridge_unlock(rtp);
02343 return pt;
02344 }
02345
02346
02347 for (pt = 0; pt < MAX_RTP_PT; ++pt) {
02348 if (rtp->current_RTP_PT[pt].code == code && rtp->current_RTP_PT[pt].isAstFormat == isAstFormat) {
02349 rtp->rtp_lookup_code_cache_isAstFormat = isAstFormat;
02350 rtp->rtp_lookup_code_cache_code = code;
02351 rtp->rtp_lookup_code_cache_result = pt;
02352 rtp_bridge_unlock(rtp);
02353 return pt;
02354 }
02355 }
02356
02357
02358 for (pt = 0; pt < MAX_RTP_PT; ++pt) {
02359 if (static_RTP_PT[pt].code == code && static_RTP_PT[pt].isAstFormat == isAstFormat) {
02360 rtp->rtp_lookup_code_cache_isAstFormat = isAstFormat;
02361 rtp->rtp_lookup_code_cache_code = code;
02362 rtp->rtp_lookup_code_cache_result = pt;
02363 rtp_bridge_unlock(rtp);
02364 return pt;
02365 }
02366 }
02367
02368 rtp_bridge_unlock(rtp);
02369
02370 return -1;
02371 }
02372
02373 const char *ast_rtp_lookup_mime_subtype(const int isAstFormat, const int code,
02374 enum ast_rtp_options options)
02375 {
02376 unsigned int i;
02377
02378 for (i = 0; i < ARRAY_LEN(mimeTypes); ++i) {
02379 if ((mimeTypes[i].payloadType.code == code) && (mimeTypes[i].payloadType.isAstFormat == isAstFormat)) {
02380 if (isAstFormat &&
02381 (code == AST_FORMAT_G726_AAL2) &&
02382 (options & AST_RTP_OPT_G726_NONSTANDARD))
02383 return "G726-32";
02384 else
02385 return mimeTypes[i].subtype;
02386 }
02387 }
02388
02389 return "";
02390 }
02391
02392 char *ast_rtp_lookup_mime_multiple(char *buf, size_t size, const int capability,
02393 const int isAstFormat, enum ast_rtp_options options)
02394 {
02395 int format;
02396 unsigned len;
02397 char *end = buf;
02398 char *start = buf;
02399
02400 if (!buf || !size)
02401 return NULL;
02402
02403 snprintf(end, size, "0x%x (", capability);
02404
02405 len = strlen(end);
02406 end += len;
02407 size -= len;
02408 start = end;
02409
02410 for (format = 1; format < AST_RTP_MAX; format <<= 1) {
02411 if (capability & format) {
02412 const char *name = ast_rtp_lookup_mime_subtype(isAstFormat, format, options);
02413
02414 snprintf(end, size, "%s|", name);
02415 len = strlen(end);
02416 end += len;
02417 size -= len;
02418 }
02419 }
02420
02421 if (start == end)
02422 ast_copy_string(start, "nothing)", size);
02423 else if (size > 1)
02424 *(end -1) = ')';
02425
02426 return buf;
02427 }
02428
02429
02430
02431
02432 static int rtp_socket(const char *type)
02433 {
02434 int s = socket(AF_INET, SOCK_DGRAM, 0);
02435 if (s < 0) {
02436 if (type == NULL)
02437 type = "RTP/RTCP";
02438 ast_log(LOG_WARNING, "Unable to allocate %s socket: %s\n", type, strerror(errno));
02439 } else {
02440 long flags = fcntl(s, F_GETFL);
02441 fcntl(s, F_SETFL, flags | O_NONBLOCK);
02442 #ifdef SO_NO_CHECK
02443 if (nochecksums)
02444 setsockopt(s, SOL_SOCKET, SO_NO_CHECK, &nochecksums, sizeof(nochecksums));
02445 #endif
02446 }
02447 return s;
02448 }
02449
02450
02451
02452
02453
02454
02455 static struct ast_rtcp *ast_rtcp_new(void)
02456 {
02457 struct ast_rtcp *rtcp;
02458
02459 if (!(rtcp = ast_calloc(1, sizeof(*rtcp))))
02460 return NULL;
02461 rtcp->s = rtp_socket("RTCP");
02462 rtcp->us.sin_family = AF_INET;
02463 rtcp->them.sin_family = AF_INET;
02464 rtcp->schedid = -1;
02465
02466 if (rtcp->s < 0) {
02467 ast_free(rtcp);
02468 return NULL;
02469 }
02470
02471 return rtcp;
02472 }
02473
02474
02475
02476
02477
02478 void ast_rtp_new_init(struct ast_rtp *rtp)
02479 {
02480 #ifdef P2P_INTENSE
02481 ast_mutex_init(&rtp->bridge_lock);
02482 #endif
02483
02484 rtp->them.sin_family = AF_INET;
02485 rtp->us.sin_family = AF_INET;
02486 rtp->ssrc = ast_random();
02487 rtp->seqno = ast_random() & 0xffff;
02488 ast_set_flag(rtp, FLAG_HAS_DTMF);
02489 rtp->strict_rtp_state = (strictrtp ? STRICT_RTP_LEARN : STRICT_RTP_OPEN);
02490 }
02491
02492 struct ast_rtp *ast_rtp_new_with_bindaddr(struct sched_context *sched, struct io_context *io, int rtcpenable, int callbackmode, struct in_addr addr)
02493 {
02494 struct ast_rtp *rtp;
02495 int x;
02496 int startplace;
02497
02498 if (!(rtp = ast_calloc(1, sizeof(*rtp))))
02499 return NULL;
02500
02501 ast_rtp_new_init(rtp);
02502
02503 rtp->s = rtp_socket("RTP");
02504 if (rtp->s < 0)
02505 goto fail;
02506 if (sched && rtcpenable) {
02507 rtp->sched = sched;
02508 rtp->rtcp = ast_rtcp_new();
02509 }
02510
02511
02512
02513
02514
02515
02516
02517
02518
02519 x = (rtpend == rtpstart) ? rtpstart : (ast_random() % (rtpend - rtpstart)) + rtpstart;
02520 x = x & ~1;
02521 startplace = x;
02522
02523 rtp->us.sin_addr = addr;
02524 if (rtp->rtcp)
02525 rtp->rtcp->us.sin_addr = addr;
02526 for (;;) {
02527 rtp->us.sin_port = htons(x);
02528 if (!bind(rtp->s, (struct sockaddr *)&rtp->us, sizeof(rtp->us))) {
02529
02530 if (!rtp->rtcp)
02531 break;
02532
02533 rtp->rtcp->us.sin_port = htons(x + 1);
02534 if (!bind(rtp->rtcp->s, (struct sockaddr *)&rtp->rtcp->us, sizeof(rtp->rtcp->us)))
02535 break;
02536
02537
02538
02539
02540 close(rtp->s);
02541 rtp->s = rtp_socket("RTP");
02542 if (rtp->s < 0)
02543 goto fail;
02544 }
02545
02546
02547
02548
02549 if (errno != EADDRINUSE) {
02550
02551 ast_log(LOG_ERROR, "Unexpected bind error: %s\n", strerror(errno));
02552 goto fail;
02553 }
02554
02555
02556
02557
02558
02559 x += 2;
02560 if (x > rtpend)
02561 x = (rtpstart + 1) & ~1;
02562 if (x == startplace) {
02563 ast_log(LOG_ERROR, "No RTP ports remaining. Can't setup media stream for this call.\n");
02564 goto fail;
02565 }
02566 }
02567 rtp->sched = sched;
02568 rtp->io = io;
02569 if (callbackmode) {
02570 rtp->ioid = ast_io_add(rtp->io, rtp->s, rtpread, AST_IO_IN, rtp);
02571 ast_set_flag(rtp, FLAG_CALLBACK_MODE);
02572 }
02573 ast_rtp_pt_default(rtp);
02574 return rtp;
02575
02576 fail:
02577 if (rtp->s >= 0)
02578 close(rtp->s);
02579 if (rtp->rtcp) {
02580 close(rtp->rtcp->s);
02581 ast_free(rtp->rtcp);
02582 }
02583 ast_free(rtp);
02584 return NULL;
02585 }
02586
02587 struct ast_rtp *ast_rtp_new(struct sched_context *sched, struct io_context *io, int rtcpenable, int callbackmode)
02588 {
02589 struct in_addr ia;
02590
02591 memset(&ia, 0, sizeof(ia));
02592 return ast_rtp_new_with_bindaddr(sched, io, rtcpenable, callbackmode, ia);
02593 }
02594
02595 int ast_rtp_setqos(struct ast_rtp *rtp, int type_of_service, int class_of_service, char *desc)
02596 {
02597 return ast_netsock_set_qos(rtp->s, type_of_service, class_of_service, desc);
02598 }
02599
02600 void ast_rtp_set_constantssrc(struct ast_rtp *rtp)
02601 {
02602 rtp->constantssrc = 1;
02603 }
02604
02605 void ast_rtp_new_source(struct ast_rtp *rtp)
02606 {
02607 if (rtp) {
02608 rtp->set_marker_bit = 1;
02609 if (!rtp->constantssrc) {
02610 rtp->ssrc = ast_random();
02611 }
02612 }
02613 }
02614
02615 void ast_rtp_set_peer(struct ast_rtp *rtp, struct sockaddr_in *them)
02616 {
02617 rtp->them.sin_port = them->sin_port;
02618 rtp->them.sin_addr = them->sin_addr;
02619 if (rtp->rtcp) {
02620 int h = ntohs(them->sin_port);
02621 rtp->rtcp->them.sin_port = htons(h + 1);
02622 rtp->rtcp->them.sin_addr = them->sin_addr;
02623 }
02624 rtp->rxseqno = 0;
02625
02626 if (strictrtp)
02627 rtp->strict_rtp_state = STRICT_RTP_LEARN;
02628 }
02629
02630 void ast_rtp_set_alt_peer(struct ast_rtp *rtp, struct sockaddr_in *alt)
02631 {
02632 rtp->altthem.sin_port = alt->sin_port;
02633 rtp->altthem.sin_addr = alt->sin_addr;
02634 if (rtp->rtcp) {
02635 rtp->rtcp->altthem.sin_port = htons(ntohs(alt->sin_port) + 1);
02636 rtp->rtcp->altthem.sin_addr = alt->sin_addr;
02637 }
02638 }
02639
02640 int ast_rtp_get_peer(struct ast_rtp *rtp, struct sockaddr_in *them)
02641 {
02642 if ((them->sin_family != AF_INET) ||
02643 (them->sin_port != rtp->them.sin_port) ||
02644 (them->sin_addr.s_addr != rtp->them.sin_addr.s_addr)) {
02645 them->sin_family = AF_INET;
02646 them->sin_port = rtp->them.sin_port;
02647 them->sin_addr = rtp->them.sin_addr;
02648 return 1;
02649 }
02650 return 0;
02651 }
02652
02653 void ast_rtp_get_us(struct ast_rtp *rtp, struct sockaddr_in *us)
02654 {
02655 *us = rtp->us;
02656 }
02657
02658 struct ast_rtp *ast_rtp_get_bridged(struct ast_rtp *rtp)
02659 {
02660 struct ast_rtp *bridged = NULL;
02661
02662 rtp_bridge_lock(rtp);
02663 bridged = rtp->bridged;
02664 rtp_bridge_unlock(rtp);
02665
02666 return bridged;
02667 }
02668
02669 void ast_rtp_stop(struct ast_rtp *rtp)
02670 {
02671 if (rtp->rtcp) {
02672 AST_SCHED_DEL(rtp->sched, rtp->rtcp->schedid);
02673 }
02674 if (rtp->red) {
02675 AST_SCHED_DEL(rtp->sched, rtp->red->schedid);
02676 free(rtp->red);
02677 rtp->red = NULL;
02678 }
02679
02680 memset(&rtp->them.sin_addr, 0, sizeof(rtp->them.sin_addr));
02681 memset(&rtp->them.sin_port, 0, sizeof(rtp->them.sin_port));
02682 if (rtp->rtcp) {
02683 memset(&rtp->rtcp->them.sin_addr, 0, sizeof(rtp->rtcp->them.sin_addr));
02684 memset(&rtp->rtcp->them.sin_port, 0, sizeof(rtp->rtcp->them.sin_port));
02685 }
02686
02687 ast_clear_flag(rtp, FLAG_P2P_SENT_MARK);
02688 }
02689
02690 void ast_rtp_reset(struct ast_rtp *rtp)
02691 {
02692 memset(&rtp->rxcore, 0, sizeof(rtp->rxcore));
02693 memset(&rtp->txcore, 0, sizeof(rtp->txcore));
02694 memset(&rtp->dtmfmute, 0, sizeof(rtp->dtmfmute));
02695 rtp->lastts = 0;
02696 rtp->lastdigitts = 0;
02697 rtp->lastrxts = 0;
02698 rtp->lastividtimestamp = 0;
02699 rtp->lastovidtimestamp = 0;
02700 rtp->lastitexttimestamp = 0;
02701 rtp->lastotexttimestamp = 0;
02702 rtp->lasteventseqn = 0;
02703 rtp->lastevent = 0;
02704 rtp->lasttxformat = 0;
02705 rtp->lastrxformat = 0;
02706 rtp->dtmf_timeout = 0;
02707 rtp->dtmfsamples = 0;
02708 rtp->seqno = 0;
02709 rtp->rxseqno = 0;
02710 }
02711
02712
02713 unsigned int ast_rtp_get_qosvalue(struct ast_rtp *rtp, enum ast_rtp_qos_vars value)
02714 {
02715 if (rtp == NULL) {
02716 if (option_debug > 1)
02717 ast_log(LOG_DEBUG, "NO RTP Structure? Kidding me? \n");
02718 return 0;
02719 }
02720 if (option_debug > 1 && rtp->rtcp == NULL) {
02721 ast_log(LOG_DEBUG, "NO RTCP structure. Maybe in RTP p2p bridging mode? \n");
02722 }
02723
02724 switch (value) {
02725 case AST_RTP_TXCOUNT:
02726 return (unsigned int) rtp->txcount;
02727 case AST_RTP_RXCOUNT:
02728 return (unsigned int) rtp->rxcount;
02729 case AST_RTP_TXJITTER:
02730 return (unsigned int) (rtp->rxjitter * 100.0);
02731 case AST_RTP_RXJITTER:
02732 return (unsigned int) (rtp->rtcp ? (rtp->rtcp->reported_jitter / (unsigned int) 65536.0) : 0);
02733 case AST_RTP_RXPLOSS:
02734 return rtp->rtcp ? (rtp->rtcp->expected_prior - rtp->rtcp->received_prior) : 0;
02735 case AST_RTP_TXPLOSS:
02736 return rtp->rtcp ? rtp->rtcp->reported_lost : 0;
02737 case AST_RTP_RTT:
02738 return (unsigned int) (rtp->rtcp ? (rtp->rtcp->rtt * 100) : 0);
02739 }
02740 return 0;
02741 }
02742
02743 static double __ast_rtp_get_qos(struct ast_rtp *rtp, const char *qos, int *found)
02744 {
02745 *found = 1;
02746
02747 if (!strcasecmp(qos, "remote_maxjitter"))
02748 return rtp->rtcp->reported_maxjitter * 1000.0;
02749 if (!strcasecmp(qos, "remote_minjitter"))
02750 return rtp->rtcp->reported_minjitter * 1000.0;
02751 if (!strcasecmp(qos, "remote_normdevjitter"))
02752 return rtp->rtcp->reported_normdev_jitter * 1000.0;
02753 if (!strcasecmp(qos, "remote_stdevjitter"))
02754 return sqrt(rtp->rtcp->reported_stdev_jitter) * 1000.0;
02755
02756 if (!strcasecmp(qos, "local_maxjitter"))
02757 return rtp->rtcp->maxrxjitter * 1000.0;
02758 if (!strcasecmp(qos, "local_minjitter"))
02759 return rtp->rtcp->minrxjitter * 1000.0;
02760 if (!strcasecmp(qos, "local_normdevjitter"))
02761 return rtp->rtcp->normdev_rxjitter * 1000.0;
02762 if (!strcasecmp(qos, "local_stdevjitter"))
02763 return sqrt(rtp->rtcp->stdev_rxjitter) * 1000.0;
02764
02765 if (!strcasecmp(qos, "maxrtt"))
02766 return rtp->rtcp->maxrtt * 1000.0;
02767 if (!strcasecmp(qos, "minrtt"))
02768 return rtp->rtcp->minrtt * 1000.0;
02769 if (!strcasecmp(qos, "normdevrtt"))
02770 return rtp->rtcp->normdevrtt * 1000.0;
02771 if (!strcasecmp(qos, "stdevrtt"))
02772 return sqrt(rtp->rtcp->stdevrtt) * 1000.0;
02773
02774 *found = 0;
02775
02776 return 0.0;
02777 }
02778
02779 int ast_rtp_get_qos(struct ast_rtp *rtp, const char *qos, char *buf, unsigned int buflen)
02780 {
02781 double value;
02782 int found;
02783
02784 value = __ast_rtp_get_qos(rtp, qos, &found);
02785
02786 if (!found)
02787 return -1;
02788
02789 snprintf(buf, buflen, "%.0lf", value);
02790
02791 return 0;
02792 }
02793
02794 void ast_rtp_set_vars(struct ast_channel *chan, struct ast_rtp *rtp) {
02795 char *audioqos;
02796 char *audioqos_jitter;
02797 char *audioqos_loss;
02798 char *audioqos_rtt;
02799 struct ast_channel *bridge;
02800
02801 if (!rtp || !chan)
02802 return;
02803
02804 bridge = ast_bridged_channel(chan);
02805
02806 audioqos = ast_rtp_get_quality(rtp, NULL, RTPQOS_SUMMARY);
02807 audioqos_jitter = ast_rtp_get_quality(rtp, NULL, RTPQOS_JITTER);
02808 audioqos_loss = ast_rtp_get_quality(rtp, NULL, RTPQOS_LOSS);
02809 audioqos_rtt = ast_rtp_get_quality(rtp, NULL, RTPQOS_RTT);
02810
02811 pbx_builtin_setvar_helper(chan, "RTPAUDIOQOS", audioqos);
02812 pbx_builtin_setvar_helper(chan, "RTPAUDIOQOSJITTER", audioqos_jitter);
02813 pbx_builtin_setvar_helper(chan, "RTPAUDIOQOSLOSS", audioqos_loss);
02814 pbx_builtin_setvar_helper(chan, "RTPAUDIOQOSRTT", audioqos_rtt);
02815
02816 if (!bridge)
02817 return;
02818
02819 pbx_builtin_setvar_helper(bridge, "RTPAUDIOQOSBRIDGED", audioqos);
02820 pbx_builtin_setvar_helper(bridge, "RTPAUDIOQOSJITTERBRIDGED", audioqos_jitter);
02821 pbx_builtin_setvar_helper(bridge, "RTPAUDIOQOSLOSSBRIDGED", audioqos_loss);
02822 pbx_builtin_setvar_helper(bridge, "RTPAUDIOQOSRTTBRIDGED", audioqos_rtt);
02823 }
02824
02825 static char *__ast_rtp_get_quality_jitter(struct ast_rtp *rtp)
02826 {
02827
02828
02829
02830
02831
02832
02833
02834
02835
02836
02837
02838 #define RTCP_JITTER_FORMAT1 \
02839 "minrxjitter=%f;" \
02840 "maxrxjitter=%f;" \
02841 "avgrxjitter=%f;" \
02842 "stdevrxjitter=%f;" \
02843 "reported_minjitter=%f;" \
02844 "reported_maxjitter=%f;" \
02845 "reported_avgjitter=%f;" \
02846 "reported_stdevjitter=%f;"
02847
02848 #define RTCP_JITTER_FORMAT2 \
02849 "rxjitter=%f;"
02850
02851 if (rtp->rtcp && rtp->rtcp->rtcp_info) {
02852 snprintf(rtp->rtcp->quality_jitter, sizeof(rtp->rtcp->quality_jitter), RTCP_JITTER_FORMAT1,
02853 rtp->rtcp->minrxjitter,
02854 rtp->rtcp->maxrxjitter,
02855 rtp->rtcp->normdev_rxjitter,
02856 sqrt(rtp->rtcp->stdev_rxjitter),
02857 rtp->rtcp->reported_minjitter,
02858 rtp->rtcp->reported_maxjitter,
02859 rtp->rtcp->reported_normdev_jitter,
02860 sqrt(rtp->rtcp->reported_stdev_jitter)
02861 );
02862 } else {
02863 snprintf(rtp->rtcp->quality_jitter, sizeof(rtp->rtcp->quality_jitter), RTCP_JITTER_FORMAT2,
02864 rtp->rxjitter
02865 );
02866 }
02867
02868 return rtp->rtcp->quality_jitter;
02869
02870 #undef RTCP_JITTER_FORMAT1
02871 #undef RTCP_JITTER_FORMAT2
02872 }
02873
02874 static char *__ast_rtp_get_quality_loss(struct ast_rtp *rtp)
02875 {
02876 unsigned int lost;
02877 unsigned int extended;
02878 unsigned int expected;
02879 int fraction;
02880
02881 #define RTCP_LOSS_FORMAT1 \
02882 "minrxlost=%f;" \
02883 "maxrxlost=%f;" \
02884 "avgrxlostr=%f;" \
02885 "stdevrxlost=%f;" \
02886 "reported_minlost=%f;" \
02887 "reported_maxlost=%f;" \
02888 "reported_avglost=%f;" \
02889 "reported_stdevlost=%f;"
02890
02891 #define RTCP_LOSS_FORMAT2 \
02892 "lost=%d;" \
02893 "expected=%d;"
02894
02895 if (rtp->rtcp && rtp->rtcp->rtcp_info && rtp->rtcp->maxrxlost > 0) {
02896 snprintf(rtp->rtcp->quality_loss, sizeof(rtp->rtcp->quality_loss), RTCP_LOSS_FORMAT1,
02897 rtp->rtcp->minrxlost,
02898 rtp->rtcp->maxrxlost,
02899 rtp->rtcp->normdev_rxlost,
02900 sqrt(rtp->rtcp->stdev_rxlost),
02901 rtp->rtcp->reported_minlost,
02902 rtp->rtcp->reported_maxlost,
02903 rtp->rtcp->reported_normdev_lost,
02904 sqrt(rtp->rtcp->reported_stdev_lost)
02905 );
02906 } else {
02907 extended = rtp->cycles + rtp->lastrxseqno;
02908 expected = extended - rtp->seedrxseqno + 1;
02909 if (rtp->rxcount > expected)
02910 expected += rtp->rxcount - expected;
02911 lost = expected - rtp->rxcount;
02912
02913 if (!expected || lost <= 0)
02914 fraction = 0;
02915 else
02916 fraction = (lost << 8) / expected;
02917
02918 snprintf(rtp->rtcp->quality_loss, sizeof(rtp->rtcp->quality_loss), RTCP_LOSS_FORMAT2,
02919 lost,
02920 expected
02921 );
02922 }
02923
02924 return rtp->rtcp->quality_loss;
02925
02926 #undef RTCP_LOSS_FORMAT1
02927 #undef RTCP_LOSS_FORMAT2
02928 }
02929
02930 static char *__ast_rtp_get_quality_rtt(struct ast_rtp *rtp)
02931 {
02932 if (rtp->rtcp && rtp->rtcp->rtcp_info) {
02933 snprintf(rtp->rtcp->quality_rtt, sizeof(rtp->rtcp->quality_rtt), "minrtt=%f;maxrtt=%f;avgrtt=%f;stdevrtt=%f;",
02934 rtp->rtcp->minrtt,
02935 rtp->rtcp->maxrtt,
02936 rtp->rtcp->normdevrtt,
02937 sqrt(rtp->rtcp->stdevrtt)
02938 );
02939 } else {
02940 snprintf(rtp->rtcp->quality_rtt, sizeof(rtp->rtcp->quality_rtt), "Not available");
02941 }
02942
02943 return rtp->rtcp->quality_rtt;
02944 }
02945
02946 static char *__ast_rtp_get_quality(struct ast_rtp *rtp)
02947 {
02948
02949
02950
02951
02952
02953
02954
02955
02956
02957
02958
02959
02960 if (rtp->rtcp && rtp->rtcp->rtcp_info) {
02961 snprintf(rtp->rtcp->quality, sizeof(rtp->rtcp->quality),
02962 "ssrc=%u;themssrc=%u;lp=%u;rxjitter=%f;rxcount=%u;txjitter=%f;txcount=%u;rlp=%u;rtt=%f",
02963 rtp->ssrc,
02964 rtp->themssrc,
02965 rtp->rtcp->expected_prior - rtp->rtcp->received_prior,
02966 rtp->rxjitter,
02967 rtp->rxcount,
02968 (double)rtp->rtcp->reported_jitter / 65536.0,
02969 rtp->txcount,
02970 rtp->rtcp->reported_lost,
02971 rtp->rtcp->rtt
02972 );
02973 } else {
02974 snprintf(rtp->rtcp->quality, sizeof(rtp->rtcp->quality), "ssrc=%u;themssrc=%u;rxjitter=%f;rxcount=%u;txcount=%u;",
02975 rtp->ssrc,
02976 rtp->themssrc,
02977 rtp->rxjitter,
02978 rtp->rxcount,
02979 rtp->txcount
02980 );
02981 }
02982
02983 return rtp->rtcp->quality;
02984 }
02985
02986 char *ast_rtp_get_quality(struct ast_rtp *rtp, struct ast_rtp_quality *qual, enum ast_rtp_quality_type qtype)
02987 {
02988 if (qual && rtp) {
02989 qual->local_ssrc = rtp->ssrc;
02990 qual->local_jitter = rtp->rxjitter;
02991 qual->local_count = rtp->rxcount;
02992 qual->remote_ssrc = rtp->themssrc;
02993 qual->remote_count = rtp->txcount;
02994
02995 if (rtp->rtcp) {
02996 qual->local_lostpackets = rtp->rtcp->expected_prior - rtp->rtcp->received_prior;
02997 qual->remote_lostpackets = rtp->rtcp->reported_lost;
02998 qual->remote_jitter = rtp->rtcp->reported_jitter / 65536.0;
02999 qual->rtt = rtp->rtcp->rtt;
03000 }
03001 }
03002
03003 switch (qtype) {
03004 case RTPQOS_SUMMARY:
03005 return __ast_rtp_get_quality(rtp);
03006 case RTPQOS_JITTER:
03007 return __ast_rtp_get_quality_jitter(rtp);
03008 case RTPQOS_LOSS:
03009 return __ast_rtp_get_quality_loss(rtp);
03010 case RTPQOS_RTT:
03011 return __ast_rtp_get_quality_rtt(rtp);
03012 }
03013
03014 return NULL;
03015 }
03016
03017 void ast_rtp_destroy(struct ast_rtp *rtp)
03018 {
03019 if (rtcp_debug_test_addr(&rtp->them) || rtcpstats) {
03020
03021 ast_verbose(" RTP-stats\n");
03022 ast_verbose("* Our Receiver:\n");
03023 ast_verbose(" SSRC: %u\n", rtp->themssrc);
03024 ast_verbose(" Received packets: %u\n", rtp->rxcount);
03025 ast_verbose(" Lost packets: %u\n", rtp->rtcp ? (rtp->rtcp->expected_prior - rtp->rtcp->received_prior) : 0);
03026 ast_verbose(" Jitter: %.4f\n", rtp->rxjitter);
03027 ast_verbose(" Transit: %.4f\n", rtp->rxtransit);
03028 ast_verbose(" RR-count: %u\n", rtp->rtcp ? rtp->rtcp->rr_count : 0);
03029 ast_verbose("* Our Sender:\n");
03030 ast_verbose(" SSRC: %u\n", rtp->ssrc);
03031 ast_verbose(" Sent packets: %u\n", rtp->txcount);
03032 ast_verbose(" Lost packets: %u\n", rtp->rtcp ? rtp->rtcp->reported_lost : 0);
03033 ast_verbose(" Jitter: %u\n", rtp->rtcp ? (rtp->rtcp->reported_jitter / (unsigned int)65536.0) : 0);
03034 ast_verbose(" SR-count: %u\n", rtp->rtcp ? rtp->rtcp->sr_count : 0);
03035 ast_verbose(" RTT: %f\n", rtp->rtcp ? rtp->rtcp->rtt : 0);
03036 }
03037
03038 manager_event(EVENT_FLAG_REPORTING, "RTPReceiverStat", "SSRC: %u\r\n"
03039 "ReceivedPackets: %u\r\n"
03040 "LostPackets: %u\r\n"
03041 "Jitter: %.4f\r\n"
03042 "Transit: %.4f\r\n"
03043 "RRCount: %u\r\n",
03044 rtp->themssrc,
03045 rtp->rxcount,
03046 rtp->rtcp ? (rtp->rtcp->expected_prior - rtp->rtcp->received_prior) : 0,
03047 rtp->rxjitter,
03048 rtp->rxtransit,
03049 rtp->rtcp ? rtp->rtcp->rr_count : 0);
03050 manager_event(EVENT_FLAG_REPORTING, "RTPSenderStat", "SSRC: %u\r\n"
03051 "SentPackets: %u\r\n"
03052 "LostPackets: %u\r\n"
03053 "Jitter: %u\r\n"
03054 "SRCount: %u\r\n"
03055 "RTT: %f\r\n",
03056 rtp->ssrc,
03057 rtp->txcount,
03058 rtp->rtcp ? rtp->rtcp->reported_lost : 0,
03059 rtp->rtcp ? rtp->rtcp->reported_jitter : 0,
03060 rtp->rtcp ? rtp->rtcp->sr_count : 0,
03061 rtp->rtcp ? rtp->rtcp->rtt : 0);
03062 if (rtp->smoother)
03063 ast_smoother_free(rtp->smoother);
03064 if (rtp->ioid)
03065 ast_io_remove(rtp->io, rtp->ioid);
03066 if (rtp->s > -1)
03067 close(rtp->s);
03068 if (rtp->rtcp) {
03069 AST_SCHED_DEL(rtp->sched, rtp->rtcp->schedid);
03070 close(rtp->rtcp->s);
03071 ast_free(rtp->rtcp);
03072 rtp->rtcp=NULL;
03073 }
03074 #ifdef P2P_INTENSE
03075 ast_mutex_destroy(&rtp->bridge_lock);
03076 #endif
03077 ast_free(rtp);
03078 }
03079
03080 static unsigned int calc_txstamp(struct ast_rtp *rtp, struct timeval *delivery)
03081 {
03082 struct timeval t;
03083 long ms;
03084 if (ast_tvzero(rtp->txcore)) {
03085 rtp->txcore = ast_tvnow();
03086
03087 rtp->txcore.tv_usec -= rtp->txcore.tv_usec % 20000;
03088 }
03089
03090 t = (delivery && !ast_tvzero(*delivery)) ? *delivery : ast_tvnow();
03091 ms = ast_tvdiff_ms(t, rtp->txcore);
03092 if (ms < 0)
03093 ms = 0;
03094
03095 rtp->txcore = t;
03096 return (unsigned int) ms;
03097 }
03098
03099
03100 int ast_rtp_senddigit_begin(struct ast_rtp *rtp, char digit)
03101 {
03102 unsigned int *rtpheader;
03103 int hdrlen = 12, res = 0, i = 0, payload = 0;
03104 char data[256];
03105
03106 if ((digit <= '9') && (digit >= '0'))
03107 digit -= '0';
03108 else if (digit == '*')
03109 digit = 10;
03110 else if (digit == '#')
03111 digit = 11;
03112 else if ((digit >= 'A') && (digit <= 'D'))
03113 digit = digit - 'A' + 12;
03114 else if ((digit >= 'a') && (digit <= 'd'))
03115 digit = digit - 'a' + 12;
03116 else {
03117 ast_log(LOG_WARNING, "Don't know how to represent '%c'\n", digit);
03118 return 0;
03119 }
03120
03121
03122 if (!rtp->them.sin_addr.s_addr || !rtp->them.sin_port)
03123 return 0;
03124
03125 payload = ast_rtp_lookup_code(rtp, 0, AST_RTP_DTMF);
03126
03127 rtp->dtmfmute = ast_tvadd(ast_tvnow(), ast_tv(0, 500000));
03128 rtp->send_duration = 160;
03129 rtp->lastdigitts = rtp->lastts + rtp->send_duration;
03130
03131
03132 rtpheader = (unsigned int *)data;
03133 rtpheader[0] = htonl((2 << 30) | (1 << 23) | (payload << 16) | (rtp->seqno));
03134 rtpheader[1] = htonl(rtp->lastdigitts);
03135 rtpheader[2] = htonl(rtp->ssrc);
03136
03137 for (i = 0; i < 2; i++) {
03138 rtpheader[3] = htonl((digit << 24) | (0xa << 16) | (rtp->send_duration));
03139 res = sendto(rtp->s, (void *) rtpheader, hdrlen + 4, 0, (struct sockaddr *) &rtp->them, sizeof(rtp->them));
03140 if (res < 0)
03141 ast_log(LOG_ERROR, "RTP Transmission error to %s:%u: %s\n",
03142 ast_inet_ntoa(rtp->them.sin_addr),
03143 ntohs(rtp->them.sin_port), strerror(errno));
03144 if (rtp_debug_test_addr(&rtp->them))
03145 ast_verbose("Sent RTP DTMF packet to %s:%u (type %-2.2d, seq %-6.6u, ts %-6.6u, len %-6.6u)\n",
03146 ast_inet_ntoa(rtp->them.sin_addr),
03147 ntohs(rtp->them.sin_port), payload, rtp->seqno, rtp->lastdigitts, res - hdrlen);
03148
03149 rtp->seqno++;
03150
03151 rtp->send_duration += 160;
03152
03153 rtpheader[0] = htonl((2 << 30) | (payload << 16) | (rtp->seqno));
03154 }
03155
03156
03157 rtp->sending_digit = 1;
03158 rtp->send_digit = digit;
03159 rtp->send_payload = payload;
03160
03161 return 0;
03162 }
03163
03164
03165 static int ast_rtp_senddigit_continuation(struct ast_rtp *rtp)
03166 {
03167 unsigned int *rtpheader;
03168 int hdrlen = 12, res = 0;
03169 char data[256];
03170
03171 if (!rtp->them.sin_addr.s_addr || !rtp->them.sin_port)
03172 return 0;
03173
03174
03175 rtpheader = (unsigned int *)data;
03176 rtpheader[0] = htonl((2 << 30) | (1 << 23) | (rtp->send_payload << 16) | (rtp->seqno));
03177 rtpheader[1] = htonl(rtp->lastdigitts);
03178 rtpheader[2] = htonl(rtp->ssrc);
03179 rtpheader[3] = htonl((rtp->send_digit << 24) | (0xa << 16) | (rtp->send_duration));
03180 rtpheader[0] = htonl((2 << 30) | (rtp->send_payload << 16) | (rtp->seqno));
03181
03182
03183 res = sendto(rtp->s, (void *) rtpheader, hdrlen + 4, 0, (struct sockaddr *) &rtp->them, sizeof(rtp->them));
03184 if (res < 0)
03185 ast_log(LOG_ERROR, "RTP Transmission error to %s:%d: %s\n",
03186 ast_inet_ntoa(rtp->them.sin_addr),
03187 ntohs(rtp->them.sin_port), strerror(errno));
03188 if (rtp_debug_test_addr(&rtp->them))
03189 ast_verbose("Sent RTP DTMF packet to %s:%u (type %-2.2d, seq %-6.6u, ts %-6.6u, len %-6.6u)\n",
03190 ast_inet_ntoa(rtp->them.sin_addr),
03191 ntohs(rtp->them.sin_port), rtp->send_payload, rtp->seqno, rtp->lastdigitts, res - hdrlen);
03192
03193
03194 rtp->seqno++;
03195
03196 rtp->send_duration += 160;
03197
03198 return 0;
03199 }
03200
03201
03202 int ast_rtp_senddigit_end(struct ast_rtp *rtp, char digit)
03203 {
03204 unsigned int *rtpheader;
03205 int hdrlen = 12, res = 0, i = 0;
03206 char data[256];
03207
03208
03209 if (!rtp->them.sin_addr.s_addr || !rtp->them.sin_port)
03210 return 0;
03211
03212 if ((digit <= '9') && (digit >= '0'))
03213 digit -= '0';
03214 else if (digit == '*')
03215 digit = 10;
03216 else if (digit == '#')
03217 digit = 11;
03218 else if ((digit >= 'A') && (digit <= 'D'))
03219 digit = digit - 'A' + 12;
03220 else if ((digit >= 'a') && (digit <= 'd'))
03221 digit = digit - 'a' + 12;
03222 else {
03223 ast_log(LOG_WARNING, "Don't know how to represent '%c'\n", digit);
03224 return 0;
03225 }
03226
03227 rtp->dtmfmute = ast_tvadd(ast_tvnow(), ast_tv(0, 500000));
03228
03229 rtpheader = (unsigned int *)data;
03230 rtpheader[1] = htonl(rtp->lastdigitts);
03231 rtpheader[2] = htonl(rtp->ssrc);
03232 rtpheader[3] = htonl((digit << 24) | (0xa << 16) | (rtp->send_duration));
03233
03234 rtpheader[3] |= htonl((1 << 23));
03235
03236
03237 for (i = 0; i < 3; i++) {
03238 rtpheader[0] = htonl((2 << 30) | (rtp->send_payload << 16) | (rtp->seqno));
03239 res = sendto(rtp->s, (void *) rtpheader, hdrlen + 4, 0, (struct sockaddr *) &rtp->them, sizeof(rtp->them));
03240 rtp->seqno++;
03241 if (res < 0)
03242 ast_log(LOG_ERROR, "RTP Transmission error to %s:%d: %s\n",
03243 ast_inet_ntoa(rtp->them.sin_addr),
03244 ntohs(rtp->them.sin_port), strerror(errno));
03245 if (rtp_debug_test_addr(&rtp->them))
03246 ast_verbose("Sent RTP DTMF packet to %s:%u (type %-2.2d, seq %-6.6u, ts %-6.6u, len %-6.6u)\n",
03247 ast_inet_ntoa(rtp->them.sin_addr),
03248 ntohs(rtp->them.sin_port), rtp->send_payload, rtp->seqno, rtp->lastdigitts, res - hdrlen);
03249 }
03250 rtp->lastts += rtp->send_duration;
03251 rtp->sending_digit = 0;
03252 rtp->send_digit = 0;
03253
03254 return res;
03255 }
03256
03257
03258 int ast_rtcp_send_h261fur(void *data)
03259 {
03260 struct ast_rtp *rtp = data;
03261 int res;
03262
03263 rtp->rtcp->sendfur = 1;
03264 res = ast_rtcp_write(data);
03265
03266 return res;
03267 }
03268
03269
03270 static int ast_rtcp_write_sr(const void *data)
03271 {
03272 struct ast_rtp *rtp = (struct ast_rtp *)data;
03273 int res;
03274 int len = 0;
03275 struct timeval now;
03276 unsigned int now_lsw;
03277 unsigned int now_msw;
03278 unsigned int *rtcpheader;
03279 unsigned int lost;
03280 unsigned int extended;
03281 unsigned int expected;
03282 unsigned int expected_interval;
03283 unsigned int received_interval;
03284 int lost_interval;
03285 int fraction;
03286 struct timeval dlsr;
03287 char bdata[512];
03288
03289
03290 if (!rtp || !rtp->rtcp)
03291 return 0;
03292
03293 if (!rtp->rtcp->them.sin_addr.s_addr) {
03294 ast_verbose("RTCP SR transmission error, rtcp halted\n");
03295 AST_SCHED_DEL(rtp->sched, rtp->rtcp->schedid);
03296 return 0;
03297 }
03298
03299 gettimeofday(&now, NULL);
03300 timeval2ntp(now, &now_msw, &now_lsw);
03301 rtcpheader = (unsigned int *)bdata;
03302 rtcpheader[1] = htonl(rtp->ssrc);
03303 rtcpheader[2] = htonl(now_msw);
03304 rtcpheader[3] = htonl(now_lsw);
03305 rtcpheader[4] = htonl(rtp->lastts);
03306 rtcpheader[5] = htonl(rtp->txcount);
03307 rtcpheader[6] = htonl(rtp->txoctetcount);
03308 len += 28;
03309
03310 extended = rtp->cycles + rtp->lastrxseqno;
03311 expected = extended - rtp->seedrxseqno + 1;
03312 if (rtp->rxcount > expected)
03313 expected += rtp->rxcount - expected;
03314 lost = expected - rtp->rxcount;
03315 expected_interval = expected - rtp->rtcp->expected_prior;
03316 rtp->rtcp->expected_prior = expected;
03317 received_interval = rtp->rxcount - rtp->rtcp->received_prior;
03318 rtp->rtcp->received_prior = rtp->rxcount;
03319 lost_interval = expected_interval - received_interval;
03320 if (expected_interval == 0 || lost_interval <= 0)
03321 fraction = 0;
03322 else
03323 fraction = (lost_interval << 8) / expected_interval;
03324 timersub(&now, &rtp->rtcp->rxlsr, &dlsr);
03325 rtcpheader[7] = htonl(rtp->themssrc);
03326 rtcpheader[8] = htonl(((fraction & 0xff) << 24) | (lost & 0xffffff));
03327 rtcpheader[9] = htonl((rtp->cycles) | ((rtp->lastrxseqno & 0xffff)));
03328 rtcpheader[10] = htonl((unsigned int)(rtp->rxjitter * 65536.));
03329 rtcpheader[11] = htonl(rtp->rtcp->themrxlsr);
03330 rtcpheader[12] = htonl((((dlsr.tv_sec * 1000) + (dlsr.tv_usec / 1000)) * 65536) / 1000);
03331 len += 24;
03332
03333 rtcpheader[0] = htonl((2 << 30) | (1 << 24) | (RTCP_PT_SR << 16) | ((len/4)-1));
03334
03335 if (rtp->rtcp->sendfur) {
03336 rtcpheader[13] = htonl((2 << 30) | (0 << 24) | (RTCP_PT_FUR << 16) | 1);
03337 rtcpheader[14] = htonl(rtp->ssrc);
03338 len += 8;
03339 rtp->rtcp->sendfur = 0;
03340 }
03341
03342
03343
03344 rtcpheader[len/4] = htonl((2 << 30) | (1 << 24) | (RTCP_PT_SDES << 16) | 2);
03345 rtcpheader[(len/4)+1] = htonl(rtp->ssrc);
03346 rtcpheader[(len/4)+2] = htonl(0x01 << 24);
03347 len += 12;
03348
03349 res = sendto(rtp->rtcp->s, (unsigned int *)rtcpheader, len, 0, (struct sockaddr *)&rtp->rtcp->them, sizeof(rtp->rtcp->them));
03350 if (res < 0) {
03351 ast_log(LOG_ERROR, "RTCP SR transmission error to %s:%d, rtcp halted %s\n",ast_inet_ntoa(rtp->rtcp->them.sin_addr), ntohs(rtp->rtcp->them.sin_port), strerror(errno));
03352 AST_SCHED_DEL(rtp->sched, rtp->rtcp->schedid);
03353 return 0;
03354 }
03355
03356
03357 gettimeofday(&rtp->rtcp->txlsr, NULL);
03358 rtp->rtcp->sr_count++;
03359
03360 rtp->rtcp->lastsrtxcount = rtp->txcount;
03361
03362 if (rtcp_debug_test_addr(&rtp->rtcp->them)) {
03363 ast_verbose("* Sent RTCP SR to %s:%d\n", ast_inet_ntoa(rtp->rtcp->them.sin_addr), ntohs(rtp->rtcp->them.sin_port));
03364 ast_verbose(" Our SSRC: %u\n", rtp->ssrc);
03365 ast_verbose(" Sent(NTP): %u.%010u\n", (unsigned int)now.tv_sec, (unsigned int)now.tv_usec*4096);
03366 ast_verbose(" Sent(RTP): %u\n", rtp->lastts);
03367 ast_verbose(" Sent packets: %u\n", rtp->txcount);
03368 ast_verbose(" Sent octets: %u\n", rtp->txoctetcount);
03369 ast_verbose(" Report block:\n");
03370 ast_verbose(" Fraction lost: %u\n", fraction);
03371 ast_verbose(" Cumulative loss: %u\n", lost);
03372 ast_verbose(" IA jitter: %.4f\n", rtp->rxjitter);
03373 ast_verbose(" Their last SR: %u\n", rtp->rtcp->themrxlsr);
03374 ast_verbose(" DLSR: %4.4f (sec)\n\n", (double)(ntohl(rtcpheader[12])/65536.0));
03375 }
03376 manager_event(EVENT_FLAG_REPORTING, "RTCPSent", "To: %s:%d\r\n"
03377 "OurSSRC: %u\r\n"
03378 "SentNTP: %u.%010u\r\n"
03379 "SentRTP: %u\r\n"
03380 "SentPackets: %u\r\n"
03381 "SentOctets: %u\r\n"
03382 "ReportBlock:\r\n"
03383 "FractionLost: %u\r\n"
03384 "CumulativeLoss: %u\r\n"
03385 "IAJitter: %.4f\r\n"
03386 "TheirLastSR: %u\r\n"
03387 "DLSR: %4.4f (sec)\r\n",
03388 ast_inet_ntoa(rtp->rtcp->them.sin_addr), ntohs(rtp->rtcp->them.sin_port),
03389 rtp->ssrc,
03390 (unsigned int)now.tv_sec, (unsigned int)now.tv_usec*4096,
03391 rtp->lastts,
03392 rtp->txcount,
03393 rtp->txoctetcount,
03394 fraction,
03395 lost,
03396 rtp->rxjitter,
03397 rtp->rtcp->themrxlsr,
03398 (double)(ntohl(rtcpheader[12])/65536.0));
03399 return res;
03400 }
03401
03402
03403 static int ast_rtcp_write_rr(const void *data)
03404 {
03405 struct ast_rtp *rtp = (struct ast_rtp *)data;
03406 int res;
03407 int len = 32;
03408 unsigned int lost;
03409 unsigned int extended;
03410 unsigned int expected;
03411 unsigned int expected_interval;
03412 unsigned int received_interval;
03413 int lost_interval;
03414 struct timeval now;
03415 unsigned int *rtcpheader;
03416 char bdata[1024];
03417 struct timeval dlsr;
03418 int fraction;
03419
03420 double rxlost_current;
03421
03422 if (!rtp || !rtp->rtcp || (&rtp->rtcp->them.sin_addr == 0))
03423 return 0;
03424
03425 if (!rtp->rtcp->them.sin_addr.s_addr) {
03426 ast_log(LOG_ERROR, "RTCP RR transmission error, rtcp halted\n");
03427 AST_SCHED_DEL(rtp->sched, rtp->rtcp->schedid);
03428 return 0;
03429 }
03430
03431 extended = rtp->cycles + rtp->lastrxseqno;
03432 expected = extended - rtp->seedrxseqno + 1;
03433 lost = expected - rtp->rxcount;
03434 expected_interval = expected - rtp->rtcp->expected_prior;
03435 rtp->rtcp->expected_prior = expected;
03436 received_interval = rtp->rxcount - rtp->rtcp->received_prior;
03437 rtp->rtcp->received_prior = rtp->rxcount;
03438 lost_interval = expected_interval - received_interval;
03439
03440 if (lost_interval <= 0)
03441 rtp->rtcp->rxlost = 0;
03442 else rtp->rtcp->rxlost = rtp->rtcp->rxlost;
03443 if (rtp->rtcp->rxlost_count == 0)
03444 rtp->rtcp->minrxlost = rtp->rtcp->rxlost;
03445 if (lost_interval < rtp->rtcp->minrxlost)
03446 rtp->rtcp->minrxlost = rtp->rtcp->rxlost;
03447 if (lost_interval > rtp->rtcp->maxrxlost)
03448 rtp->rtcp->maxrxlost = rtp->rtcp->rxlost;
03449
03450 rxlost_current = normdev_compute(rtp->rtcp->normdev_rxlost, rtp->rtcp->rxlost, rtp->rtcp->rxlost_count);
03451 rtp->rtcp->stdev_rxlost = stddev_compute(rtp->rtcp->stdev_rxlost, rtp->rtcp->rxlost, rtp->rtcp->normdev_rxlost, rxlost_current, rtp->rtcp->rxlost_count);
03452 rtp->rtcp->normdev_rxlost = rxlost_current;
03453 rtp->rtcp->rxlost_count++;
03454
03455 if (expected_interval == 0 || lost_interval <= 0)
03456 fraction = 0;
03457 else
03458 fraction = (lost_interval << 8) / expected_interval;
03459 gettimeofday(&now, NULL);
03460 timersub(&now, &rtp->rtcp->rxlsr, &dlsr);
03461 rtcpheader = (unsigned int *)bdata;
03462 rtcpheader[0] = htonl((2 << 30) | (1 << 24) | (RTCP_PT_RR << 16) | ((len/4)-1));
03463 rtcpheader[1] = htonl(rtp->ssrc);
03464 rtcpheader[2] = htonl(rtp->themssrc);
03465 rtcpheader[3] = htonl(((fraction & 0xff) << 24) | (lost & 0xffffff));
03466 rtcpheader[4] = htonl((rtp->cycles) | ((rtp->lastrxseqno & 0xffff)));
03467 rtcpheader[5] = htonl((unsigned int)(rtp->rxjitter * 65536.));
03468 rtcpheader[6] = htonl(rtp->rtcp->themrxlsr);
03469 rtcpheader[7] = htonl((((dlsr.tv_sec * 1000) + (dlsr.tv_usec / 1000)) * 65536) / 1000);
03470
03471 if (rtp->rtcp->sendfur) {
03472 rtcpheader[8] = htonl((2 << 30) | (0 << 24) | (RTCP_PT_FUR << 16) | 1);
03473 rtcpheader[9] = htonl(rtp->ssrc);
03474 len += 8;
03475 rtp->rtcp->sendfur = 0;
03476 }
03477
03478
03479
03480 rtcpheader[len/4] = htonl((2 << 30) | (1 << 24) | (RTCP_PT_SDES << 16) | 2);
03481 rtcpheader[(len/4)+1] = htonl(rtp->ssrc);
03482 rtcpheader[(len/4)+2] = htonl(0x01 << 24);
03483 len += 12;
03484
03485 res = sendto(rtp->rtcp->s, (unsigned int *)rtcpheader, len, 0, (struct sockaddr *)&rtp->rtcp->them, sizeof(rtp->rtcp->them));
03486
03487 if (res < 0) {
03488 ast_log(LOG_ERROR, "RTCP RR transmission error, rtcp halted: %s\n",strerror(errno));
03489
03490 AST_SCHED_DEL(rtp->sched, rtp->rtcp->schedid);
03491 return 0;
03492 }
03493
03494 rtp->rtcp->rr_count++;
03495
03496 if (rtcp_debug_test_addr(&rtp->rtcp->them)) {
03497 ast_verbose("\n* Sending RTCP RR to %s:%d\n"
03498 " Our SSRC: %u\nTheir SSRC: %u\niFraction lost: %d\nCumulative loss: %u\n"
03499 " IA jitter: %.4f\n"
03500 " Their last SR: %u\n"
03501 " DLSR: %4.4f (sec)\n\n",
03502 ast_inet_ntoa(rtp->rtcp->them.sin_addr),
03503 ntohs(rtp->rtcp->them.sin_port),
03504 rtp->ssrc, rtp->themssrc, fraction, lost,
03505 rtp->rxjitter,
03506 rtp->rtcp->themrxlsr,
03507 (double)(ntohl(rtcpheader[7])/65536.0));
03508 }
03509
03510 return res;
03511 }
03512
03513
03514
03515
03516 static int ast_rtcp_write(const void *data)
03517 {
03518 struct ast_rtp *rtp = (struct ast_rtp *)data;
03519 int res;
03520
03521 if (!rtp || !rtp->rtcp)
03522 return 0;
03523
03524 if (rtp->txcount > rtp->rtcp->lastsrtxcount)
03525 res = ast_rtcp_write_sr(data);
03526 else
03527 res = ast_rtcp_write_rr(data);
03528
03529 return res;
03530 }
03531
03532
03533 int ast_rtp_sendcng(struct ast_rtp *rtp, int level)
03534 {
03535 unsigned int *rtpheader;
03536 int hdrlen = 12;
03537 int res;
03538 int payload;
03539 char data[256];
03540 level = 127 - (level & 0x7f);
03541 payload = ast_rtp_lookup_code(rtp, 0, AST_RTP_CN);
03542
03543
03544 if (!rtp->them.sin_addr.s_addr)
03545 return 0;
03546
03547 rtp->dtmfmute = ast_tvadd(ast_tvnow(), ast_tv(0, 500000));
03548
03549
03550 rtpheader = (unsigned int *)data;
03551 rtpheader[0] = htonl((2 << 30) | (1 << 23) | (payload << 16) | (rtp->seqno++));
03552 rtpheader[1] = htonl(rtp->lastts);
03553 rtpheader[2] = htonl(rtp->ssrc);
03554 data[12] = level;
03555 if (rtp->them.sin_port && rtp->them.sin_addr.s_addr) {
03556 res = sendto(rtp->s, (void *)rtpheader, hdrlen + 1, 0, (struct sockaddr *)&rtp->them, sizeof(rtp->them));
03557 if (res <0)
03558 ast_log(LOG_ERROR, "RTP Comfort Noise Transmission error to %s:%d: %s\n", ast_inet_ntoa(rtp->them.sin_addr), ntohs(rtp->them.sin_port), strerror(errno));
03559 if (rtp_debug_test_addr(&rtp->them))
03560 ast_verbose("Sent Comfort Noise RTP packet to %s:%u (type %d, seq %u, ts %u, len %d)\n"
03561 , ast_inet_ntoa(rtp->them.sin_addr), ntohs(rtp->them.sin_port), payload, rtp->seqno, rtp->lastts,res - hdrlen);
03562
03563 }
03564 return 0;
03565 }
03566
03567
03568 static int ast_rtp_raw_write(struct ast_rtp *rtp, struct ast_frame *f, int codec)
03569 {
03570 unsigned char *rtpheader;
03571 int hdrlen = 12;
03572 int res;
03573 unsigned int ms;
03574 int pred;
03575 int mark = 0;
03576 int rate = rtp_get_rate(f->subclass) / 1000;
03577
03578 if (f->subclass == AST_FORMAT_G722) {
03579 f->samples /= 2;
03580 }
03581
03582 if (rtp->sending_digit) {
03583 return 0;
03584 }
03585
03586 ms = calc_txstamp(rtp, &f->delivery);
03587
03588 if (f->frametype == AST_FRAME_VOICE) {
03589 pred = rtp->lastts + f->samples;
03590
03591
03592 rtp->lastts = rtp->lastts + ms * rate;
03593 if (ast_tvzero(f->delivery)) {
03594
03595
03596 if (abs(rtp->lastts - pred) < MAX_TIMESTAMP_SKEW)
03597 rtp->lastts = pred;
03598 else {
03599 ast_debug(3, "Difference is %d, ms is %d\n", abs(rtp->lastts - pred), ms);
03600 mark = 1;
03601 }
03602 }
03603 } else if (f->frametype == AST_FRAME_VIDEO) {
03604 mark = f->subclass & 0x1;
03605 pred = rtp->lastovidtimestamp + f->samples;
03606
03607 rtp->lastts = rtp->lastts + ms * 90;
03608
03609 if (ast_tvzero(f->delivery)) {
03610 if (abs(rtp->lastts - pred) < 7200) {
03611 rtp->lastts = pred;
03612 rtp->lastovidtimestamp += f->samples;
03613 } else {
03614 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, f->samples);
03615 rtp->lastovidtimestamp = rtp->lastts;
03616 }
03617 }
03618 } else {
03619 pred = rtp->lastotexttimestamp + f->samples;
03620
03621 rtp->lastts = rtp->lastts + ms;
03622
03623 if (ast_tvzero(f->delivery)) {
03624 if (abs(rtp->lastts - pred) < 7200) {
03625 rtp->lastts = pred;
03626 rtp->lastotexttimestamp += f->samples;
03627 } else {
03628 ast_debug(3, "Difference is %d, ms is %d, pred/ts/samples %d/%d/%d\n", abs(rtp->lastts - pred), ms, rtp->lastts, pred, f->samples);
03629 rtp->lastotexttimestamp = rtp->lastts;
03630 }
03631 }
03632 }
03633
03634
03635 if (rtp->set_marker_bit) {
03636 mark = 1;
03637 rtp->set_marker_bit = 0;
03638 }
03639
03640
03641
03642
03643 if (rtp->lastts > rtp->lastdigitts)
03644 rtp->lastdigitts = rtp->lastts;
03645
03646 if (ast_test_flag(f, AST_FRFLAG_HAS_TIMING_INFO))
03647 rtp->lastts = f->ts * rate;
03648
03649
03650 rtpheader = (unsigned char *)(f->data.ptr - hdrlen);
03651
03652 put_unaligned_uint32(rtpheader, htonl((2 << 30) | (codec << 16) | (rtp->seqno) | (mark << 23)));
03653 put_unaligned_uint32(rtpheader + 4, htonl(rtp->lastts));
03654 put_unaligned_uint32(rtpheader + 8, htonl(rtp->ssrc));
03655
03656 if (rtp->them.sin_port && rtp->them.sin_addr.s_addr) {
03657 res = sendto(rtp->s, (void *)rtpheader, f->datalen + hdrlen, 0, (struct sockaddr *)&rtp->them, sizeof(rtp->them));
03658 if (res < 0) {
03659 if (!rtp->nat || (rtp->nat && (ast_test_flag(rtp, FLAG_NAT_ACTIVE) == FLAG_NAT_ACTIVE))) {
03660 ast_debug(1, "RTP Transmission error of packet %d to %s:%d: %s\n", rtp->seqno, ast_inet_ntoa(rtp->them.sin_addr), ntohs(rtp->them.sin_port), strerror(errno));
03661 } else if (((ast_test_flag(rtp, FLAG_NAT_ACTIVE) == FLAG_NAT_INACTIVE) || rtpdebug) && !ast_test_flag(rtp, FLAG_NAT_INACTIVE_NOWARN)) {
03662
03663 if (option_debug || rtpdebug)
03664 ast_debug(0, "RTP NAT: Can't write RTP to private address %s:%d, waiting for other end to send audio...\n", ast_inet_ntoa(rtp->them.sin_addr), ntohs(rtp->them.sin_port));
03665 ast_set_flag(rtp, FLAG_NAT_INACTIVE_NOWARN);
03666 }
03667 } else {
03668 rtp->txcount++;
03669 rtp->txoctetcount +=(res - hdrlen);
03670
03671
03672 if (rtp->rtcp && rtp->rtcp->them.sin_addr.s_addr && rtp->rtcp->schedid < 1) {
03673 rtp->rtcp->schedid = ast_sched_add(rtp->sched, ast_rtcp_calc_interval(rtp), ast_rtcp_write, rtp);
03674 }
03675 }
03676
03677 if (rtp_debug_test_addr(&rtp->them))
03678 ast_verbose("Sent RTP packet to %s:%u (type %-2.2d, seq %-6.6u, ts %-6.6u, len %-6.6u)\n",
03679 ast_inet_ntoa(rtp->them.sin_addr), ntohs(rtp->them.sin_port), codec, rtp->seqno, rtp->lastts,res - hdrlen);
03680 }
03681
03682 rtp->seqno++;
03683
03684 return 0;
03685 }
03686
03687 void ast_rtp_codec_setpref(struct ast_rtp *rtp, struct ast_codec_pref *prefs)
03688 {
03689 struct ast_format_list current_format_old, current_format_new;
03690
03691
03692
03693
03694 if (rtp->lasttxformat == 0) {
03695 rtp->pref = *prefs;
03696 return;
03697 }
03698
03699 current_format_old = ast_codec_pref_getsize(&rtp->pref, rtp->lasttxformat);
03700
03701 rtp->pref = *prefs;
03702
03703 current_format_new = ast_codec_pref_getsize(&rtp->pref, rtp->lasttxformat);
03704
03705
03706
03707
03708 if ((current_format_new.inc_ms != 0) &&
03709 (current_format_new.cur_ms != current_format_old.cur_ms)) {
03710 int new_size = (current_format_new.cur_ms * current_format_new.fr_len) / current_format_new.inc_ms;
03711
03712 if (rtp->smoother) {
03713 ast_smoother_reconfigure(rtp->smoother, new_size);
03714 if (option_debug) {
03715 ast_log(LOG_DEBUG, "Adjusted smoother to %d ms and %d bytes\n", current_format_new.cur_ms, new_size);
03716 }
03717 } else {
03718 if (!(rtp->smoother = ast_smoother_new(new_size))) {
03719 ast_log(LOG_WARNING, "Unable to create smoother: format: %d ms: %d len: %d\n", rtp->lasttxformat, current_format_new.cur_ms, new_size);
03720 return;
03721 }
03722 if (current_format_new.flags) {
03723 ast_smoother_set_flags(rtp->smoother, current_format_new.flags);
03724 }
03725 if (option_debug) {
03726 ast_log(LOG_DEBUG, "Created smoother: format: %d ms: %d len: %d\n", rtp->lasttxformat, current_format_new.cur_ms, new_size);
03727 }
03728 }
03729 }
03730
03731 }
03732
03733 struct ast_codec_pref *ast_rtp_codec_getpref(struct ast_rtp *rtp)
03734 {
03735 return &rtp->pref;
03736 }
03737
03738 int ast_rtp_codec_getformat(int pt)
03739 {
03740 if (pt < 0 || pt >= MAX_RTP_PT)
03741 return 0;
03742
03743 if (static_RTP_PT[pt].isAstFormat)
03744 return static_RTP_PT[pt].code;
03745 else
03746 return 0;
03747 }
03748
03749 int ast_rtp_write(struct ast_rtp *rtp, struct ast_frame *_f)
03750 {
03751 struct ast_frame *f;
03752 int codec;
03753 int hdrlen = 12;
03754 int subclass;
03755
03756
03757
03758 if (!rtp->them.sin_addr.s_addr)
03759 return 0;
03760
03761
03762 if (!_f->datalen && !rtp->red)
03763 return 0;
03764
03765
03766 if ((_f->frametype != AST_FRAME_VOICE) && (_f->frametype != AST_FRAME_VIDEO) && (_f->frametype != AST_FRAME_TEXT)) {
03767 ast_log(LOG_WARNING, "RTP can only send voice, video and text\n");
03768 return -1;
03769 }
03770
03771 if (rtp->red) {
03772
03773
03774 if ((_f = red_t140_to_red(rtp->red)) == NULL)
03775 return 0;
03776 }
03777
03778
03779 subclass = _f->subclass;
03780 if (_f->frametype == AST_FRAME_VIDEO)
03781 subclass &= ~0x1;
03782
03783 codec = ast_rtp_lookup_code(rtp, 1, subclass);
03784 if (codec < 0) {
03785 ast_log(LOG_WARNING, "Don't know how to send format %s packets with RTP\n", ast_getformatname(_f->subclass));
03786 return -1;
03787 }
03788
03789 if (rtp->lasttxformat != subclass) {
03790
03791 ast_debug(1, "Ooh, format changed from %s to %s\n", ast_getformatname(rtp->lasttxformat), ast_getformatname(subclass));
03792 rtp->lasttxformat = subclass;
03793 if (rtp->smoother)
03794 ast_smoother_free(rtp->smoother);
03795 rtp->smoother = NULL;
03796 }
03797
03798 if (!rtp->smoother && subclass != AST_FORMAT_SPEEX && subclass != AST_FORMAT_G723_1) {
03799 struct ast_format_list fmt = ast_codec_pref_getsize(&rtp->pref, subclass);
03800 if (fmt.inc_ms) {
03801 if (!(rtp->smoother = ast_smoother_new((fmt.cur_ms * fmt.fr_len) / fmt.inc_ms))) {
03802 ast_log(LOG_WARNING, "Unable to create smoother: format: %d ms: %d len: %d\n", subclass, fmt.cur_ms, ((fmt.cur_ms * fmt.fr_len) / fmt.inc_ms));
03803 return -1;
03804 }
03805 if (fmt.flags)
03806 ast_smoother_set_flags(rtp->smoother, fmt.flags);
03807 ast_debug(1, "Created smoother: format: %d ms: %d len: %d\n", subclass, fmt.cur_ms, ((fmt.cur_ms * fmt.fr_len) / fmt.inc_ms));
03808 }
03809 }
03810 if (rtp->smoother) {
03811 if (ast_smoother_test_flag(rtp->smoother, AST_SMOOTHER_FLAG_BE)) {
03812 ast_smoother_feed_be(rtp->smoother, _f);
03813 } else {
03814 ast_smoother_feed(rtp->smoother, _f);
03815 }
03816
03817 while ((f = ast_smoother_read(rtp->smoother)) && (f->data.ptr)) {
03818 ast_rtp_raw_write(rtp, f, codec);
03819 }
03820 } else {
03821
03822 if (_f->offset < hdrlen)
03823 f = ast_frdup(_f);
03824 else
03825 f = _f;
03826 if (f->data.ptr)
03827 ast_rtp_raw_write(rtp, f, codec);
03828 if (f != _f)
03829 ast_frfree(f);
03830 }
03831
03832 return 0;
03833 }
03834
03835
03836 void ast_rtp_proto_unregister(struct ast_rtp_protocol *proto)
03837 {
03838 AST_RWLIST_WRLOCK(&protos);
03839 AST_RWLIST_REMOVE(&protos, proto, list);
03840 AST_RWLIST_UNLOCK(&protos);
03841 }
03842
03843
03844 int ast_rtp_proto_register(struct ast_rtp_protocol *proto)
03845 {
03846 struct ast_rtp_protocol *cur;
03847
03848 AST_RWLIST_WRLOCK(&protos);
03849 AST_RWLIST_TRAVERSE(&protos, cur, list) {
03850 if (!strcmp(cur->type, proto->type)) {
03851 ast_log(LOG_WARNING, "Tried to register same protocol '%s' twice\n", cur->type);
03852 AST_RWLIST_UNLOCK(&protos);
03853 return -1;
03854 }
03855 }
03856 AST_RWLIST_INSERT_HEAD(&protos, proto, list);
03857 AST_RWLIST_UNLOCK(&protos);
03858
03859 return 0;
03860 }
03861
03862
03863 static enum ast_bridge_result bridge_native_loop(struct ast_channel *c0, struct ast_channel *c1, struct ast_rtp *p0, struct ast_rtp *p1, struct ast_rtp *vp0, struct ast_rtp *vp1, struct ast_rtp *tp0, struct ast_rtp *tp1, struct ast_rtp_protocol *pr0, struct ast_rtp_protocol *pr1, int codec0, int codec1, int timeoutms, int flags, struct ast_frame **fo, struct ast_channel **rc, void *pvt0, void *pvt1)
03864 {
03865 struct ast_frame *fr = NULL;
03866 struct ast_channel *who = NULL, *other = NULL, *cs[3] = {NULL, };
03867 int oldcodec0 = codec0, oldcodec1 = codec1;
03868 struct sockaddr_in ac1 = {0,}, vac1 = {0,}, tac1 = {0,}, ac0 = {0,}, vac0 = {0,}, tac0 = {0,};
03869 struct sockaddr_in t1 = {0,}, vt1 = {0,}, tt1 = {0,}, t0 = {0,}, vt0 = {0,}, tt0 = {0,};
03870
03871
03872
03873
03874 if (!(pr0->set_rtp_peer(c0, p1, vp1, tp1, codec1, ast_test_flag(p1, FLAG_NAT_ACTIVE)))) {
03875 ast_rtp_get_peer(p1, &ac1);
03876 if (vp1)
03877 ast_rtp_get_peer(vp1, &vac1);
03878 if (tp1)
03879 ast_rtp_get_peer(tp1, &tac1);
03880 } else
03881 ast_log(LOG_WARNING, "Channel '%s' failed to talk to '%s'\n", c0->name, c1->name);
03882
03883
03884 if (!(pr1->set_rtp_peer(c1, p0, vp0, tp0, codec0, ast_test_flag(p0, FLAG_NAT_ACTIVE)))) {
03885 ast_rtp_get_peer(p0, &ac0);
03886 if (vp0)
03887 ast_rtp_get_peer(vp0, &vac0);
03888 if (tp0)
03889 ast_rtp_get_peer(tp0, &tac0);
03890 } else
03891 ast_log(LOG_WARNING, "Channel '%s' failed to talk to '%s'\n", c1->name, c0->name);
03892
03893
03894 ast_channel_unlock(c0);
03895 ast_channel_unlock(c1);
03896
03897 ast_poll_channel_add(c0, c1);
03898
03899
03900 cs[0] = c0;
03901 cs[1] = c1;
03902 cs[2] = NULL;
03903 for (;;) {
03904
03905 if ((c0->tech_pvt != pvt0) ||
03906 (c1->tech_pvt != pvt1) ||
03907 (c0->masq || c0->masqr || c1->masq || c1->masqr) ||
03908 (c0->monitor || c0->audiohooks || c1->monitor || c1->audiohooks)) {
03909 ast_debug(1, "Oooh, something is weird, backing out\n");
03910 if (c0->tech_pvt == pvt0)
03911 if (pr0->set_rtp_peer(c0, NULL, NULL, NULL, 0, 0))
03912 ast_log(LOG_WARNING, "Channel '%s' failed to break RTP bridge\n", c0->name);
03913 if (c1->tech_pvt == pvt1)
03914 if (pr1->set_rtp_peer(c1, NULL, NULL, NULL, 0, 0))
03915 ast_log(LOG_WARNING, "Channel '%s' failed to break RTP bridge\n", c1->name);
03916 ast_poll_channel_del(c0, c1);
03917 return AST_BRIDGE_RETRY;
03918 }
03919
03920
03921 ast_rtp_get_peer(p1, &t1);
03922 if (vp1)
03923 ast_rtp_get_peer(vp1, &vt1);
03924 if (tp1)
03925 ast_rtp_get_peer(tp1, &tt1);
03926 if (pr1->get_codec)
03927 codec1 = pr1->get_codec(c1);
03928 ast_rtp_get_peer(p0, &t0);
03929 if (vp0)
03930 ast_rtp_get_peer(vp0, &vt0);
03931 if (tp0)
03932 ast_rtp_get_peer(tp0, &tt0);
03933 if (pr0->get_codec)
03934 codec0 = pr0->get_codec(c0);
03935 if ((inaddrcmp(&t1, &ac1)) ||
03936 (vp1 && inaddrcmp(&vt1, &vac1)) ||
03937 (tp1 && inaddrcmp(&tt1, &tac1)) ||
03938 (codec1 != oldcodec1)) {
03939 ast_debug(2, "Oooh, '%s' changed end address to %s:%d (format %d)\n",
03940 c1->name, ast_inet_ntoa(t1.sin_addr), ntohs(t1.sin_port), codec1);
03941 ast_debug(2, "Oooh, '%s' changed end vaddress to %s:%d (format %d)\n",
03942 c1->name, ast_inet_ntoa(vt1.sin_addr), ntohs(vt1.sin_port), codec1);
03943 ast_debug(2, "Oooh, '%s' changed end taddress to %s:%d (format %d)\n",
03944 c1->name, ast_inet_ntoa(tt1.sin_addr), ntohs(tt1.sin_port), codec1);
03945 ast_debug(2, "Oooh, '%s' was %s:%d/(format %d)\n",
03946 c1->name, ast_inet_ntoa(ac1.sin_addr), ntohs(ac1.sin_port), oldcodec1);
03947 ast_debug(2, "Oooh, '%s' was %s:%d/(format %d)\n",
03948 c1->name, ast_inet_ntoa(vac1.sin_addr), ntohs(vac1.sin_port), oldcodec1);
03949 ast_debug(2, "Oooh, '%s' was %s:%d/(format %d)\n",
03950 c1->name, ast_inet_ntoa(tac1.sin_addr), ntohs(tac1.sin_port), oldcodec1);
03951 if (pr0->set_rtp_peer(c0, t1.sin_addr.s_addr ? p1 : NULL, vt1.sin_addr.s_addr ? vp1 : NULL, tt1.sin_addr.s_addr ? tp1 : NULL, codec1, ast_test_flag(p1, FLAG_NAT_ACTIVE)))
03952 ast_log(LOG_WARNING, "Channel '%s' failed to update to '%s'\n", c0->name, c1->name);
03953 memcpy(&ac1, &t1, sizeof(ac1));
03954 memcpy(&vac1, &vt1, sizeof(vac1));
03955 memcpy(&tac1, &tt1, sizeof(tac1));
03956 oldcodec1 = codec1;
03957 }
03958 if ((inaddrcmp(&t0, &ac0)) ||
03959 (vp0 && inaddrcmp(&vt0, &vac0)) ||
03960 (tp0 && inaddrcmp(&tt0, &tac0)) ||
03961 (codec0 != oldcodec0)) {
03962 ast_debug(2, "Oooh, '%s' changed end address to %s:%d (format %d)\n",
03963 c0->name, ast_inet_ntoa(t0.sin_addr), ntohs(t0.sin_port), codec0);
03964 ast_debug(2, "Oooh, '%s' was %s:%d/(format %d)\n",
03965 c0->name, ast_inet_ntoa(ac0.sin_addr), ntohs(ac0.sin_port), oldcodec0);
03966 if (pr1->set_rtp_peer(c1, t0.sin_addr.s_addr ? p0 : NULL, vt0.sin_addr.s_addr ? vp0 : NULL, tt0.sin_addr.s_addr ? tp0 : NULL, codec0, ast_test_flag(p0, FLAG_NAT_ACTIVE)))
03967 ast_log(LOG_WARNING, "Channel '%s' failed to update to '%s'\n", c1->name, c0->name);
03968 memcpy(&ac0, &t0, sizeof(ac0));
03969 memcpy(&vac0, &vt0, sizeof(vac0));
03970 memcpy(&tac0, &tt0, sizeof(tac0));
03971 oldcodec0 = codec0;
03972 }
03973
03974
03975 if (!(who = ast_waitfor_n(cs, 2, &timeoutms))) {
03976 if (!timeoutms) {
03977 if (pr0->set_rtp_peer(c0, NULL, NULL, NULL, 0, 0))
03978 ast_log(LOG_WARNING, "Channel '%s' failed to break RTP bridge\n", c0->name);
03979 if (pr1->set_rtp_peer(c1, NULL, NULL, NULL, 0, 0))
03980 ast_log(LOG_WARNING, "Channel '%s' failed to break RTP bridge\n", c1->name);
03981 return AST_BRIDGE_RETRY;
03982 }
03983 ast_debug(1, "Ooh, empty read...\n");
03984 if (ast_check_hangup(c0) || ast_check_hangup(c1))
03985 break;
03986 continue;
03987 }
03988 fr = ast_read(who);
03989 other = (who == c0) ? c1 : c0;
03990 if (!fr || ((fr->frametype == AST_FRAME_DTMF_BEGIN || fr->frametype == AST_FRAME_DTMF_END) &&
03991 (((who == c0) && (flags & AST_BRIDGE_DTMF_CHANNEL_0)) ||
03992 ((who == c1) && (flags & AST_BRIDGE_DTMF_CHANNEL_1))))) {
03993
03994 *fo = fr;
03995 *rc = who;
03996 ast_debug(1, "Oooh, got a %s\n", fr ? "digit" : "hangup");
03997 if (c0->tech_pvt == pvt0)
03998 if (pr0->set_rtp_peer(c0, NULL, NULL, NULL, 0, 0))
03999 ast_log(LOG_WARNING, "Channel '%s' failed to break RTP bridge\n", c0->name);
04000 if (c1->tech_pvt == pvt1)
04001 if (pr1->set_rtp_peer(c1, NULL, NULL, NULL, 0, 0))
04002 ast_log(LOG_WARNING, "Channel '%s' failed to break RTP bridge\n", c1->name);
04003 ast_poll_channel_del(c0, c1);
04004 return AST_BRIDGE_COMPLETE;
04005 } else if ((fr->frametype == AST_FRAME_CONTROL) && !(flags & AST_BRIDGE_IGNORE_SIGS)) {
04006 if ((fr->subclass == AST_CONTROL_HOLD) ||
04007 (fr->subclass == AST_CONTROL_UNHOLD) ||
04008 (fr->subclass == AST_CONTROL_VIDUPDATE) ||
04009 (fr->subclass == AST_CONTROL_SRCUPDATE) ||
04010 (fr->subclass == AST_CONTROL_T38_PARAMETERS)) {
04011 if (fr->subclass == AST_CONTROL_HOLD) {
04012
04013 if (who == c0)
04014 pr1->set_rtp_peer(c1, NULL, NULL, NULL, 0, 0);
04015 else
04016 pr0->set_rtp_peer(c0, NULL, NULL, NULL, 0, 0);
04017 } else if (fr->subclass == AST_CONTROL_UNHOLD) {
04018
04019 if (who == c0)
04020 pr1->set_rtp_peer(c1, p0, vp0, tp0, codec0, ast_test_flag(p0, FLAG_NAT_ACTIVE));
04021 else
04022 pr0->set_rtp_peer(c0, p1, vp1, tp1, codec1, ast_test_flag(p1, FLAG_NAT_ACTIVE));
04023 }
04024
04025 ast_rtp_get_peer(p0, &t0);
04026 memcpy(&ac0, &t0, sizeof(ac0));
04027 ast_rtp_get_peer(p1, &t1);
04028 memcpy(&ac1, &t1, sizeof(ac1));
04029
04030 if (pr0->get_codec && c0->tech_pvt)
04031 oldcodec0 = codec0 = pr0->get_codec(c0);
04032 if (pr1->get_codec && c1->tech_pvt)
04033 oldcodec1 = codec1 = pr1->get_codec(c1);
04034 ast_indicate_data(other, fr->subclass, fr->data.ptr, fr->datalen);
04035 ast_frfree(fr);
04036 } else {
04037 *fo = fr;
04038 *rc = who;
04039 ast_debug(1, "Got a FRAME_CONTROL (%d) frame on channel %s\n", fr->subclass, who->name);
04040 return AST_BRIDGE_COMPLETE;
04041 }
04042 } else {
04043 if ((fr->frametype == AST_FRAME_DTMF_BEGIN) ||
04044 (fr->frametype == AST_FRAME_DTMF_END) ||
04045 (fr->frametype == AST_FRAME_VOICE) ||
04046 (fr->frametype == AST_FRAME_VIDEO) ||
04047 (fr->frametype == AST_FRAME_IMAGE) ||
04048 (fr->frametype == AST_FRAME_HTML) ||
04049 (fr->frametype == AST_FRAME_MODEM) ||
04050 (fr->frametype == AST_FRAME_TEXT)) {
04051 ast_write(other, fr);
04052 }
04053 ast_frfree(fr);
04054 }
04055
04056 #ifndef HAVE_EPOLL
04057 cs[2] = cs[0];
04058 cs[0] = cs[1];
04059 cs[1] = cs[2];
04060 #endif
04061 }
04062
04063 ast_poll_channel_del(c0, c1);
04064
04065 if (pr0->set_rtp_peer(c0, NULL, NULL, NULL, 0, 0))
04066 ast_log(LOG_WARNING, "Channel '%s' failed to break RTP bridge\n", c0->name);
04067 if (pr1->set_rtp_peer(c1, NULL, NULL, NULL, 0, 0))
04068 ast_log(LOG_WARNING, "Channel '%s' failed to break RTP bridge\n", c1->name);
04069
04070 return AST_BRIDGE_FAILED;
04071 }
04072
04073
04074 #ifdef P2P_INTENSE
04075 static int p2p_rtp_callback(int *id, int fd, short events, void *cbdata)
04076 {
04077 int res = 0, hdrlen = 12;
04078 struct sockaddr_in sin;
04079 socklen_t len;
04080 unsigned int *header;
04081 struct ast_rtp *rtp = cbdata, *bridged = NULL;
04082
04083 if (!rtp)
04084 return 1;
04085
04086 len = sizeof(sin);
04087 if ((res = recvfrom(fd, rtp->rawdata + AST_FRIENDLY_OFFSET, sizeof(rtp->rawdata) - AST_FRIENDLY_OFFSET, 0, (struct sockaddr *)&sin, &len)) < 0)
04088 return 1;
04089
04090 header = (unsigned int *)(rtp->rawdata + AST_FRIENDLY_OFFSET);
04091
04092
04093 if ((rtp->nat) &&
04094 ((rtp->them.sin_addr.s_addr != sin.sin_addr.s_addr) ||
04095 (rtp->them.sin_port != sin.sin_port))) {
04096 rtp->them = sin;
04097 rtp->rxseqno = 0;
04098 ast_set_flag(rtp, FLAG_NAT_ACTIVE);
04099 if (option_debug || rtpdebug)
04100 ast_debug(0, "P2P RTP NAT: Got audio from other end. Now sending to address %s:%d\n", ast_inet_ntoa(rtp->them.sin_addr), ntohs(rtp->them.sin_port));
04101 }
04102
04103
04104 if ((bridged = ast_rtp_get_bridged(rtp)))
04105 bridge_p2p_rtp_write(rtp, bridged, header, res, hdrlen);
04106
04107 return 1;
04108 }
04109
04110
04111 static int p2p_callback_enable(struct ast_channel *chan, struct ast_rtp *rtp, int **iod)
04112 {
04113
04114 if (ast_test_flag(rtp, FLAG_P2P_NEED_DTMF) || ast_test_flag(rtp, FLAG_HAS_STUN) || !rtp->io)
04115 return 0;
04116
04117
04118 if (rtp->ioid) {
04119 ast_io_remove(rtp->io, rtp->ioid);
04120 rtp->ioid = NULL;
04121 }
04122
04123
04124 chan->fds[0] = -1;
04125
04126
04127 iod[0] = ast_io_add(rtp->io, ast_rtp_fd(rtp), p2p_rtp_callback, AST_IO_IN, rtp);
04128
04129 return 1;
04130 }
04131 #else
04132 static int p2p_callback_enable(struct ast_channel *chan, struct ast_rtp *rtp, int **iod)
04133 {
04134 return 0;
04135 }
04136 #endif
04137
04138
04139 static int p2p_callback_disable(struct ast_channel *chan, struct ast_rtp *rtp, int **iod)
04140 {
04141 ast_channel_lock(chan);
04142
04143
04144 ast_io_remove(rtp->io, iod[0]);
04145
04146
04147 chan->fds[0] = ast_rtp_fd(rtp);
04148 ast_channel_unlock(chan);
04149
04150
04151 if (ast_test_flag(rtp, FLAG_CALLBACK_MODE))
04152 rtp->ioid = ast_io_add(rtp->io, ast_rtp_fd(rtp), rtpread, AST_IO_IN, rtp);
04153
04154 return 0;
04155 }
04156
04157
04158 static void p2p_set_bridge(struct ast_rtp *rtp0, struct ast_rtp *rtp1)
04159 {
04160 rtp_bridge_lock(rtp0);
04161 rtp0->bridged = rtp1;
04162 rtp_bridge_unlock(rtp0);
04163 }
04164
04165
04166
04167
04168
04169
04170
04171 static enum ast_bridge_result bridge_p2p_loop(struct ast_channel *c0, struct ast_channel *c1, struct ast_rtp *p0, struct ast_rtp *p1, int timeoutms, int flags, struct ast_frame **fo, struct ast_channel **rc, void *pvt0, void *pvt1)
04172 {
04173 struct ast_frame *fr = NULL;
04174 struct ast_channel *who = NULL, *other = NULL, *cs[3] = {NULL, };
04175 int *p0_iod[2] = {NULL, NULL}, *p1_iod[2] = {NULL, NULL};
04176 int p0_callback = 0, p1_callback = 0;
04177 enum ast_bridge_result res = AST_BRIDGE_FAILED;
04178
04179
04180 ast_clear_flag(p0, FLAG_P2P_SENT_MARK);
04181 p2p_set_bridge(p0, p1);
04182 ast_clear_flag(p1, FLAG_P2P_SENT_MARK);
04183 p2p_set_bridge(p1, p0);
04184
04185
04186 p0_callback = p2p_callback_enable(c0, p0, &p0_iod[0]);
04187 p1_callback = p2p_callback_enable(c1, p1, &p1_iod[0]);
04188
04189
04190 ast_channel_unlock(c0);
04191 ast_channel_unlock(c1);
04192
04193 ast_poll_channel_add(c0, c1);
04194
04195
04196 cs[0] = c0;
04197 cs[1] = c1;
04198 cs[2] = NULL;
04199 for (;;) {
04200
04201 if ((c0->rawreadformat != c1->rawwriteformat) || (c1->rawreadformat != c0->rawwriteformat)) {
04202 ast_debug(3, "p2p-rtp-bridge: Oooh, formats changed, backing out\n");
04203 res = AST_BRIDGE_FAILED_NOWARN;
04204 break;
04205 }
04206
04207 if ((c0->tech_pvt != pvt0) ||
04208 (c1->tech_pvt != pvt1) ||
04209 (c0->masq || c0->masqr || c1->masq || c1->masqr) ||
04210 (c0->monitor || c0->audiohooks || c1->monitor || c1->audiohooks)) {
04211 ast_debug(3, "p2p-rtp-bridge: Oooh, something is weird, backing out\n");
04212
04213 if ((c0->masq || c0->masqr) && (fr = ast_read(c0)))
04214 ast_frfree(fr);
04215 if ((c1->masq || c1->masqr) && (fr = ast_read(c1)))
04216 ast_frfree(fr);
04217 res = AST_BRIDGE_RETRY;
04218 break;
04219 }
04220
04221 if (!(who = ast_waitfor_n(cs, 2, &timeoutms))) {
04222 if (!timeoutms) {
04223 res = AST_BRIDGE_RETRY;
04224 break;
04225 }
04226 if (option_debug > 2)
04227 ast_log(LOG_NOTICE, "p2p-rtp-bridge: Ooh, empty read...\n");
04228 if (ast_check_hangup(c0) || ast_check_hangup(c1))
04229 break;
04230 continue;
04231 }
04232
04233 fr = ast_read(who);
04234 other = (who == c0) ? c1 : c0;
04235
04236 if (!fr || ((fr->frametype == AST_FRAME_DTMF_BEGIN || fr->frametype == AST_FRAME_DTMF_END) &&
04237 ((who == c0) && (flags & AST_BRIDGE_DTMF_CHANNEL_0)) |
04238 ((who == c1) && (flags & AST_BRIDGE_DTMF_CHANNEL_1)))) {
04239
04240 *fo = fr;
04241 *rc = who;
04242 ast_debug(3, "p2p-rtp-bridge: Ooh, got a %s\n", fr ? "digit" : "hangup");
04243 res = AST_BRIDGE_COMPLETE;
04244 break;
04245 } else if ((fr->frametype == AST_FRAME_CONTROL) && !(flags & AST_BRIDGE_IGNORE_SIGS)) {
04246 if ((fr->subclass == AST_CONTROL_HOLD) ||
04247 (fr->subclass == AST_CONTROL_UNHOLD) ||
04248 (fr->subclass == AST_CONTROL_VIDUPDATE) ||
04249 (fr->subclass == AST_CONTROL_SRCUPDATE) ||
04250 (fr->subclass == AST_CONTROL_T38_PARAMETERS)) {
04251
04252 if (fr->subclass == AST_CONTROL_HOLD) {
04253 if (p0_callback)
04254 p0_callback = p2p_callback_disable(c0, p0, &p0_iod[0]);
04255 if (p1_callback)
04256 p1_callback = p2p_callback_disable(c1, p1, &p1_iod[0]);
04257 p2p_set_bridge(p0, NULL);
04258 p2p_set_bridge(p1, NULL);
04259 } else if (fr->subclass == AST_CONTROL_UNHOLD) {
04260
04261 ast_clear_flag(p0, FLAG_P2P_SENT_MARK);
04262 p2p_set_bridge(p0, p1);
04263 ast_clear_flag(p1, FLAG_P2P_SENT_MARK);
04264 p2p_set_bridge(p1, p0);
04265 p0_callback = p2p_callback_enable(c0, p0, &p0_iod[0]);
04266 p1_callback = p2p_callback_enable(c1, p1, &p1_iod[0]);
04267 }
04268 ast_indicate_data(other, fr->subclass, fr->data.ptr, fr->datalen);
04269 ast_frfree(fr);
04270 } else {
04271 *fo = fr;
04272 *rc = who;
04273 ast_debug(3, "p2p-rtp-bridge: Got a FRAME_CONTROL (%d) frame on channel %s\n", fr->subclass, who->name);
04274 res = AST_BRIDGE_COMPLETE;
04275 break;
04276 }
04277 } else {
04278 if ((fr->frametype == AST_FRAME_DTMF_BEGIN) ||
04279 (fr->frametype == AST_FRAME_DTMF_END) ||
04280 (fr->frametype == AST_FRAME_VOICE) ||
04281 (fr->frametype == AST_FRAME_VIDEO) ||
04282 (fr->frametype == AST_FRAME_IMAGE) ||
04283 (fr->frametype == AST_FRAME_HTML) ||
04284 (fr->frametype == AST_FRAME_MODEM) ||
04285 (fr->frametype == AST_FRAME_TEXT)) {
04286 ast_write(other, fr);
04287 }
04288
04289 ast_frfree(fr);
04290 }
04291
04292 #ifndef HAVE_EPOLL
04293 cs[2] = cs[0];
04294 cs[0] = cs[1];
04295 cs[1] = cs[2];
04296 #endif
04297 }
04298
04299
04300 if (p0_callback)
04301 p0_callback = p2p_callback_disable(c0, p0, &p0_iod[0]);
04302 if (p1_callback)
04303 p1_callback = p2p_callback_disable(c1, p1, &p1_iod[0]);
04304
04305
04306 p2p_set_bridge(p0, NULL);
04307 p2p_set_bridge(p1, NULL);
04308
04309 ast_poll_channel_del(c0, c1);
04310
04311 return res;
04312 }
04313
04314
04315
04316
04317
04318
04319
04320
04321
04322
04323
04324
04325
04326
04327
04328
04329
04330
04331
04332
04333
04334
04335
04336
04337
04338
04339
04340
04341
04342
04343
04344
04345
04346 enum ast_bridge_result ast_rtp_bridge(struct ast_channel *c0, struct ast_channel *c1, int flags, struct ast_frame **fo, struct ast_channel **rc, int timeoutms)
04347 {
04348 struct ast_rtp *p0 = NULL, *p1 = NULL;
04349 struct ast_rtp *vp0 = NULL, *vp1 = NULL;
04350 struct ast_rtp *tp0 = NULL, *tp1 = NULL;
04351 struct ast_rtp_protocol *pr0 = NULL, *pr1 = NULL;
04352 enum ast_rtp_get_result audio_p0_res = AST_RTP_GET_FAILED, video_p0_res = AST_RTP_GET_FAILED, text_p0_res = AST_RTP_GET_FAILED;
04353 enum ast_rtp_get_result audio_p1_res = AST_RTP_GET_FAILED, video_p1_res = AST_RTP_GET_FAILED, text_p1_res = AST_RTP_GET_FAILED;
04354 enum ast_bridge_result res = AST_BRIDGE_FAILED;
04355 int codec0 = 0, codec1 = 0;
04356 void *pvt0 = NULL, *pvt1 = NULL;
04357
04358
04359 ast_channel_lock(c0);
04360 while (ast_channel_trylock(c1)) {
04361 ast_channel_unlock(c0);
04362 usleep(1);
04363 ast_channel_lock(c0);
04364 }
04365
04366
04367 if (ast_check_hangup(c0) || ast_check_hangup(c1)) {
04368 ast_log(LOG_WARNING, "Got hangup while attempting to bridge '%s' and '%s'\n", c0->name, c1->name);
04369 ast_channel_unlock(c0);
04370 ast_channel_unlock(c1);
04371 return AST_BRIDGE_FAILED;
04372 }
04373
04374
04375 if (!(pr0 = get_proto(c0))) {
04376 ast_log(LOG_WARNING, "Can't find native functions for channel '%s'\n", c0->name);
04377 ast_channel_unlock(c0);
04378 ast_channel_unlock(c1);
04379 return AST_BRIDGE_FAILED;
04380 }
04381 if (!(pr1 = get_proto(c1))) {
04382 ast_log(LOG_WARNING, "Can't find native functions for channel '%s'\n", c1->name);
04383 ast_channel_unlock(c0);
04384 ast_channel_unlock(c1);
04385 return AST_BRIDGE_FAILED;
04386 }
04387
04388
04389 pvt0 = c0->tech_pvt;
04390 pvt1 = c1->tech_pvt;
04391
04392
04393 audio_p0_res = pr0->get_rtp_info(c0, &p0);
04394 video_p0_res = pr0->get_vrtp_info ? pr0->get_vrtp_info(c0, &vp0) : AST_RTP_GET_FAILED;
04395 text_p0_res = pr0->get_trtp_info ? pr0->get_trtp_info(c0, &vp0) : AST_RTP_GET_FAILED;
04396 audio_p1_res = pr1->get_rtp_info(c1, &p1);
04397 video_p1_res = pr1->get_vrtp_info ? pr1->get_vrtp_info(c1, &vp1) : AST_RTP_GET_FAILED;
04398 text_p1_res = pr1->get_trtp_info ? pr1->get_trtp_info(c1, &vp1) : AST_RTP_GET_FAILED;
04399
04400
04401 if (video_p0_res != AST_RTP_GET_FAILED && (audio_p0_res != AST_RTP_TRY_NATIVE || video_p0_res != AST_RTP_TRY_NATIVE))
04402 audio_p0_res = AST_RTP_GET_FAILED;
04403 if (video_p1_res != AST_RTP_GET_FAILED && (audio_p1_res != AST_RTP_TRY_NATIVE || video_p1_res != AST_RTP_TRY_NATIVE))
04404 audio_p1_res = AST_RTP_GET_FAILED;
04405
04406
04407 if (audio_p0_res == AST_RTP_GET_FAILED || audio_p1_res == AST_RTP_GET_FAILED) {
04408
04409 ast_channel_unlock(c0);
04410 ast_channel_unlock(c1);
04411 return AST_BRIDGE_FAILED_NOWARN;
04412 }
04413
04414
04415 if (ast_test_flag(p0, FLAG_HAS_DTMF) && (flags & AST_BRIDGE_DTMF_CHANNEL_0)) {
04416 ast_set_flag(p0, FLAG_P2P_NEED_DTMF);
04417 audio_p0_res = AST_RTP_TRY_PARTIAL;
04418 }
04419
04420 if (ast_test_flag(p1, FLAG_HAS_DTMF) && (flags & AST_BRIDGE_DTMF_CHANNEL_1)) {
04421 ast_set_flag(p1, FLAG_P2P_NEED_DTMF);
04422 audio_p1_res = AST_RTP_TRY_PARTIAL;
04423 }
04424
04425
04426
04427
04428
04429
04430
04431
04432
04433
04434
04435
04436
04437
04438 if ((ast_test_flag(p0, FLAG_HAS_DTMF) != ast_test_flag(p1, FLAG_HAS_DTMF)) ||
04439 (!c0->tech->send_digit_begin != !c1->tech->send_digit_begin)) {
04440 if (!ast_test_flag(p0, FLAG_P2P_NEED_DTMF) || !ast_test_flag(p1, FLAG_P2P_NEED_DTMF)) {
04441 ast_channel_unlock(c0);
04442 ast_channel_unlock(c1);
04443 return AST_BRIDGE_FAILED_NOWARN;
04444 }
04445 audio_p0_res = AST_RTP_TRY_PARTIAL;
04446 audio_p1_res = AST_RTP_TRY_PARTIAL;
04447 }
04448
04449
04450 if ((audio_p0_res == AST_RTP_TRY_PARTIAL && ast_test_flag(p0, FLAG_P2P_NEED_DTMF)) ||
04451 (audio_p1_res == AST_RTP_TRY_PARTIAL && ast_test_flag(p1, FLAG_P2P_NEED_DTMF))) {
04452 ast_channel_unlock(c0);
04453 ast_channel_unlock(c1);
04454 return AST_BRIDGE_FAILED_NOWARN;
04455 }
04456
04457
04458 codec0 = pr0->get_codec ? pr0->get_codec(c0) : 0;
04459 codec1 = pr1->get_codec ? pr1->get_codec(c1) : 0;
04460 if (codec0 && codec1 && !(codec0 & codec1)) {
04461
04462 ast_debug(3, "Channel codec0 = %d is not codec1 = %d, cannot native bridge in RTP.\n", codec0, codec1);
04463 ast_channel_unlock(c0);
04464 ast_channel_unlock(c1);
04465 return AST_BRIDGE_FAILED_NOWARN;
04466 }
04467
04468
04469 if (audio_p0_res == AST_RTP_TRY_PARTIAL || audio_p1_res == AST_RTP_TRY_PARTIAL) {
04470 struct ast_format_list fmt0, fmt1;
04471
04472
04473 if (c0->rawreadformat != c1->rawwriteformat || c1->rawreadformat != c0->rawwriteformat) {
04474 ast_debug(1, "Cannot packet2packet bridge - raw formats are incompatible\n");
04475 ast_channel_unlock(c0);
04476 ast_channel_unlock(c1);
04477 return AST_BRIDGE_FAILED_NOWARN;
04478 }
04479
04480 fmt0 = ast_codec_pref_getsize(&p0->pref, c0->rawreadformat);
04481 fmt1 = ast_codec_pref_getsize(&p1->pref, c1->rawreadformat);
04482 if (fmt0.cur_ms != fmt1.cur_ms) {
04483 ast_debug(1, "Cannot packet2packet bridge - packetization settings prevent it\n");
04484 ast_channel_unlock(c0);
04485 ast_channel_unlock(c1);
04486 return AST_BRIDGE_FAILED_NOWARN;
04487 }
04488
04489 ast_verb(3, "Packet2Packet bridging %s and %s\n", c0->name, c1->name);
04490 res = bridge_p2p_loop(c0, c1, p0, p1, timeoutms, flags, fo, rc, pvt0, pvt1);
04491 } else {
04492 ast_verb(3, "Native bridging %s and %s\n", c0->name, c1->name);
04493 res = bridge_native_loop(c0, c1, p0, p1, vp0, vp1, tp0, tp1, pr0, pr1, codec0, codec1, timeoutms, flags, fo, rc, pvt0, pvt1);
04494 }
04495
04496 return res;
04497 }
04498
04499 static char *rtp_do_debug_ip(struct ast_cli_args *a, int deprecated)
04500 {
04501 struct hostent *hp;
04502 struct ast_hostent ahp;
04503 int port = 0;
04504 char *p, *arg;
04505
04506 if (deprecated == 1) {
04507 arg = a->argv[3];
04508 } else {
04509 arg = a->argv[4];
04510 }
04511 p = strstr(arg, ":");
04512 if (p) {
04513 *p = '\0';
04514 p++;
04515 port = atoi(p);
04516 }
04517 hp = ast_gethostbyname(arg, &ahp);
04518 if (hp == NULL) {
04519 ast_cli(a->fd, "Lookup failed for '%s'\n", arg);
04520 return CLI_FAILURE;
04521 }
04522 rtpdebugaddr.sin_family = AF_INET;
04523 memcpy(&rtpdebugaddr.sin_addr, hp->h_addr, sizeof(rtpdebugaddr.sin_addr));
04524 rtpdebugaddr.sin_port = htons(port);
04525 if (port == 0)
04526 ast_cli(a->fd, "RTP Debugging Enabled for IP: %s\n", ast_inet_ntoa(rtpdebugaddr.sin_addr));
04527 else
04528 ast_cli(a->fd, "RTP Debugging Enabled for IP: %s:%d\n", ast_inet_ntoa(rtpdebugaddr.sin_addr), port);
04529 rtpdebug = 1;
04530 return CLI_SUCCESS;
04531 }
04532
04533 static char *rtcp_do_debug_ip(struct ast_cli_args *a)
04534 {
04535 struct hostent *hp;
04536 struct ast_hostent ahp;
04537 int port = 0;
04538 char *p, *arg;
04539
04540 arg = a->argv[3];
04541 p = strstr(arg, ":");
04542 if (p) {
04543 *p = '\0';
04544 p++;
04545 port = atoi(p);
04546 }
04547 hp = ast_gethostbyname(arg, &ahp);
04548 if (hp == NULL) {
04549 ast_cli(a->fd, "Lookup failed for '%s'\n", arg);
04550 return CLI_FAILURE;
04551 }
04552 rtcpdebugaddr.sin_family = AF_INET;
04553 memcpy(&rtcpdebugaddr.sin_addr, hp->h_addr, sizeof(rtcpdebugaddr.sin_addr));
04554 rtcpdebugaddr.sin_port = htons(port);
04555 if (port == 0)
04556 ast_cli(a->fd, "RTCP Debugging Enabled for IP: %s\n", ast_inet_ntoa(rtcpdebugaddr.sin_addr));
04557 else
04558 ast_cli(a->fd, "RTCP Debugging Enabled for IP: %s:%d\n", ast_inet_ntoa(rtcpdebugaddr.sin_addr), port);
04559 rtcpdebug = 1;
04560 return CLI_SUCCESS;
04561 }
04562
04563 static char *handle_cli_rtp_debug_deprecated(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
04564 {
04565 switch (cmd) {
04566 case CLI_INIT:
04567 e->command = "rtp debug [off|ip]";
04568 e->usage =
04569 "Usage: rtp debug [off]|[ip host[:port]]\n"
04570 " Enable/Disable dumping of all RTP packets. If 'ip' is\n"
04571 " specified, limit the dumped packets to those to and from\n"
04572 " the specified 'host' with optional port.\n";
04573 return NULL;
04574 case CLI_GENERATE:
04575 return NULL;
04576 }
04577
04578 if (a->argc < 2 || a->argc > 4)
04579 return CLI_SHOWUSAGE;
04580 if (a->argc == 2) {
04581 rtpdebug = 1;
04582 memset(&rtpdebugaddr, 0, sizeof(rtpdebugaddr));
04583 ast_cli(a->fd, "RTP Debugging Enabled\n");
04584 } else if (a->argc == 3) {
04585 if (strncasecmp(a->argv[2], "off", 3))
04586 return CLI_SHOWUSAGE;
04587 rtpdebug = 0;
04588 ast_cli(a->fd, "RTP Debugging Disabled\n");
04589 } else {
04590 if (strncasecmp(a->argv[2], "ip", 2))
04591 return CLI_SHOWUSAGE;
04592 return rtp_do_debug_ip(a, 1);
04593 }
04594
04595 return CLI_SUCCESS;
04596 }
04597
04598 static char *handle_cli_rtp_set_debug(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
04599 {
04600 switch (cmd) {
04601 case CLI_INIT:
04602 e->command = "rtp set debug {on|off|ip}";
04603 e->usage =
04604 "Usage: rtp set debug {on|off|ip host[:port]}\n"
04605 " Enable/Disable dumping of all RTP packets. If 'ip' is\n"
04606 " specified, limit the dumped packets to those to and from\n"
04607 " the specified 'host' with optional port.\n";
04608 return NULL;
04609 case CLI_GENERATE:
04610 return NULL;
04611 }
04612
04613 if (a->argc == e->args) {
04614 if (!strncasecmp(a->argv[e->args-1], "on", 2)) {
04615 rtpdebug = 1;
04616 memset(&rtpdebugaddr, 0, sizeof(rtpdebugaddr));
04617 ast_cli(a->fd, "RTP Debugging Enabled\n");
04618 return CLI_SUCCESS;
04619 } else if (!strncasecmp(a->argv[e->args-1], "off", 3)) {
04620 rtpdebug = 0;
04621 ast_cli(a->fd, "RTP Debugging Disabled\n");
04622 return CLI_SUCCESS;
04623 }
04624 } else if (a->argc == e->args +1) {
04625 return rtp_do_debug_ip(a, 0);
04626 }
04627
04628 return CLI_SHOWUSAGE;
04629 }
04630
04631 static char *handle_cli_rtcp_debug_deprecated(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
04632 {
04633 switch (cmd) {
04634 case CLI_INIT:
04635 e->command = "rtcp debug [off|ip]";
04636 e->usage =
04637 "Usage: rtcp debug [off]|[ip host[:port]]\n"
04638 " Enable/Disable dumping of all RTCP packets. If 'ip' is\n"
04639 " specified, limit the dumped packets to those to and from\n"
04640 " the specified 'host' with optional port.\n";
04641 return NULL;
04642 case CLI_GENERATE:
04643 return NULL;
04644 }
04645
04646 if (a->argc < 2 || a->argc > 4)
04647 return CLI_SHOWUSAGE;
04648 if (a->argc == 2) {
04649 rtcpdebug = 1;
04650 memset(&rtcpdebugaddr, 0, sizeof(rtcpdebugaddr));
04651 ast_cli(a->fd, "RTCP Debugging Enabled\n");
04652 } else if (a->argc == 3) {
04653 if (strncasecmp(a->argv[2], "off", 3))
04654 return CLI_SHOWUSAGE;
04655 rtcpdebug = 0;
04656 ast_cli(a->fd, "RTCP Debugging Disabled\n");
04657 } else {
04658 if (strncasecmp(a->argv[2], "ip", 2))
04659 return CLI_SHOWUSAGE;
04660 return rtcp_do_debug_ip(a);
04661 }
04662
04663 return CLI_SUCCESS;
04664 }
04665
04666 static char *handle_cli_rtcp_set_debug(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
04667 {
04668 switch (cmd) {
04669 case CLI_INIT:
04670 e->command = "rtcp set debug {on|off|ip}";
04671 e->usage =
04672 "Usage: rtcp set debug {on|off|ip host[:port]}\n"
04673 " Enable/Disable dumping of all RTCP packets. If 'ip' is\n"
04674 " specified, limit the dumped packets to those to and from\n"
04675 " the specified 'host' with optional port.\n";
04676 return NULL;
04677 case CLI_GENERATE:
04678 return NULL;
04679 }
04680
04681 if (a->argc == e->args) {
04682 if (!strncasecmp(a->argv[e->args-1], "on", 2)) {
04683 rtcpdebug = 1;
04684 memset(&rtcpdebugaddr, 0, sizeof(rtcpdebugaddr));
04685 ast_cli(a->fd, "RTCP Debugging Enabled\n");
04686 return CLI_SUCCESS;
04687 } else if (!strncasecmp(a->argv[e->args-1], "off", 3)) {
04688 rtcpdebug = 0;
04689 ast_cli(a->fd, "RTCP Debugging Disabled\n");
04690 return CLI_SUCCESS;
04691 }
04692 } else if (a->argc == e->args +1) {
04693 return rtcp_do_debug_ip(a);
04694 }
04695
04696 return CLI_SHOWUSAGE;
04697 }
04698
04699 static char *handle_cli_rtcp_stats_deprecated(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
04700 {
04701 switch (cmd) {
04702 case CLI_INIT:
04703 e->command = "rtcp stats [off]";
04704 e->usage =
04705 "Usage: rtcp stats [off]\n"
04706 " Enable/Disable dumping of RTCP stats.\n";
04707 return NULL;
04708 case CLI_GENERATE:
04709 return NULL;
04710 }
04711
04712 if (a->argc < 2 || a->argc > 3)
04713 return CLI_SHOWUSAGE;
04714 if (a->argc == 3 && strncasecmp(a->argv[2], "off", 3))
04715 return CLI_SHOWUSAGE;
04716
04717 rtcpstats = (a->argc == 3) ? 0 : 1;
04718 ast_cli(a->fd, "RTCP Stats %s\n", rtcpstats ? "Enabled" : "Disabled");
04719 return CLI_SUCCESS;
04720 }
04721
04722 static char *handle_cli_rtcp_set_stats(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
04723 {
04724 switch (cmd) {
04725 case CLI_INIT:
04726 e->command = "rtcp set stats {on|off}";
04727 e->usage =
04728 "Usage: rtcp set stats {on|off}\n"
04729 " Enable/Disable dumping of RTCP stats.\n";
04730 return NULL;
04731 case CLI_GENERATE:
04732 return NULL;
04733 }
04734
04735 if (a->argc != e->args)
04736 return CLI_SHOWUSAGE;
04737
04738 if (!strncasecmp(a->argv[e->args-1], "on", 2))
04739 rtcpstats = 1;
04740 else if (!strncasecmp(a->argv[e->args-1], "off", 3))
04741 rtcpstats = 0;
04742 else
04743 return CLI_SHOWUSAGE;
04744
04745 ast_cli(a->fd, "RTCP Stats %s\n", rtcpstats ? "Enabled" : "Disabled");
04746 return CLI_SUCCESS;
04747 }
04748
04749 static char *handle_cli_stun_debug_deprecated(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
04750 {
04751 switch (cmd) {
04752 case CLI_INIT:
04753 e->command = "stun debug [off]";
04754 e->usage =
04755 "Usage: stun debug [off]\n"
04756 " Enable/Disable STUN (Simple Traversal of UDP through NATs)\n"
04757 " debugging\n";
04758 return NULL;
04759 case CLI_GENERATE:
04760 return NULL;
04761 }
04762
04763 if (a->argc < 2 || a->argc > 3)
04764 return CLI_SHOWUSAGE;
04765 if (a->argc == 3 && strncasecmp(a->argv[2], "off", 3))
04766 return CLI_SHOWUSAGE;
04767
04768 stundebug = (a->argc == 3) ? 0 : 1;
04769 ast_cli(a->fd, "STUN Debugging %s\n", stundebug ? "Enabled" : "Disabled");
04770 return CLI_SUCCESS;
04771 }
04772
04773 static char *handle_cli_stun_set_debug(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
04774 {
04775 switch (cmd) {
04776 case CLI_INIT:
04777 e->command = "stun set debug {on|off}";
04778 e->usage =
04779 "Usage: stun set debug {on|off}\n"
04780 " Enable/Disable STUN (Simple Traversal of UDP through NATs)\n"
04781 " debugging\n";
04782 return NULL;
04783 case CLI_GENERATE:
04784 return NULL;
04785 }
04786
04787 if (a->argc != e->args)
04788 return CLI_SHOWUSAGE;
04789
04790 if (!strncasecmp(a->argv[e->args-1], "on", 2))
04791 stundebug = 1;
04792 else if (!strncasecmp(a->argv[e->args-1], "off", 3))
04793 stundebug = 0;
04794 else
04795 return CLI_SHOWUSAGE;
04796
04797 ast_cli(a->fd, "STUN Debugging %s\n", stundebug ? "Enabled" : "Disabled");
04798 return CLI_SUCCESS;
04799 }
04800
04801 static struct ast_cli_entry cli_rtp_debug_deprecated = AST_CLI_DEFINE(handle_cli_rtp_debug_deprecated, "Enable/Disable RTP debugging");
04802 static struct ast_cli_entry cli_rtcp_debug_deprecated = AST_CLI_DEFINE(handle_cli_rtcp_debug_deprecated, "Enable/Disable RTCP debugging");
04803 static struct ast_cli_entry cli_rtcp_stats_deprecated = AST_CLI_DEFINE(handle_cli_rtcp_stats_deprecated, "Enable/Disable RTCP stats");
04804 static struct ast_cli_entry cli_stun_debug_deprecated = AST_CLI_DEFINE(handle_cli_stun_debug_deprecated, "Enable/Disable STUN debugging");
04805
04806 static struct ast_cli_entry cli_rtp[] = {
04807 AST_CLI_DEFINE(handle_cli_rtp_set_debug, "Enable/Disable RTP debugging", .deprecate_cmd = &cli_rtp_debug_deprecated),
04808 AST_CLI_DEFINE(handle_cli_rtcp_set_debug, "Enable/Disable RTCP debugging", .deprecate_cmd = &cli_rtcp_debug_deprecated),
04809 AST_CLI_DEFINE(handle_cli_rtcp_set_stats, "Enable/Disable RTCP stats", .deprecate_cmd = &cli_rtcp_stats_deprecated),
04810 AST_CLI_DEFINE(handle_cli_stun_set_debug, "Enable/Disable STUN debugging", .deprecate_cmd = &cli_stun_debug_deprecated),
04811 };
04812
04813 static int __ast_rtp_reload(int reload)
04814 {
04815 struct ast_config *cfg;
04816 const char *s;
04817 struct ast_flags config_flags = { reload ? CONFIG_FLAG_FILEUNCHANGED : 0 };
04818
04819 if ((cfg = ast_config_load2("rtp.conf", "rtp", config_flags)) == CONFIG_STATUS_FILEUNCHANGED)
04820 return 0;
04821
04822 rtpstart = 5000;
04823 rtpend = 31000;
04824 dtmftimeout = DEFAULT_DTMF_TIMEOUT;
04825 strictrtp = STRICT_RTP_OPEN;
04826 if (cfg) {
04827 if ((s = ast_variable_retrieve(cfg, "general", "rtpstart"))) {
04828 rtpstart = atoi(s);
04829 if (rtpstart < 1024)
04830 rtpstart = 1024;
04831 if (rtpstart > 65535)
04832 rtpstart = 65535;
04833 }
04834 if ((s = ast_variable_retrieve(cfg, "general", "rtpend"))) {
04835 rtpend = atoi(s);
04836 if (rtpend < 1024)
04837 rtpend = 1024;
04838 if (rtpend > 65535)
04839 rtpend = 65535;
04840 }
04841 if ((s = ast_variable_retrieve(cfg, "general", "rtcpinterval"))) {
04842 rtcpinterval = atoi(s);
04843 if (rtcpinterval == 0)
04844 rtcpinterval = 0;
04845 if (rtcpinterval < RTCP_MIN_INTERVALMS)
04846 rtcpinterval = RTCP_MIN_INTERVALMS;
04847 if (rtcpinterval > RTCP_MAX_INTERVALMS)
04848 rtcpinterval = RTCP_MAX_INTERVALMS;
04849 }
04850 if ((s = ast_variable_retrieve(cfg, "general", "rtpchecksums"))) {
04851 #ifdef SO_NO_CHECK
04852 if (ast_false(s))
04853 nochecksums = 1;
04854 else
04855 nochecksums = 0;
04856 #else
04857 if (ast_false(s))
04858 ast_log(LOG_WARNING, "Disabling RTP checksums is not supported on this operating system!\n");
04859 #endif
04860 }
04861 if ((s = ast_variable_retrieve(cfg, "general", "dtmftimeout"))) {
04862 dtmftimeout = atoi(s);
04863 if ((dtmftimeout < 0) || (dtmftimeout > 64000)) {
04864 ast_log(LOG_WARNING, "DTMF timeout of '%d' outside range, using default of '%d' instead\n",
04865 dtmftimeout, DEFAULT_DTMF_TIMEOUT);
04866 dtmftimeout = DEFAULT_DTMF_TIMEOUT;
04867 };
04868 }
04869 if ((s = ast_variable_retrieve(cfg, "general", "strictrtp"))) {
04870 strictrtp = ast_true(s);
04871 }
04872 ast_config_destroy(cfg);
04873 }
04874 if (rtpstart >= rtpend) {
04875 ast_log(LOG_WARNING, "Unreasonable values for RTP start/end port in rtp.conf\n");
04876 rtpstart = 5000;
04877 rtpend = 31000;
04878 }
04879 ast_verb(2, "RTP Allocating from port range %d -> %d\n", rtpstart, rtpend);
04880 return 0;
04881 }
04882
04883 int ast_rtp_reload(void)
04884 {
04885 return __ast_rtp_reload(1);
04886 }
04887
04888
04889 void ast_rtp_init(void)
04890 {
04891 ast_cli_register_multiple(cli_rtp, sizeof(cli_rtp) / sizeof(struct ast_cli_entry));
04892 __ast_rtp_reload(0);
04893 }
04894
04895
04896
04897
04898 static int red_write(const void *data)
04899 {
04900 struct ast_rtp *rtp = (struct ast_rtp*) data;
04901
04902 ast_rtp_write(rtp, &rtp->red->t140);
04903
04904 return 1;
04905 }
04906
04907
04908
04909
04910 static struct ast_frame *red_t140_to_red(struct rtp_red *red) {
04911 unsigned char *data = red->t140red.data.ptr;
04912 int len = 0;
04913 int i;
04914
04915
04916 if (red->len[0]) {
04917 for (i = 1; i < red->num_gen+1; i++)
04918 len += red->len[i];
04919
04920 memmove(&data[red->hdrlen], &data[red->hdrlen+red->len[0]], len);
04921 }
04922
04923
04924 for (i = 0; i < red->num_gen; i++)
04925 red->len[i] = red->len[i+1];
04926 red->len[i] = red->t140.datalen;
04927
04928
04929 len = red->hdrlen;
04930 for (i = 0; i < red->num_gen; i++)
04931 len += data[i*4+3] = red->len[i];
04932
04933
04934 memcpy(&data[len], red->t140.data.ptr, red->t140.datalen);
04935 red->t140red.datalen = len + red->t140.datalen;
04936
04937
04938 if (len == red->hdrlen && !red->t140.datalen)
04939 return NULL;
04940
04941
04942 red->t140.datalen = 0;
04943
04944 return &red->t140red;
04945 }
04946
04947
04948
04949
04950
04951
04952
04953
04954 int rtp_red_init(struct ast_rtp *rtp, int ti, int *red_data_pt, int num_gen)
04955 {
04956 struct rtp_red *r;
04957 int x;
04958
04959 if (!(r = ast_calloc(1, sizeof(struct rtp_red))))
04960 return -1;
04961
04962 r->t140.frametype = AST_FRAME_TEXT;
04963 r->t140.subclass = AST_FORMAT_T140RED;
04964 r->t140.data.ptr = &r->buf_data;
04965
04966 r->t140.ts = 0;
04967 r->t140red = r->t140;
04968 r->t140red.data.ptr = &r->t140red_data;
04969 r->t140red.datalen = 0;
04970 r->ti = ti;
04971 r->num_gen = num_gen;
04972 r->hdrlen = num_gen * 4 + 1;
04973 r->prev_ts = 0;
04974
04975 for (x = 0; x < num_gen; x++) {
04976 r->pt[x] = red_data_pt[x];
04977 r->pt[x] |= 1 << 7;
04978 r->t140red_data[x*4] = r->pt[x];
04979 }
04980 r->t140red_data[x*4] = r->pt[x] = red_data_pt[x];
04981 r->schedid = ast_sched_add(rtp->sched, ti, red_write, rtp);
04982 rtp->red = r;
04983
04984 r->t140.datalen = 0;
04985
04986 return 0;
04987 }
04988
04989
04990
04991
04992
04993 void red_buffer_t140(struct ast_rtp *rtp, struct ast_frame *f)
04994 {
04995 if (f->datalen > -1) {
04996 struct rtp_red *red = rtp->red;
04997 memcpy(&red->buf_data[red->t140.datalen], f->data.ptr, f->datalen);
04998 red->t140.datalen += f->datalen;
04999 red->t140.ts = f->ts;
05000 }
05001 }
05002