diff options
author | Joshua Colp <jcolp@digium.com> | 2006-07-10 19:39:47 +0000 |
---|---|---|
committer | Joshua Colp <jcolp@digium.com> | 2006-07-10 19:39:47 +0000 |
commit | 022957ce03d046a5193008c8ebe89179313ff1d6 (patch) | |
tree | bd987e34a23d0c6a41c86f85b3a005b32c14a1ec /channels | |
parent | 229ab7d9cff3ada2291308a868e79ee8c8c14deb (diff) |
Remove BRIDGE_OPTIMIZATION since it is deprecated or obsolete (take your pick)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@37346 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'channels')
-rw-r--r-- | channels/chan_iax2.c | 403 |
1 files changed, 108 insertions, 295 deletions
diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c index 8db81f071..97f87d51b 100644 --- a/channels/chan_iax2.c +++ b/channels/chan_iax2.c @@ -116,14 +116,6 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") static int nochecksums = 0; #endif -/* - * Uncomment to try experimental IAX bridge optimization, - * designed to reduce latency when IAX calls cannot - * be trasnferred -- obsolete - */ - -/* #define BRIDGE_OPTIMIZATION */ - #define PTR_TO_CALLNO(a) ((unsigned short)(unsigned long)(a)) #define CALLNO_TO_PTR(a) ((void *)(unsigned long)(a)) @@ -574,11 +566,9 @@ struct chan_iax2_pvt { /*! Status of knowledge of peer ADSI capability */ int peeradsicpe; - + /*! Who we are bridged to */ unsigned short bridgecallno; - unsigned int bridgesfmt; - struct ast_trans_pvt *bridgetrans; int pingid; /*!< Transmit PING request */ int lagid; /*!< Retransmit lag request */ @@ -892,15 +882,10 @@ static int send_ping(void *data) { int callno = (long)data; if (iaxs[callno]) { -#ifdef BRIDGE_OPTIMIZATION - if (!iaxs[callno]->bridgecallno) -#endif - { #ifdef SCHED_MULTITHREADED - if (schedule_action(__send_ping, data)) + if (schedule_action(__send_ping, data)) #endif - __send_ping(data); - } + __send_ping(data); return 1; } else return 0; @@ -930,15 +915,10 @@ static int send_lagrq(void *data) { int callno = (long)data; if (iaxs[callno]) { -#ifdef BRIDGE_OPTIMIZATION - if (!iaxs[callno]->bridgecallno) -#endif - { #ifdef SCHED_MULTITHREADED - if (schedule_action(__send_lagrq, data)) + if (schedule_action(__send_lagrq, data)) #endif - __send_lagrq(data); - } + __send_lagrq(data); return 1; } else return 0; @@ -1724,9 +1704,6 @@ retry: if (!owner) pvt->owner = NULL; iax2_destroy_helper(pvt); - if (pvt->bridgetrans) - ast_translator_free_path(pvt->bridgetrans); - pvt->bridgetrans = NULL; /* Already gone */ ast_set_flag(pvt, IAX_ALREADYGONE); @@ -2135,51 +2112,6 @@ static int iax2_show_cache(int fd, int argc, char *argv[]) static unsigned int calc_rxstamp(struct chan_iax2_pvt *p, unsigned int offset); -#ifdef BRIDGE_OPTIMIZATION -static unsigned int calc_fakestamp(struct chan_iax2_pvt *from, struct chan_iax2_pvt *to, unsigned int ts); - -static int forward_delivery(struct iax_frame *fr) -{ - struct chan_iax2_pvt *p1, *p2; - char iabuf[INET_ADDRSTRLEN]; - int res, orig_ts; - - p1 = iaxs[fr->callno]; - p2 = iaxs[p1->bridgecallno]; - if (!p1) - return -1; - if (!p2) - return -1; - - if (option_debug) - ast_log(LOG_DEBUG, "forward_delivery: Forwarding ts=%d on %d/%d to %d/%d on %s:%d\n", - fr->ts, - p1->callno, p1->peercallno, - p2->callno, p2->peercallno, - ast_inet_ntoa(iabuf, sizeof(iabuf), p2->addr.sin_addr), - ntohs(p2->addr.sin_port)); - - /* Undo wraparound - which can happen when full VOICE frame wasn't sent by our peer. - This is necessary for when our peer is chan_iax2.c v1.1nn or earlier which didn't - send full frame on timestamp wrap when doing optimized bridging - (actually current code STILL doesn't) - */ - if (fr->ts + 50000 <= p1->last) { - fr->ts = ( (p1->last & 0xFFFF0000) + 0x10000) | (fr->ts & 0xFFFF); - if (option_debug) - ast_log(LOG_DEBUG, "forward_delivery: pushed forward timestamp to %u\n", fr->ts); - } - - /* Send with timestamp adjusted to the origin of the outbound leg */ - /* But don't destroy inbound timestamp still needed later to set "last" */ - orig_ts = fr->ts; - fr->ts = calc_fakestamp(p1, p2, fr->ts); - res = iax2_send(p2, &fr->af, fr->ts, -1, 0, 0, 0); - fr->ts = orig_ts; - return res; -} -#endif - static void unwrap_timestamp(struct iax_frame *fr) { int x; @@ -3492,32 +3424,6 @@ static unsigned int calc_timestamp(struct chan_iax2_pvt *p, unsigned int ts, str return ms; } -#ifdef BRIDGE_OPTIMIZATION -static unsigned int calc_fakestamp(struct chan_iax2_pvt *p1, struct chan_iax2_pvt *p2, unsigned int fakets) -{ - int ms; - /* Receive from p1, send to p2 */ - - /* Setup rxcore if necessary on outgoing channel */ - if (ast_tvzero(p1->rxcore)) - p1->rxcore = ast_tvnow(); - - /* Setup txcore if necessary on outgoing channel */ - if (ast_tvzero(p2->offset)) - p2->offset = ast_tvnow(); - - /* Now, ts is the timestamp of the original packet in the orignal context. - Adding rxcore to it gives us when we would want the packet to be delivered normally. - Subtracting txcore of the outgoing channel gives us what we'd expect */ - - ms = ast_tvdiff_ms(p1->rxcore, p2->offset); - fakets += ms; - - p2->lastsent = fakets; - return fakets; -} -#endif - static unsigned int calc_rxstamp(struct chan_iax2_pvt *p, unsigned int offset) { /* Returns where in "receive time" we are. That is, how many ms @@ -4349,41 +4255,28 @@ static int iax2_show_channels(int fd, int argc, char *argv[]) for (x=0;x<IAX_MAX_CALLS;x++) { ast_mutex_lock(&iaxsl[x]); if (iaxs[x]) { -#ifdef BRIDGE_OPTIMIZATION - if (iaxs[x]->bridgecallno) - ast_cli(fd, FORMATB, - iaxs[x]->owner ? iaxs[x]->owner->name : "(None)", - ast_inet_ntoa(iabuf, sizeof(iabuf), iaxs[x]->addr.sin_addr), - S_OR(iaxs[x]->username, "(None)"), - iaxs[x]->callno, iaxs[x]->peercallno, - iaxs[x]->oseqno, iaxs[x]->iseqno, - iaxs[x]->bridgecallno ); - else -#endif - { - int lag, jitter, localdelay; - jb_info jbinfo; - - if(ast_test_flag(iaxs[x], IAX_USEJITTERBUF)) { - jb_getinfo(iaxs[x]->jb, &jbinfo); - jitter = jbinfo.jitter; - localdelay = jbinfo.current - jbinfo.min; - } else { - jitter = -1; - localdelay = 0; - } - lag = iaxs[x]->remote_rr.delay; - ast_cli(fd, FORMAT, - iaxs[x]->owner ? iaxs[x]->owner->name : "(None)", - ast_inet_ntoa(iabuf, sizeof(iabuf), iaxs[x]->addr.sin_addr), - S_OR(iaxs[x]->username, "(None)"), - iaxs[x]->callno, iaxs[x]->peercallno, - iaxs[x]->oseqno, iaxs[x]->iseqno, - lag, - jitter, - localdelay, - ast_getformatname(iaxs[x]->voiceformat) ); + int lag, jitter, localdelay; + jb_info jbinfo; + + if(ast_test_flag(iaxs[x], IAX_USEJITTERBUF)) { + jb_getinfo(iaxs[x]->jb, &jbinfo); + jitter = jbinfo.jitter; + localdelay = jbinfo.current - jbinfo.min; + } else { + jitter = -1; + localdelay = 0; } + lag = iaxs[x]->remote_rr.delay; + ast_cli(fd, FORMAT, + iaxs[x]->owner ? iaxs[x]->owner->name : "(None)", + ast_inet_ntoa(iabuf, sizeof(iabuf), iaxs[x]->addr.sin_addr), + S_OR(iaxs[x]->username, "(None)"), + iaxs[x]->callno, iaxs[x]->peercallno, + iaxs[x]->oseqno, iaxs[x]->iseqno, + lag, + jitter, + localdelay, + ast_getformatname(iaxs[x]->voiceformat) ); numchans++; } ast_mutex_unlock(&iaxsl[x]); @@ -4402,88 +4295,68 @@ static int ast_cli_netstats(struct mansession *s, int fd, int limit_fmt) for (x=0;x<IAX_MAX_CALLS;x++) { ast_mutex_lock(&iaxsl[x]); if (iaxs[x]) { -#ifdef BRIDGE_OPTIMIZATION - if (iaxs[x]->bridgecallno) { - if (limit_fmt) { - if (s) - astman_append(s, "%-25.25s <NATIVE BRIDGED>", - iaxs[x]->owner ? iaxs[x]->owner->name : "(None)"); - else - ast_cli(fd, "%-25.25s <NATIVE BRIDGED>", - iaxs[x]->owner ? iaxs[x]->owner->name : "(None)"); - } else { - if (s) - astman_append(s, "%s <NATIVE BRIDGED>", - iaxs[x]->owner ? iaxs[x]->owner->name : "(None)"); - else - ast_cli(fd, "%s <NATIVE BRIDGED>", - iaxs[x]->owner ? iaxs[x]->owner->name : "(None)"); - } else -#endif - { - int localjitter, localdelay, locallost, locallosspct, localdropped, localooo; - char *fmt; - jb_info jbinfo; - - if(ast_test_flag(iaxs[x], IAX_USEJITTERBUF)) { - jb_getinfo(iaxs[x]->jb, &jbinfo); - localjitter = jbinfo.jitter; - localdelay = jbinfo.current - jbinfo.min; - locallost = jbinfo.frames_lost; - locallosspct = jbinfo.losspct/1000; - localdropped = jbinfo.frames_dropped; - localooo = jbinfo.frames_ooo; - } else { - localjitter = -1; - localdelay = 0; - locallost = -1; - locallosspct = -1; - localdropped = 0; - localooo = -1; - } - if (limit_fmt) - fmt = "%-25.25s %4d %4d %4d %5d %3d %5d %4d %6d %4d %4d %5d %3d %5d %4d %6d\n"; - else - fmt = "%s %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n"; - if (s) - - astman_append(s, fmt, - iaxs[x]->owner ? iaxs[x]->owner->name : "(None)", - iaxs[x]->pingtime, - localjitter, - localdelay, - locallost, - locallosspct, - localdropped, - localooo, - iaxs[x]->frames_received/1000, - iaxs[x]->remote_rr.jitter, - iaxs[x]->remote_rr.delay, - iaxs[x]->remote_rr.losscnt, - iaxs[x]->remote_rr.losspct, - iaxs[x]->remote_rr.dropped, - iaxs[x]->remote_rr.ooo, - iaxs[x]->remote_rr.packets/1000); - else - ast_cli(fd, fmt, - iaxs[x]->owner ? iaxs[x]->owner->name : "(None)", - iaxs[x]->pingtime, - localjitter, - localdelay, - locallost, - locallosspct, - localdropped, - localooo, - iaxs[x]->frames_received/1000, - iaxs[x]->remote_rr.jitter, - iaxs[x]->remote_rr.delay, - iaxs[x]->remote_rr.losscnt, - iaxs[x]->remote_rr.losspct, - iaxs[x]->remote_rr.dropped, - iaxs[x]->remote_rr.ooo, - iaxs[x]->remote_rr.packets/1000 - ); + int localjitter, localdelay, locallost, locallosspct, localdropped, localooo; + char *fmt; + jb_info jbinfo; + + if(ast_test_flag(iaxs[x], IAX_USEJITTERBUF)) { + jb_getinfo(iaxs[x]->jb, &jbinfo); + localjitter = jbinfo.jitter; + localdelay = jbinfo.current - jbinfo.min; + locallost = jbinfo.frames_lost; + locallosspct = jbinfo.losspct/1000; + localdropped = jbinfo.frames_dropped; + localooo = jbinfo.frames_ooo; + } else { + localjitter = -1; + localdelay = 0; + locallost = -1; + locallosspct = -1; + localdropped = 0; + localooo = -1; } + if (limit_fmt) + fmt = "%-25.25s %4d %4d %4d %5d %3d %5d %4d %6d %4d %4d %5d %3d %5d %4d %6d\n"; + else + fmt = "%s %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n"; + if (s) + + astman_append(s, fmt, + iaxs[x]->owner ? iaxs[x]->owner->name : "(None)", + iaxs[x]->pingtime, + localjitter, + localdelay, + locallost, + locallosspct, + localdropped, + localooo, + iaxs[x]->frames_received/1000, + iaxs[x]->remote_rr.jitter, + iaxs[x]->remote_rr.delay, + iaxs[x]->remote_rr.losscnt, + iaxs[x]->remote_rr.losspct, + iaxs[x]->remote_rr.dropped, + iaxs[x]->remote_rr.ooo, + iaxs[x]->remote_rr.packets/1000); + else + ast_cli(fd, fmt, + iaxs[x]->owner ? iaxs[x]->owner->name : "(None)", + iaxs[x]->pingtime, + localjitter, + localdelay, + locallost, + locallosspct, + localdropped, + localooo, + iaxs[x]->frames_received/1000, + iaxs[x]->remote_rr.jitter, + iaxs[x]->remote_rr.delay, + iaxs[x]->remote_rr.losscnt, + iaxs[x]->remote_rr.losspct, + iaxs[x]->remote_rr.dropped, + iaxs[x]->remote_rr.ooo, + iaxs[x]->remote_rr.packets/1000 + ); numchans++; } ast_mutex_unlock(&iaxsl[x]); @@ -4616,13 +4489,6 @@ static int send_command_locked(unsigned short callno, char type, int command, un return res; } -#ifdef BRIDGE_OPTIMIZATION -static int forward_command(struct chan_iax2_pvt *i, char type, int command, unsigned int ts, const char *data, int datalen, int seqno) -{ - return __send_command(iaxs[i->bridgecallno], type, command, ts, data, datalen, seqno, 0, 0, 0); -} -#endif - static int send_command_final(struct chan_iax2_pvt *i, char type, int command, unsigned int ts, const unsigned char *data, int datalen, int seqno) { /* It is assumed that the callno has already been locked */ @@ -6411,21 +6277,10 @@ static int socket_process(struct iax2_thread *thread) f.samples = 0; fr->outoforder = 0; iax_frame_wrap(fr, &f); -#ifdef BRIDGE_OPTIMIZATION - if (iaxs[fr->callno]->bridgecallno) { - forward_delivery(fr); - } else { - duped_fr = iaxfrdup2(fr); - if (duped_fr) { - schedule_delivery(duped_fr, updatehistory, 1, &fr->ts); - } - } -#else duped_fr = iaxfrdup2(fr); if (duped_fr) { schedule_delivery(duped_fr, updatehistory, 1, &fr->ts); } -#endif if (iaxs[fr->callno]->last < fr->ts) { iaxs[fr->callno]->last = fr->ts; #if 1 @@ -7087,38 +6942,16 @@ retryowner2: send_command_final(iaxs[fr->callno], AST_FRAME_IAX, IAX_COMMAND_PONG, fr->ts, NULL, 0, -1); break; case IAX_COMMAND_PING: -#ifdef BRIDGE_OPTIMIZATION - if (iaxs[fr->callno]->bridgecallno) { - /* If we're in a bridged call, just forward this */ - forward_command(iaxs[fr->callno], AST_FRAME_IAX, IAX_COMMAND_PING, fr->ts, NULL, 0, -1); - } else { - struct iax_ie_data pingied; - construct_rr(iaxs[fr->callno], &pingied); - /* Send back a pong packet with the original timestamp */ - send_command(iaxs[fr->callno], AST_FRAME_IAX, IAX_COMMAND_PONG, fr->ts, pingied.buf, pingied.pos, -1); - } -#else - { - struct iax_ie_data pingied; - construct_rr(iaxs[fr->callno], &pingied); + { + struct iax_ie_data pingied; + construct_rr(iaxs[fr->callno], &pingied); /* Send back a pong packet with the original timestamp */ - send_command(iaxs[fr->callno], AST_FRAME_IAX, IAX_COMMAND_PONG, fr->ts, pingied.buf, pingied.pos, -1); - } -#endif + send_command(iaxs[fr->callno], AST_FRAME_IAX, IAX_COMMAND_PONG, fr->ts, pingied.buf, pingied.pos, -1); + } break; case IAX_COMMAND_PONG: -#ifdef BRIDGE_OPTIMIZATION - if (iaxs[fr->callno]->bridgecallno) { - /* Forward to the other side of the bridge */ - forward_command(iaxs[fr->callno], AST_FRAME_IAX, IAX_COMMAND_PONG, fr->ts, NULL, 0, -1); - } else { - /* Calculate ping time */ - iaxs[fr->callno]->pingtime = calc_timestamp(iaxs[fr->callno], 0, &f) - fr->ts; - } -#else /* Calculate ping time */ iaxs[fr->callno]->pingtime = calc_timestamp(iaxs[fr->callno], 0, &f) - fr->ts; -#endif /* save RR info */ save_rr(fr, &ies); @@ -7164,33 +6997,25 @@ retryowner2: break; case IAX_COMMAND_LAGRQ: case IAX_COMMAND_LAGRP: -#ifdef BRIDGE_OPTIMIZATION - if (iaxs[fr->callno]->bridgecallno) { - forward_command(iaxs[fr->callno], AST_FRAME_IAX, f.subclass, fr->ts, NULL, 0, -1); + f.src = "LAGRQ"; + f.mallocd = 0; + f.offset = 0; + f.samples = 0; + iax_frame_wrap(fr, &f); + if(f.subclass == IAX_COMMAND_LAGRQ) { + /* Received a LAGRQ - echo back a LAGRP */ + fr->af.subclass = IAX_COMMAND_LAGRP; + iax2_send(iaxs[fr->callno], &fr->af, fr->ts, -1, 0, 0, 0); } else { -#endif - f.src = "LAGRQ"; - f.mallocd = 0; - f.offset = 0; - f.samples = 0; - iax_frame_wrap(fr, &f); - if(f.subclass == IAX_COMMAND_LAGRQ) { - /* Received a LAGRQ - echo back a LAGRP */ - fr->af.subclass = IAX_COMMAND_LAGRP; - iax2_send(iaxs[fr->callno], &fr->af, fr->ts, -1, 0, 0, 0); - } else { - /* Received LAGRP in response to our LAGRQ */ - unsigned int ts; - /* This is a reply we've been given, actually measure the difference */ - ts = calc_timestamp(iaxs[fr->callno], 0, &fr->af); - iaxs[fr->callno]->lag = ts - fr->ts; - if (option_debug && iaxdebug) + /* Received LAGRP in response to our LAGRQ */ + unsigned int ts; + /* This is a reply we've been given, actually measure the difference */ + ts = calc_timestamp(iaxs[fr->callno], 0, &fr->af); + iaxs[fr->callno]->lag = ts - fr->ts; + if (option_debug && iaxdebug) ast_log(LOG_DEBUG, "Peer %s lag measured as %dms\n", - ast_inet_ntoa(iabuf, sizeof(iabuf), iaxs[fr->callno]->addr.sin_addr), iaxs[fr->callno]->lag); - } -#ifdef BRIDGE_OPTIMIZATION + ast_inet_ntoa(iabuf, sizeof(iabuf), iaxs[fr->callno]->addr.sin_addr), iaxs[fr->callno]->lag); } -#endif break; case IAX_COMMAND_AUTHREQ: if (ast_test_flag(&iaxs[fr->callno]->state, IAX_STATE_STARTED | IAX_STATE_TBD)) { @@ -7641,22 +7466,10 @@ retryowner2: ast_log(LOG_DEBUG, "Received out of order packet... (type=%d, subclass %d, ts = %d, last = %d)\n", f.frametype, f.subclass, fr->ts, iaxs[fr->callno]->last); fr->outoforder = -1; } -#ifdef BRIDGE_OPTIMIZATION - if (iaxs[fr->callno]->bridgecallno) { - forward_delivery(fr); - } else { - duped_fr = iaxfrdup2(fr); - if (duped_fr) { - schedule_delivery(duped_fr, updatehistory, 0, &fr->ts); - } - } -#else duped_fr = iaxfrdup2(fr); if (duped_fr) { schedule_delivery(duped_fr, updatehistory, 0, &fr->ts); } -#endif - if (iaxs[fr->callno]->last < fr->ts) { iaxs[fr->callno]->last = fr->ts; #if 1 |