2 * Asterisk -- A telephony toolkit for Linux.
4 * Implementation of Inter-Asterisk eXchange Version 2
6 * Copyright (C) 2003-2004, Digium, Inc.
8 * Mark Spencer <markster@digium.com>
10 * This program is free software, distributed under the terms of
11 * the GNU General Public License
14 #include <asterisk/lock.h>
15 #include <asterisk/frame.h>
16 #include <asterisk/channel.h>
17 #include <asterisk/channel_pvt.h>
18 #include <asterisk/config_pvt.h>
19 #include <asterisk/logger.h>
20 #include <asterisk/module.h>
21 #include <asterisk/pbx.h>
22 #include <asterisk/sched.h>
23 #include <asterisk/io.h>
24 #include <asterisk/config.h>
25 #include <asterisk/options.h>
26 #include <asterisk/cli.h>
27 #include <asterisk/translate.h>
28 #include <asterisk/md5.h>
29 #include <asterisk/cdr.h>
30 #include <asterisk/crypto.h>
31 #include <asterisk/acl.h>
32 #include <asterisk/manager.h>
33 #include <asterisk/callerid.h>
34 #include <asterisk/app.h>
35 #include <asterisk/astdb.h>
36 #include <asterisk/musiconhold.h>
37 #include <asterisk/features.h>
38 #include <asterisk/utils.h>
39 #include <asterisk/causes.h>
40 #include <asterisk/localtime.h>
42 #include <arpa/inet.h>
44 #include <sys/socket.h>
45 #include <netinet/in.h>
46 #include <netinet/in_systm.h>
47 #include <netinet/ip.h>
49 #include <sys/signal.h>
58 #include <sys/types.h>
61 #include <sys/ioctl.h>
63 #include <linux/zaptel.h>
66 #endif /* __linux__ */
69 #include "iax2-parser.h"
70 #include "iax2-provision.h"
71 #include "../astconf.h"
74 #define IPTOS_MINCOST 0x02
78 * Uncomment to try experimental IAX bridge optimization,
79 * designed to reduce latency when IAX calls cannot
83 #define BRIDGE_OPTIMIZATION
85 #define PTR_TO_CALLNO(a) ((unsigned short)(unsigned long)(a))
86 #define CALLNO_TO_PTR(a) ((void *)(unsigned long)(a))
88 #define DEFAULT_RETRY_TIME 1000
89 #define MEMORY_SIZE 100
90 #define DEFAULT_DROP 3
91 /* Flag to use with trunk calls, keeping these calls high up. It halves our effective use
92 but keeps the division between trunked and non-trunked better. */
93 #define TRUNK_CALL_START 0x4000
97 #define MIN_REUSE_TIME 60 /* Don't reuse a call number within 60 seconds */
99 /* Sample over last 100 units to determine historic jitter */
102 static char *desc = "Inter Asterisk eXchange (Ver 2)";
103 static char *tdesc = "Inter Asterisk eXchange Driver (Ver 2)";
104 static char *type = "IAX2";
106 static char context[80] = "default";
108 static char language[MAX_LANGUAGE] = "";
109 static char regcontext[AST_MAX_EXTENSION] = "";
111 static int max_retries = 4;
112 static int ping_time = 20;
113 static int lagrq_time = 10;
114 static int maxtrunkcall = TRUNK_CALL_START;
115 static int maxnontrunkcall = 1;
116 static int maxjitterbuffer=1000;
117 static int jittershrinkrate=2;
118 static int trunkfreq = 20;
119 static int authdebug = 1;
120 static int autokill = 0;
121 static int iaxcompat = 0;
123 static int iaxdefaultdpcache=10 * 60; /* Cache dialplan entries for 10 minutes by default */
125 static int iaxdefaulttimeout = 5; /* Default to wait no more than 5 seconds for a reply to come back */
127 static int netsocket = -1;
131 static int expirey = IAX_DEFAULT_REG_EXPIRE;
133 static int timingfd = -1; /* Timing file descriptor */
136 AST_MUTEX_DEFINE_STATIC(usecnt_lock);
138 int (*iax2_regfunk)(char *username, int onoff) = NULL;
141 #define IAX_CAPABILITY_FULLBANDWIDTH 0xFFFF
143 #define IAX_CAPABILITY_MEDBANDWIDTH (IAX_CAPABILITY_FULLBANDWIDTH & \
144 ~AST_FORMAT_SLINEAR & \
148 #define IAX_CAPABILITY_LOWBANDWIDTH (IAX_CAPABILITY_MEDBANDWIDTH & \
152 #define IAX_CAPABILITY_LOWFREE (IAX_CAPABILITY_LOWBANDWIDTH & \
156 #define DEFAULT_MAXMS 2000 /* Must be faster than 2 seconds by default */
157 #define DEFAULT_FREQ_OK 60 * 1000 /* How often to check for the host to be up */
158 #define DEFAULT_FREQ_NOTOK 10 * 1000 /* How often to check, if the host is down... */
160 static struct io_context *io;
161 static struct sched_context *sched;
163 static int iax2_capability = IAX_CAPABILITY_FULLBANDWIDTH;
165 static int iax2_dropcount = DEFAULT_DROP;
167 static int globalusejitterbuf = 0;
169 static int iaxdebug = 0;
171 static int iaxtrunkdebug = 0;
173 static char accountcode[20];
174 static int amaflags = 0;
175 static int globalnotransfer = 0;
176 static int delayreject = 0;
177 static int globalmessagedetail = 0;
179 static pthread_t netthreadid = AST_PTHREADT_NULL;
181 #define IAX_STATE_STARTED (1 << 0)
182 #define IAX_STATE_AUTHENTICATED (1 << 1)
183 #define IAX_STATE_TBD (1 << 2)
185 struct iax2_context {
186 char context[AST_MAX_EXTENSION];
187 struct iax2_context *next;
195 char accountcode[20];
196 char inkeys[80]; /* Key(s) this user can use to authenticate to us */
197 char language[MAX_LANGUAGE];
204 char cid_num[AST_MAX_EXTENSION];
205 char cid_name[AST_MAX_EXTENSION];
207 struct iax2_context *contexts;
208 struct iax2_user *next;
211 struct ast_variable *vars;
219 char outkey[80]; /* What key we use to talk to this peer */
220 char context[AST_MAX_EXTENSION]; /* For transfers only */
221 char regexten[AST_MAX_EXTENSION]; /* Extension to register (if regcontext is used) */
222 char peercontext[AST_MAX_EXTENSION]; /* Context to pass to peer */
223 char mailbox[AST_MAX_EXTENSION]; /* Mailbox */
224 struct sockaddr_in addr;
228 /* Dynamic Registration fields */
229 int dynamic; /* If this is a dynamic peer */
230 struct sockaddr_in defaddr; /* Default address if there is one */
231 int authmethods; /* Authentication methods (IAX_AUTH_*) */
232 char inkeys[80]; /* Key(s) this peer can use to authenticate to us */
235 /* Suggested caller id if registering */
236 char cid_num[AST_MAX_EXTENSION]; /* Default context (for transfer really) */
237 char cid_name[AST_MAX_EXTENSION]; /* Default context (for transfer really) */
238 /* Whether or not to send ANI */
240 int expire; /* Schedule entry for expirey */
241 int expirey; /* How soon to expire */
242 int capability; /* Capability */
243 int delme; /* I need to be deleted */
244 int temponly; /* I'm only a temp */
245 int trunk; /* Treat as an IAX trunking */
246 int messagedetail; /* Show exact numbers? */
247 char zonetag[80]; /* Time Zone */
250 int callno; /* Call number of POKE request */
251 int pokeexpire; /* When to expire poke */
252 int lastms; /* How long last response took (in ms), or -1 for no response */
253 int maxms; /* Max ms we will accept for the host to be up, 0 to not monitor */
256 struct iax2_peer *next;
261 #define IAX2_TRUNK_PREFACE (sizeof(struct iax_frame) + sizeof(struct ast_iax2_meta_hdr) + sizeof(struct ast_iax2_meta_trunk_hdr))
263 static struct iax2_trunk_peer {
265 struct sockaddr_in addr;
266 struct timeval txtrunktime; /* Transmit trunktime */
267 struct timeval rxtrunktime; /* Receive trunktime */
268 struct timeval lasttxtime; /* Last transmitted trunktime */
269 struct timeval trunkact; /* Last trunk activity */
270 unsigned int lastsent; /* Last sent time */
271 /* Trunk data and length */
272 unsigned char *trunkdata;
273 unsigned int trunkdatalen;
274 unsigned int trunkdataalloc;
275 struct iax2_trunk_peer *next;
280 AST_MUTEX_DEFINE_STATIC(tpeerlock);
282 struct iax_firmware {
283 struct iax_firmware *next;
287 struct ast_iax2_firmware_header *fwh;
291 #define REG_STATE_UNREGISTERED 0
292 #define REG_STATE_REGSENT 1
293 #define REG_STATE_AUTHSENT 2
294 #define REG_STATE_REGISTERED 3
295 #define REG_STATE_REJECTED 4
296 #define REG_STATE_TIMEOUT 5
297 #define REG_STATE_NOAUTH 6
299 #define TRANSFER_NONE 0
300 #define TRANSFER_BEGIN 1
301 #define TRANSFER_READY 2
302 #define TRANSFER_RELEASED 3
303 #define TRANSFER_PASSTHROUGH 4
305 struct iax2_registry {
306 struct sockaddr_in addr; /* Who we connect to for registration purposes */
308 char secret[80]; /* Password or key name in []'s */
310 int expire; /* Sched ID of expiration */
311 int refresh; /* How often to refresh */
313 int messages; /* Message count */
314 int callno; /* Associated call number if applicable */
315 struct sockaddr_in us; /* Who the server thinks we are */
316 struct iax2_registry *next;
319 static struct iax2_registry *registrations;
321 /* Don't retry more frequently than every 10 ms, or less frequently than every 5 seconds */
322 #define MIN_RETRY_TIME 100
323 #define MAX_RETRY_TIME 10000
325 #define MAX_JITTER_BUFFER 50
326 #define MIN_JITTER_BUFFER 10
328 #define DEFAULT_TRUNKDATA 640 * 10 /* 40ms, uncompressed linear * 10 channels */
329 #define MAX_TRUNKDATA 640 * 200 /* 40ms, uncompressed linear * 200 channels */
331 #define MAX_TIMESTAMP_SKEW 640
333 /* If consecutive voice frame timestamps jump by more than this many milliseconds, then jitter buffer will resync */
334 #define TS_GAP_FOR_JB_RESYNC 5000
336 /* If we have more than this much excess real jitter buffer, shrink it. */
337 static int max_jitter_buffer = MAX_JITTER_BUFFER;
338 /* If we have less than this much excess real jitter buffer, enlarge it. */
339 static int min_jitter_buffer = MIN_JITTER_BUFFER;
341 struct chan_iax2_pvt {
342 /* Pipes for communication. pipe[1] belongs to the
343 network thread (write), and pipe[0] belongs to the individual
345 /* Whether or not we Quelch audio */
347 /* Last received voice format */
349 /* Last received voice format */
351 /* Last sent voice format */
353 /* Last sent video format */
355 /* What we are capable of sending */
357 /* Last received timestamp */
359 /* Last sent timestamp - never send the same timestamp twice in a single call */
360 unsigned int lastsent;
361 /* Next outgoing timestamp if everything is good */
362 unsigned int nextpred;
364 unsigned int pingtime;
365 /* Max time for initial response */
368 struct sockaddr_in addr;
369 /* Our call number */
370 unsigned short callno;
372 unsigned short peercallno;
373 /* Peer selected format */
375 /* Peer capability */
377 /* timeval that we base our transmission on */
378 struct timeval offset;
379 /* timeval that we base our delivery on */
380 struct timeval rxcore;
381 /* Historical delivery time */
382 int history[MEMORY_SIZE];
383 /* Current base jitterbuffer */
385 /* Current jitter measure */
387 /* Historic jitter value */
391 /* Error, as discovered by the manager */
393 /* Owner if we have one */
394 struct ast_channel *owner;
395 /* What's our state? */
397 /* Expirey (optional) */
399 /* Next outgoing sequence number */
400 unsigned char oseqno;
401 /* Next sequence number they have not yet acknowledged */
402 unsigned char rseqno;
403 /* Next incoming sequence number */
404 unsigned char iseqno;
405 /* Last incoming sequence number we have acknowledged */
406 unsigned char aseqno;
409 /* Default Context */
411 /* Caller ID if available */
414 /* Hidden Caller ID (i.e. ANI) if appropriate */
416 /* Whether or not ani should be transmitted in addition to Caller*ID */
418 /* Whether to request autoanswer */
422 /* Requested Extension */
423 char exten[AST_MAX_EXTENSION];
424 /* Expected Username */
426 /* Expected Secret */
428 /* permitted authentication methods */
432 /* Public keys permitted keys for incoming authentication */
434 /* Private key for outgoing authentication */
436 /* Preferred language */
437 char language[MAX_LANGUAGE];
438 /* Hostname/peername for naming purposes */
440 /* Associated registry */
441 struct iax2_registry *reg;
442 /* Associated peer for poking */
443 struct iax2_peer *peerpoke;
445 /* Transferring status */
447 /* Transfer identifier */
449 /* Already disconnected */
451 /* Who we are IAX transfering to */
452 struct sockaddr_in transfer;
453 /* What's the new call number for the transfer */
454 unsigned short transfercallno;
456 /* Status of knowledge of peer ADSI capability */
459 /* Who we are bridged to */
460 unsigned short bridgecallno;
461 unsigned int bridgesfmt;
462 struct ast_trans_pvt *bridgetrans;
464 /* If this is a provisioning request */
467 int pingid; /* Transmit PING request */
468 int lagid; /* Retransmit lag request */
469 int autoid; /* Auto hangup for Dialplan requestor */
470 int authid; /* Authentication rejection ID */
471 int authfail; /* Reason to report failure */
472 int initid; /* Initial peer auto-congest ID (based on qualified peers) */
476 char dproot[AST_MAX_EXTENSION];
477 char accountcode[20];
479 /* This is part of a trunk interface */
481 struct iax2_dpcache *dpentries;
482 int notransfer; /* do we want native bridging */
483 int usejitterbuf; /* use jitter buffer on this channel? */
484 struct ast_variable *vars;
487 static struct ast_iax2_queue {
488 struct iax_frame *head;
489 struct iax_frame *tail;
494 static struct ast_user_list {
495 struct iax2_user *users;
499 static struct ast_peer_list {
500 struct iax2_peer *peers;
504 static struct ast_firmware_list {
505 struct iax_firmware *wares;
509 /* Extension exists */
510 #define CACHE_FLAG_EXISTS (1 << 0)
511 /* Extension is non-existant */
512 #define CACHE_FLAG_NONEXISTANT (1 << 1)
513 /* Extension can exist */
514 #define CACHE_FLAG_CANEXIST (1 << 2)
515 /* Waiting to hear back response */
516 #define CACHE_FLAG_PENDING (1 << 3)
518 #define CACHE_FLAG_TIMEOUT (1 << 4)
519 /* Request transmitted */
520 #define CACHE_FLAG_TRANSMITTED (1 << 5)
522 #define CACHE_FLAG_UNKNOWN (1 << 6)
524 #define CACHE_FLAG_MATCHMORE (1 << 7)
526 static struct iax2_dpcache {
527 char peercontext[AST_MAX_EXTENSION];
528 char exten[AST_MAX_EXTENSION];
530 struct timeval expirey;
532 unsigned short callno;
534 struct iax2_dpcache *next;
535 struct iax2_dpcache *peer; /* For linking in peers */
538 AST_MUTEX_DEFINE_STATIC(dpcache_lock);
540 static void iax_debug_output(const char *data)
543 ast_verbose("%s", data);
546 static void iax_error_output(const char *data)
548 ast_log(LOG_WARNING, "%s", data);
551 /* XXX We probably should use a mutex when working with this XXX */
552 static struct chan_iax2_pvt *iaxs[IAX_MAX_CALLS];
553 static ast_mutex_t iaxsl[IAX_MAX_CALLS];
554 static struct timeval lastused[IAX_MAX_CALLS];
557 static int send_command(struct chan_iax2_pvt *, char, int, unsigned int, char *, int, int);
558 static int send_command_locked(unsigned short callno, char, int, unsigned int, char *, int, int);
559 static int send_command_immediate(struct chan_iax2_pvt *, char, int, unsigned int, char *, int, int);
560 static int send_command_final(struct chan_iax2_pvt *, char, int, unsigned int, char *, int, int);
561 static int send_command_transfer(struct chan_iax2_pvt *, char, int, unsigned int, char *, int);
563 static unsigned int calc_timestamp(struct chan_iax2_pvt *p, unsigned int ts, struct ast_frame *f);
565 static int send_ping(void *data)
567 int callno = (long)data;
568 /* Ping only if it's real, not if it's bridged */
570 #ifdef BRIDGE_OPTIMIZATION
571 if (!iaxs[callno]->bridgecallno)
573 send_command(iaxs[callno], AST_FRAME_IAX, IAX_COMMAND_PING, 0, NULL, 0, -1);
579 static int send_lagrq(void *data)
581 int callno = (long)data;
582 /* Ping only if it's real not if it's bridged */
584 #ifdef BRIDGE_OPTIMIZATION
585 if (!iaxs[callno]->bridgecallno)
587 send_command(iaxs[callno], AST_FRAME_IAX, IAX_COMMAND_LAGRQ, 0, NULL, 0, -1);
593 static unsigned char compress_subclass(int subclass)
597 /* If it's 128 or smaller, just return it */
598 if (subclass < IAX_FLAG_SC_LOG)
600 /* Otherwise find its power */
601 for (x = 0; x < IAX_MAX_SHIFT; x++) {
602 if (subclass & (1 << x)) {
604 ast_log(LOG_WARNING, "Can't compress subclass %d\n", subclass);
610 return power | IAX_FLAG_SC_LOG;
613 static int uncompress_subclass(unsigned char csub)
615 /* If the SC_LOG flag is set, return 2^csub otherwise csub */
616 if (csub & IAX_FLAG_SC_LOG) {
617 /* special case for 'compressed' -1 */
621 return 1 << (csub & ~IAX_FLAG_SC_LOG & IAX_MAX_SHIFT);
627 static int iax2_getpeername(struct sockaddr_in sin, char *host, int len, int lockpeer)
629 struct iax2_peer *peer;
632 ast_mutex_lock(&peerl.lock);
635 if ((peer->addr.sin_addr.s_addr == sin.sin_addr.s_addr) &&
636 (peer->addr.sin_port == sin.sin_port)) {
637 strncpy(host, peer->name, len-1);
644 ast_mutex_unlock(&peerl.lock);
648 static struct chan_iax2_pvt *new_iax(struct sockaddr_in *sin, int lockpeer, const char *host)
650 struct chan_iax2_pvt *tmp;
651 tmp = malloc(sizeof(struct chan_iax2_pvt));
653 memset(tmp, 0, sizeof(struct chan_iax2_pvt));
656 tmp->transfercallno = 0;
657 tmp->bridgecallno = 0;
663 /* strncpy(tmp->context, context, sizeof(tmp->context)-1); */
664 strncpy(tmp->exten, "s", sizeof(tmp->exten)-1);
665 strncpy(tmp->host, host, sizeof(tmp->host)-1);
670 static int get_samples(struct ast_frame *f)
673 switch(f->subclass) {
674 case AST_FORMAT_SPEEX:
675 samples = 160; /* XXX Not necessarily true XXX */
677 case AST_FORMAT_G723_1:
678 samples = 240 /* XXX Not necessarily true XXX */;
680 case AST_FORMAT_ILBC:
681 samples = 240 * (f->datalen / 50);
684 samples = 160 * (f->datalen / 33);
686 case AST_FORMAT_G729A:
687 samples = 160 * (f->datalen / 20);
689 case AST_FORMAT_SLINEAR:
690 samples = f->datalen / 2;
692 case AST_FORMAT_LPC10:
694 samples += (((char *)(f->data))[7] & 0x1) * 8;
696 case AST_FORMAT_ULAW:
697 samples = f->datalen;
699 case AST_FORMAT_ALAW:
700 samples = f->datalen;
702 case AST_FORMAT_ADPCM:
703 case AST_FORMAT_G726:
704 samples = f->datalen *2;
707 ast_log(LOG_WARNING, "Don't know how to calculate samples on %d packets\n", f->subclass);
712 static struct iax_frame *iaxfrdup2(struct iax_frame *fr)
714 /* Malloc() a copy of a frame */
715 struct iax_frame *new = iax_frame_new(DIRECTION_INGRESS, fr->af.datalen);
717 memcpy(new, fr, sizeof(struct iax_frame));
718 iax_frame_wrap(new, &fr->af);
721 new->direction = DIRECTION_INGRESS;
727 #define NEW_PREVENT 0
731 static int match(struct sockaddr_in *sin, unsigned short callno, unsigned short dcallno, struct chan_iax2_pvt *cur)
733 if ((cur->addr.sin_addr.s_addr == sin->sin_addr.s_addr) &&
734 (cur->addr.sin_port == sin->sin_port)) {
735 /* This is the main host */
736 if ((cur->peercallno == callno) ||
737 ((dcallno == cur->callno) && !cur->peercallno)) {
738 /* That's us. Be sure we keep track of the peer call number */
742 if ((cur->transfer.sin_addr.s_addr == sin->sin_addr.s_addr) &&
743 (cur->transfer.sin_port == sin->sin_port) && (cur->transferring)) {
744 /* We're transferring */
745 if (dcallno == cur->callno)
751 static void update_max_trunk(void)
753 int max = TRUNK_CALL_START;
755 /* XXX Prolly don't need locks here XXX */
756 for (x=TRUNK_CALL_START;x<IAX_MAX_CALLS - 1; x++) {
762 ast_log(LOG_DEBUG, "New max trunk callno is %d\n", max);
765 static void update_max_nontrunk(void)
769 /* XXX Prolly don't need locks here XXX */
770 for (x=1;x<TRUNK_CALL_START - 1; x++) {
774 maxnontrunkcall = max;
776 ast_log(LOG_DEBUG, "New max nontrunk callno is %d\n", max);
779 static int make_trunk(unsigned short callno, int locked)
784 if (iaxs[callno]->oseqno) {
785 ast_log(LOG_WARNING, "Can't make trunk once a call has started!\n");
788 if (callno & TRUNK_CALL_START) {
789 ast_log(LOG_WARNING, "Call %d is already a trunk\n", callno);
792 gettimeofday(&now, NULL);
793 for (x=TRUNK_CALL_START;x<IAX_MAX_CALLS - 1; x++) {
794 ast_mutex_lock(&iaxsl[x]);
795 if (!iaxs[x] && ((now.tv_sec - lastused[x].tv_sec) > MIN_REUSE_TIME)) {
796 iaxs[x] = iaxs[callno];
799 /* Update the two timers that should have been started */
800 if (iaxs[x]->pingid > -1)
801 ast_sched_del(sched, iaxs[x]->pingid);
802 if (iaxs[x]->lagid > -1)
803 ast_sched_del(sched, iaxs[x]->lagid);
804 iaxs[x]->pingid = ast_sched_add(sched, ping_time * 1000, send_ping, (void *)(long)x);
805 iaxs[x]->lagid = ast_sched_add(sched, lagrq_time * 1000, send_lagrq, (void *)(long)x);
807 ast_mutex_unlock(&iaxsl[callno]);
810 ast_mutex_unlock(&iaxsl[x]);
813 ast_mutex_unlock(&iaxsl[x]);
815 if (x >= IAX_MAX_CALLS - 1) {
816 ast_log(LOG_WARNING, "Unable to trunk call: Insufficient space\n");
819 ast_log(LOG_DEBUG, "Made call %d into trunk call %d\n", callno, x);
820 /* We move this call from a non-trunked to a trunked call */
822 update_max_nontrunk();
826 static int find_callno(unsigned short callno, unsigned short dcallno, struct sockaddr_in *sin, int new, int lockpeer)
831 char iabuf[INET_ADDRSTRLEN];
833 if (new <= NEW_ALLOW) {
834 /* Look for an existing connection first */
835 for (x=1;(res < 1) && (x<maxnontrunkcall);x++) {
836 ast_mutex_lock(&iaxsl[x]);
838 /* Look for an exact match */
839 if (match(sin, callno, dcallno, iaxs[x])) {
843 ast_mutex_unlock(&iaxsl[x]);
845 for (x=TRUNK_CALL_START;(res < 1) && (x<maxtrunkcall);x++) {
846 ast_mutex_lock(&iaxsl[x]);
848 /* Look for an exact match */
849 if (match(sin, callno, dcallno, iaxs[x])) {
853 ast_mutex_unlock(&iaxsl[x]);
856 if ((res < 1) && (new >= NEW_ALLOW)) {
857 if (!iax2_getpeername(*sin, host, sizeof(host), lockpeer))
858 snprintf(host, sizeof(host), "%s:%d", ast_inet_ntoa(iabuf, sizeof(iabuf), sin->sin_addr), ntohs(sin->sin_port));
859 gettimeofday(&now, NULL);
860 for (x=1;x<TRUNK_CALL_START;x++) {
861 /* Find first unused call number that hasn't been used in a while */
862 ast_mutex_lock(&iaxsl[x]);
863 if (!iaxs[x] && ((now.tv_sec - lastused[x].tv_sec) > MIN_REUSE_TIME)) break;
864 ast_mutex_unlock(&iaxsl[x]);
866 /* We've still got lock held if we found a spot */
867 if (x >= TRUNK_CALL_START) {
868 ast_log(LOG_WARNING, "No more space\n");
871 iaxs[x] = new_iax(sin, lockpeer, host);
872 update_max_nontrunk();
875 ast_log(LOG_DEBUG, "Creating new call structure %d\n", x);
876 iaxs[x]->addr.sin_port = sin->sin_port;
877 iaxs[x]->addr.sin_family = sin->sin_family;
878 iaxs[x]->addr.sin_addr.s_addr = sin->sin_addr.s_addr;
879 iaxs[x]->peercallno = callno;
881 iaxs[x]->pingtime = DEFAULT_RETRY_TIME;
882 iaxs[x]->expirey = expirey;
883 iaxs[x]->pingid = ast_sched_add(sched, ping_time * 1000, send_ping, (void *)(long)x);
884 iaxs[x]->lagid = ast_sched_add(sched, lagrq_time * 1000, send_lagrq, (void *)(long)x);
885 iaxs[x]->amaflags = amaflags;
886 iaxs[x]->notransfer = globalnotransfer;
887 iaxs[x]->usejitterbuf = globalusejitterbuf;
888 strncpy(iaxs[x]->accountcode, accountcode, sizeof(iaxs[x]->accountcode)-1);
890 ast_log(LOG_WARNING, "Out of resources\n");
891 ast_mutex_unlock(&iaxsl[x]);
894 ast_mutex_unlock(&iaxsl[x]);
900 static void iax2_frame_free(struct iax_frame *fr)
902 if (fr->retrans > -1)
903 ast_sched_del(sched, fr->retrans);
907 static int iax2_queue_frame(int callno, struct ast_frame *f)
909 /* Assumes lock for callno is already held... */
911 if (iaxs[callno] && iaxs[callno]->owner) {
912 if (ast_mutex_trylock(&iaxs[callno]->owner->lock)) {
913 /* Avoid deadlock by pausing and trying again */
914 ast_mutex_unlock(&iaxsl[callno]);
916 ast_mutex_lock(&iaxsl[callno]);
918 ast_queue_frame(iaxs[callno]->owner, f);
919 ast_mutex_unlock(&iaxs[callno]->owner->lock);
928 static void destroy_firmware(struct iax_firmware *cur)
932 munmap(cur->fwh, ntohl(cur->fwh->datalen) + sizeof(*(cur->fwh)));
938 static int try_firmware(char *s)
941 struct iax_firmware *cur;
946 struct ast_iax2_firmware_header *fwh, fwh2;
947 struct MD5Context md5;
948 unsigned char sum[16];
949 unsigned char buf[1024];
953 s2 = alloca(strlen(s) + 100);
955 ast_log(LOG_WARNING, "Alloca failed!\n");
958 last = strrchr(s, '/');
963 snprintf(s2, strlen(s) + 100, "/var/tmp/%s-%ld", last, (unsigned long)rand());
964 res = stat(s, &stbuf);
966 ast_log(LOG_WARNING, "Failed to stat '%s': %s\n", s, strerror(errno));
969 /* Make sure it's not a directory */
970 if (S_ISDIR(stbuf.st_mode))
972 ifd = open(s, O_RDONLY);
974 ast_log(LOG_WARNING, "Cannot open '%s': %s\n", s, strerror(errno));
977 fd = open(s2, O_RDWR | O_CREAT | O_EXCL);
979 ast_log(LOG_WARNING, "Cannot open '%s' for writing: %s\n", s2, strerror(errno));
983 /* Unlink our newly created file */
986 /* Now copy the firmware into it */
990 if (chunk > sizeof(buf))
992 res = read(ifd, buf, chunk);
994 ast_log(LOG_WARNING, "Only read %d of %d bytes of data :(: %s\n", res, chunk, strerror(errno));
999 res = write(fd, buf, chunk);
1001 ast_log(LOG_WARNING, "Only write %d of %d bytes of data :(: %s\n", res, chunk, strerror(errno));
1009 /* Return to the beginning */
1010 lseek(fd, 0, SEEK_SET);
1011 if ((res = read(fd, &fwh2, sizeof(fwh2))) != sizeof(fwh2)) {
1012 ast_log(LOG_WARNING, "Unable to read firmware header in '%s'\n", s);
1016 if (ntohl(fwh2.magic) != IAX_FIRMWARE_MAGIC) {
1017 ast_log(LOG_WARNING, "'%s' is not a valid firmware file\n", s);
1021 if (ntohl(fwh2.datalen) != (stbuf.st_size - sizeof(fwh2))) {
1022 ast_log(LOG_WARNING, "Invalid data length in firmware '%s'\n", s);
1026 if (fwh2.devname[sizeof(fwh2.devname) - 1] || ast_strlen_zero(fwh2.devname)) {
1027 ast_log(LOG_WARNING, "No or invalid device type specified for '%s'\n", s);
1031 fwh = mmap(NULL, stbuf.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
1033 ast_log(LOG_WARNING, "mmap failed: %s\n", strerror(errno));
1038 MD5Update(&md5, fwh->data, ntohl(fwh->datalen));
1039 MD5Final(sum, &md5);
1040 if (memcmp(sum, fwh->chksum, sizeof(sum))) {
1041 ast_log(LOG_WARNING, "Firmware file '%s' fails checksum\n", s);
1042 munmap(fwh, stbuf.st_size);
1048 if (!strcmp(cur->fwh->devname, fwh->devname)) {
1049 /* Found a candidate */
1050 if (cur->dead || (ntohs(cur->fwh->version) < ntohs(fwh->version)))
1051 /* The version we have on loaded is older, load this one instead */
1053 /* This version is no newer than what we have. Don't worry about it.
1054 We'll consider it a proper load anyhow though */
1055 munmap(fwh, stbuf.st_size);
1062 /* Allocate a new one and link it */
1063 cur = malloc(sizeof(struct iax_firmware));
1065 memset(cur, 0, sizeof(struct iax_firmware));
1067 cur->next = waresl.wares;
1073 munmap(cur->fwh, cur->mmaplen);
1079 cur->mmaplen = stbuf.st_size;
1085 static int iax_check_version(char *dev)
1088 struct iax_firmware *cur;
1089 if (dev && !ast_strlen_zero(dev)) {
1090 ast_mutex_lock(&waresl.lock);
1093 if (!strcmp(dev, cur->fwh->devname)) {
1094 res = ntohs(cur->fwh->version);
1099 ast_mutex_unlock(&waresl.lock);
1104 static int iax_firmware_append(struct iax_ie_data *ied, const unsigned char *dev, unsigned int desc)
1107 unsigned int bs = desc & 0xff;
1108 unsigned int start = (desc >> 8) & 0xffffff;
1110 struct iax_firmware *cur;
1111 if (dev && !ast_strlen_zero(dev) && bs) {
1113 ast_mutex_lock(&waresl.lock);
1116 if (!strcmp(dev, cur->fwh->devname)) {
1117 iax_ie_append_int(ied, IAX_IE_FWBLOCKDESC, desc);
1118 if (start < ntohl(cur->fwh->datalen)) {
1119 bytes = ntohl(cur->fwh->datalen) - start;
1122 iax_ie_append_raw(ied, IAX_IE_FWBLOCKDATA, cur->fwh->data + start, bytes);
1125 iax_ie_append(ied, IAX_IE_FWBLOCKDATA);
1135 ast_mutex_unlock(&waresl.lock);
1141 static void reload_firmware(void)
1143 struct iax_firmware *cur, *curl, *curp;
1148 /* Mark all as dead */
1149 ast_mutex_lock(&waresl.lock);
1155 /* Now that we've freed them, load the new ones */
1156 snprintf(dir, sizeof(dir), "%s/firmware/iax", (char *)ast_config_AST_VAR_DIR);
1159 while((de = readdir(fwd))) {
1160 if (de->d_name[0] != '.') {
1161 snprintf(fn, sizeof(fn), "%s/%s", dir, de->d_name);
1162 if (!try_firmware(fn)) {
1163 if (option_verbose > 1)
1164 ast_verbose(VERBOSE_PREFIX_2 "Loaded firmware '%s'\n", de->d_name);
1170 ast_log(LOG_WARNING, "Error opening firmware directory '%s': %s\n", dir, strerror(errno));
1172 /* Clean up leftovers */
1184 destroy_firmware(curl);
1189 ast_mutex_unlock(&waresl.lock);
1192 static int iax2_send(struct chan_iax2_pvt *pvt, struct ast_frame *f, unsigned int ts, int seqno, int now, int transfer, int final);
1194 static int __do_deliver(void *data)
1196 /* Just deliver the packet by using queueing. This is called by
1197 the IAX thread with the iaxsl lock held. */
1198 struct iax_frame *fr = data;
1200 if (iaxs[fr->callno] && !iaxs[fr->callno]->alreadygone)
1201 iax2_queue_frame(fr->callno, &fr->af);
1202 /* Free our iax frame */
1203 iax2_frame_free(fr);
1204 /* And don't run again */
1208 static int do_deliver(void *data)
1210 /* Locking version of __do_deliver */
1211 struct iax_frame *fr = data;
1212 int callno = fr->callno;
1214 ast_mutex_lock(&iaxsl[callno]);
1215 res = __do_deliver(data);
1216 ast_mutex_unlock(&iaxsl[callno]);
1220 static int handle_error(void)
1222 /* XXX Ideally we should figure out why an error occured and then abort those
1223 rather than continuing to try. Unfortunately, the published interface does
1224 not seem to work XXX */
1226 struct sockaddr_in *sin;
1229 struct sock_extended_err e;
1234 m.msg_controllen = sizeof(e);
1236 res = recvmsg(netsocket, &m, MSG_ERRQUEUE);
1238 ast_log(LOG_WARNING, "Error detected, but unable to read error: %s\n", strerror(errno));
1240 if (m.msg_controllen) {
1241 sin = (struct sockaddr_in *)SO_EE_OFFENDER(&e);
1243 ast_log(LOG_WARNING, "Receive error from %s\n", ast_inet_ntoa(iabuf, sizeof(iabuf), sin->sin_addr));
1245 ast_log(LOG_WARNING, "No address detected??\n");
1247 ast_log(LOG_WARNING, "Local error: %s\n", strerror(e.ee_errno));
1254 static int transmit_trunk(struct iax_frame *f, struct sockaddr_in *sin)
1257 res = sendto(netsocket, f->data, f->datalen, 0,(struct sockaddr *)sin,
1261 ast_log(LOG_DEBUG, "Received error: %s\n", strerror(errno));
1268 static int send_packet(struct iax_frame *f)
1271 char iabuf[INET_ADDRSTRLEN];
1272 /* Called with iaxsl held */
1274 ast_log(LOG_DEBUG, "Sending %d on %d/%d to %s:%d\n", f->ts, f->callno, iaxs[f->callno]->peercallno, ast_inet_ntoa(iabuf, sizeof(iabuf), iaxs[f->callno]->addr.sin_addr), ntohs(iaxs[f->callno]->addr.sin_port));
1275 /* Don't send if there was an error, but return error instead */
1277 ast_log(LOG_WARNING, "Call number = %d\n", f->callno);
1280 if (!iaxs[f->callno])
1282 if (iaxs[f->callno]->error)
1286 iax_showframe(f, NULL, 0, &iaxs[f->callno]->transfer, f->datalen - sizeof(struct ast_iax2_full_hdr));
1287 res = sendto(netsocket, f->data, f->datalen, 0,(struct sockaddr *)&iaxs[f->callno]->transfer,
1288 sizeof(iaxs[f->callno]->transfer));
1291 iax_showframe(f, NULL, 0, &iaxs[f->callno]->addr, f->datalen - sizeof(struct ast_iax2_full_hdr));
1292 res = sendto(netsocket, f->data, f->datalen, 0,(struct sockaddr *)&iaxs[f->callno]->addr,
1293 sizeof(iaxs[f->callno]->addr));
1297 ast_log(LOG_DEBUG, "Received error: %s\n", strerror(errno));
1305 static int iax2_predestroy(int callno)
1307 struct ast_channel *c;
1308 struct chan_iax2_pvt *pvt;
1309 ast_mutex_lock(&iaxsl[callno]);
1312 ast_mutex_unlock(&iaxsl[callno]);
1315 if (!pvt->alreadygone) {
1316 /* No more pings or lagrq's */
1317 if (pvt->pingid > -1)
1318 ast_sched_del(sched, pvt->pingid);
1319 if (pvt->lagid > -1)
1320 ast_sched_del(sched, pvt->lagid);
1321 if (pvt->autoid > -1)
1322 ast_sched_del(sched, pvt->autoid);
1323 if (pvt->authid > -1)
1324 ast_sched_del(sched, pvt->authid);
1325 if (pvt->initid > -1)
1326 ast_sched_del(sched, pvt->initid);
1332 pvt->alreadygone = 1;
1336 c->_softhangup |= AST_SOFTHANGUP_DEV;
1338 ast_queue_hangup(c);
1340 ast_mutex_lock(&usecnt_lock);
1343 ast_log(LOG_WARNING, "Usecnt < 0???\n");
1344 ast_mutex_unlock(&usecnt_lock);
1346 ast_mutex_unlock(&iaxsl[callno]);
1347 ast_update_use_count();
1351 static int iax2_predestroy_nolock(int callno)
1354 ast_mutex_unlock(&iaxsl[callno]);
1355 res = iax2_predestroy(callno);
1356 ast_mutex_lock(&iaxsl[callno]);
1360 static void iax2_destroy(int callno)
1362 struct chan_iax2_pvt *pvt;
1363 struct iax_frame *cur;
1364 struct ast_channel *owner;
1367 ast_mutex_lock(&iaxsl[callno]);
1369 gettimeofday(&lastused[callno], NULL);
1376 if (ast_mutex_trylock(&owner->lock)) {
1377 ast_log(LOG_NOTICE, "Avoiding IAX destroy deadlock\n");
1378 ast_mutex_unlock(&iaxsl[callno]);
1384 iaxs[callno] = NULL;
1388 /* No more pings or lagrq's */
1389 if (pvt->pingid > -1)
1390 ast_sched_del(sched, pvt->pingid);
1391 if (pvt->lagid > -1)
1392 ast_sched_del(sched, pvt->lagid);
1393 if (pvt->autoid > -1)
1394 ast_sched_del(sched, pvt->autoid);
1395 if (pvt->authid > -1)
1396 ast_sched_del(sched, pvt->authid);
1397 if (pvt->initid > -1)
1398 ast_sched_del(sched, pvt->initid);
1404 if (pvt->bridgetrans)
1405 ast_translator_free_path(pvt->bridgetrans);
1406 pvt->bridgetrans = NULL;
1409 pvt->alreadygone = 1;
1412 /* If there's an owner, prod it to give up */
1413 owner->_softhangup |= AST_SOFTHANGUP_DEV;
1414 ast_queue_hangup(owner);
1417 for (cur = iaxq.head; cur ; cur = cur->next) {
1418 /* Cancel any pending transmissions */
1419 if (cur->callno == pvt->callno)
1423 pvt->reg->callno = 0;
1427 ast_destroy_realtime(pvt->vars);
1434 ast_mutex_unlock(&owner->lock);
1436 ast_mutex_unlock(&iaxsl[callno]);
1437 if (callno & 0x4000)
1440 static void iax2_destroy_nolock(int callno)
1442 /* Actually it's easier to unlock, kill it, and relock */
1443 ast_mutex_unlock(&iaxsl[callno]);
1444 iax2_destroy(callno);
1445 ast_mutex_lock(&iaxsl[callno]);
1448 static int update_packet(struct iax_frame *f)
1450 /* Called with iaxsl lock held, and iaxs[callno] non-NULL */
1451 struct ast_iax2_full_hdr *fh = f->data;
1452 /* Mark this as a retransmission */
1453 fh->dcallno = ntohs(IAX_FLAG_RETRANS | f->dcallno);
1455 f->iseqno = iaxs[f->callno]->iseqno;
1456 fh->iseqno = f->iseqno;
1460 static int attempt_transmit(void *data)
1462 /* Attempt to transmit the frame to the remote peer...
1463 Called without iaxsl held. */
1464 struct iax_frame *f = data;
1466 int callno = f->callno;
1467 char iabuf[INET_ADDRSTRLEN];
1468 /* Make sure this call is still active */
1470 ast_mutex_lock(&iaxsl[callno]);
1471 if ((f->callno) && iaxs[f->callno]) {
1472 if ((f->retries < 0) /* Already ACK'd */ ||
1473 (f->retries >= max_retries) /* Too many attempts */) {
1474 /* Record an error if we've transmitted too many times */
1475 if (f->retries >= max_retries) {
1477 /* Transfer timeout */
1478 send_command(iaxs[f->callno], AST_FRAME_IAX, IAX_COMMAND_TXREJ, 0, NULL, 0, -1);
1479 } else if (f->final) {
1481 iax2_destroy_nolock(f->callno);
1483 if (iaxs[f->callno]->owner)
1484 ast_log(LOG_WARNING, "Max retries exceeded to host %s on %s (type = %d, subclass = %d, ts=%d, seqno=%d)\n", ast_inet_ntoa(iabuf, sizeof(iabuf), iaxs[f->callno]->addr.sin_addr),iaxs[f->callno]->owner->name , f->af.frametype, f->af.subclass, f->ts, f->oseqno);
1485 iaxs[f->callno]->error = ETIMEDOUT;
1486 if (iaxs[f->callno]->owner) {
1487 struct ast_frame fr = { 0, };
1489 fr.frametype = AST_FRAME_CONTROL;
1490 fr.subclass = AST_CONTROL_HANGUP;
1491 iax2_queue_frame(f->callno, &fr);
1493 if (iaxs[f->callno]->reg) {
1494 memset(&iaxs[f->callno]->reg->us, 0, sizeof(iaxs[f->callno]->reg->us));
1495 iaxs[f->callno]->reg->regstate = REG_STATE_TIMEOUT;
1496 iaxs[f->callno]->reg->refresh = IAX_DEFAULT_REG_EXPIRE;
1498 iax2_destroy_nolock(f->callno);
1505 /* Update it if it needs it */
1507 /* Attempt transmission */
1510 /* Try again later after 10 times as long */
1512 if (f->retrytime > MAX_RETRY_TIME)
1513 f->retrytime = MAX_RETRY_TIME;
1514 /* Transfer messages max out at one second */
1515 if (f->transfer && (f->retrytime > 1000))
1516 f->retrytime = 1000;
1517 f->retrans = ast_sched_add(sched, f->retrytime, attempt_transmit, f);
1520 /* Make sure it gets freed */
1525 ast_mutex_unlock(&iaxsl[callno]);
1526 /* Do not try again */
1528 /* Don't attempt delivery, just remove it from the queue */
1529 ast_mutex_lock(&iaxq.lock);
1531 f->prev->next = f->next;
1533 iaxq.head = f->next;
1535 f->next->prev = f->prev;
1537 iaxq.tail = f->prev;
1539 ast_mutex_unlock(&iaxq.lock);
1541 /* Free the IAX frame */
1547 static int iax2_set_jitter(int fd, int argc, char *argv[])
1549 if ((argc != 4) && (argc != 5))
1550 return RESULT_SHOWUSAGE;
1552 max_jitter_buffer = atoi(argv[3]);
1553 if (max_jitter_buffer < 0)
1554 max_jitter_buffer = 0;
1557 if ((atoi(argv[3]) >= 0) && (atoi(argv[3]) < IAX_MAX_CALLS)) {
1558 if (iaxs[atoi(argv[3])]) {
1559 iaxs[atoi(argv[3])]->jitterbuffer = atoi(argv[4]);
1560 if (iaxs[atoi(argv[3])]->jitterbuffer < 0)
1561 iaxs[atoi(argv[3])]->jitterbuffer = 0;
1563 ast_cli(fd, "No such call '%d'\n", atoi(argv[3]));
1565 ast_cli(fd, "%d is not a valid call number\n", atoi(argv[3]));
1568 return RESULT_SUCCESS;
1571 static char jitter_usage[] =
1572 "Usage: iax set jitter [callid] <value>\n"
1573 " If used with a callid, it sets the jitter buffer to the given static\n"
1574 "value (until its next calculation). If used without a callid, the value is used\n"
1575 "to establish the maximum excess jitter buffer that is permitted before the jitter\n"
1576 "buffer size is reduced.";
1578 static int iax2_show_stats(int fd, int argc, char *argv[])
1580 struct iax_frame *cur;
1581 int cnt = 0, dead=0, final=0;
1583 return RESULT_SHOWUSAGE;
1584 for (cur = iaxq.head; cur ; cur = cur->next) {
1585 if (cur->retries < 0)
1591 ast_cli(fd, " IAX Statistics\n");
1592 ast_cli(fd, "---------------------\n");
1593 ast_cli(fd, "Outstanding frames: %d (%d ingress, %d outgress)\n", iax_get_frames(), iax_get_iframes(), iax_get_oframes());
1594 ast_cli(fd, "Packets in transmit queue: %d dead, %d final, %d total\n", dead, final, cnt);
1595 return RESULT_SUCCESS;
1598 static int iax2_show_cache(int fd, int argc, char *argv[])
1600 struct iax2_dpcache *dp;
1601 char tmp[1024] = "", *pc;
1605 gettimeofday(&tv, NULL);
1606 ast_mutex_lock(&dpcache_lock);
1608 ast_cli(fd, "%-20.20s %-12.12s %-9.9s %-8.8s %s\n", "Peer/Context", "Exten", "Exp.", "Wait.", "Flags");
1610 s = dp->expirey.tv_sec - tv.tv_sec;
1612 if (dp->flags & CACHE_FLAG_EXISTS)
1613 strncat(tmp, "EXISTS|", sizeof(tmp) - strlen(tmp) - 1);
1614 if (dp->flags & CACHE_FLAG_NONEXISTANT)
1615 strncat(tmp, "NONEXISTANT|", sizeof(tmp) - strlen(tmp) - 1);
1616 if (dp->flags & CACHE_FLAG_CANEXIST)
1617 strncat(tmp, "CANEXIST|", sizeof(tmp) - strlen(tmp) - 1);
1618 if (dp->flags & CACHE_FLAG_PENDING)
1619 strncat(tmp, "PENDING|", sizeof(tmp) - strlen(tmp) - 1);
1620 if (dp->flags & CACHE_FLAG_TIMEOUT)
1621 strncat(tmp, "TIMEOUT|", sizeof(tmp) - strlen(tmp) - 1);
1622 if (dp->flags & CACHE_FLAG_TRANSMITTED)
1623 strncat(tmp, "TRANSMITTED|", sizeof(tmp) - strlen(tmp) - 1);
1624 if (dp->flags & CACHE_FLAG_MATCHMORE)
1625 strncat(tmp, "MATCHMORE|", sizeof(tmp) - strlen(tmp) - 1);
1626 if (dp->flags & CACHE_FLAG_UNKNOWN)
1627 strncat(tmp, "UNKNOWN|", sizeof(tmp) - strlen(tmp) - 1);
1628 /* Trim trailing pipe */
1629 if (!ast_strlen_zero(tmp))
1630 tmp[strlen(tmp) - 1] = '\0';
1632 strncpy(tmp, "(none)", sizeof(tmp) - 1);
1634 pc = strchr(dp->peercontext, '@');
1636 pc = dp->peercontext;
1639 for (x=0;x<sizeof(dp->waiters) / sizeof(dp->waiters[0]); x++)
1640 if (dp->waiters[x] > -1)
1643 ast_cli(fd, "%-20.20s %-12.12s %-9d %-8d %s\n", pc, dp->exten, s, y, tmp);
1645 ast_cli(fd, "%-20.20s %-12.12s %-9.9s %-8d %s\n", pc, dp->exten, "(expired)", y, tmp);
1648 ast_mutex_unlock(&dpcache_lock);
1649 return RESULT_SUCCESS;
1652 static char show_stats_usage[] =
1653 "Usage: iax show stats\n"
1654 " Display statistics on IAX channel driver.\n";
1657 static char show_cache_usage[] =
1658 "Usage: iax show cache\n"
1659 " Display currently cached IAX Dialplan results.\n";
1661 static struct ast_cli_entry cli_set_jitter =
1662 { { "iax2", "set", "jitter", NULL }, iax2_set_jitter, "Sets IAX jitter buffer", jitter_usage };
1664 static struct ast_cli_entry cli_show_stats =
1665 { { "iax2", "show", "stats", NULL }, iax2_show_stats, "Display IAX statistics", show_stats_usage };
1667 static struct ast_cli_entry cli_show_cache =
1668 { { "iax2", "show", "cache", NULL }, iax2_show_cache, "Display IAX cached dialplan", show_cache_usage };
1671 static unsigned int calc_rxstamp(struct chan_iax2_pvt *p, unsigned int offset);
1673 #ifdef BRIDGE_OPTIMIZATION
1674 static unsigned int calc_fakestamp(struct chan_iax2_pvt *from, struct chan_iax2_pvt *to, unsigned int ts);
1676 static int forward_delivery(struct iax_frame *fr)
1678 struct chan_iax2_pvt *p1, *p2;
1679 char iabuf[INET_ADDRSTRLEN];
1682 p1 = iaxs[fr->callno];
1683 p2 = iaxs[p1->bridgecallno];
1690 ast_log(LOG_DEBUG, "forward_delivery: Forwarding ts=%d on %d/%d to %d/%d on %s:%d\n",
1692 p1->callno, p1->peercallno,
1693 p2->callno, p2->peercallno,
1694 ast_inet_ntoa(iabuf, sizeof(iabuf), p2->addr.sin_addr),
1695 ntohs(p2->addr.sin_port));
1697 /* Undo wraparound - which can happen when full VOICE frame wasn't sent by our peer.
1698 This is necessary for when our peer is chan_iax2.c v1.1nn or earlier which didn't
1699 send full frame on timestamp wrap when doing optimized bridging
1700 (actually current code STILL doesn't)
1702 if (fr->ts + 50000 <= p1->last) {
1703 fr->ts = ( (p1->last & 0xFFFF0000) + 0x10000) | (fr->ts & 0xFFFF);
1705 ast_log(LOG_DEBUG, "forward_delivery: pushed forward timestamp to %u\n", fr->ts);
1708 /* Send with timestamp adjusted to the origin of the outbound leg */
1709 /* But don't destroy inbound timestamp still needed later to set "last" */
1711 fr->ts = calc_fakestamp(p1, p2, fr->ts);
1712 res = iax2_send(p2, &fr->af, fr->ts, -1, 0, 0, 0);
1718 static void unwrap_timestamp(struct iax_frame *fr)
1722 if ( (fr->ts & 0xFFFF0000) == (iaxs[fr->callno]->last & 0xFFFF0000) ) {
1723 x = fr->ts - iaxs[fr->callno]->last;
1725 /* Sudden big jump backwards in timestamp:
1726 What likely happened here is that miniframe timestamp has circled but we haven't
1727 gotten the update from the main packet. We'll just pretend that we did, and
1728 update the timestamp appropriately. */
1729 fr->ts = ( (iaxs[fr->callno]->last & 0xFFFF0000) + 0x10000) | (fr->ts & 0xFFFF);
1731 ast_log(LOG_DEBUG, "schedule_delivery: pushed forward timestamp\n");
1734 /* Sudden apparent big jump forwards in timestamp:
1735 What's likely happened is this is an old miniframe belonging to the previous
1736 top-16-bit timestamp that has turned up out of order.
1737 Adjust the timestamp appropriately. */
1738 fr->ts = ( (iaxs[fr->callno]->last & 0xFFFF0000) - 0x10000) | (fr->ts & 0xFFFF);
1740 ast_log(LOG_DEBUG, "schedule_delivery: pushed back timestamp\n");
1745 static int schedule_delivery(struct iax_frame *fr, int reallydeliver, int updatehistory, int fromtrunk)
1749 unsigned int orig_ts;
1750 int drops[MEMORY_SIZE];
1751 int min, max=0, prevjitterbuffer, maxone=0,y,z, match;
1753 /* Remember current jitterbuffer so we can log any change */
1754 prevjitterbuffer = iaxs[fr->callno]->jitterbuffer;
1755 /* Similarly for the frame timestamp */
1760 ast_log(LOG_DEBUG, "schedule_delivery: ts=%d, last=%d, really=%d, update=%d\n",
1761 fr->ts, iaxs[fr->callno]->last, reallydeliver, updatehistory);
1764 /* Attempt to recover wrapped timestamps */
1765 unwrap_timestamp(fr);
1767 if (updatehistory) {
1769 /* Attempt to spot a change of timebase on timestamps coming from the other side
1770 We detect by noticing a jump in consecutive timestamps that can't reasonably be explained
1771 by network jitter or reordering. Sometimes, also, the peer stops sending us frames
1772 for a while - in this case this code might also resync us. But that's not a bad thing.
1773 Be careful of non-voice frames which are timestamped differently (especially ACKS!)
1774 [that's why we only do this when updatehistory is true]
1776 x = fr->ts - iaxs[fr->callno]->last;
1777 if (x > TS_GAP_FOR_JB_RESYNC || x < -TS_GAP_FOR_JB_RESYNC) {
1779 ast_log(LOG_DEBUG, "schedule_delivery: call=%d: TS jumped. resyncing rxcore (ts=%d, last=%d)\n",
1780 fr->callno, fr->ts, iaxs[fr->callno]->last);
1781 /* zap rxcore - calc_rxstamp will make a new one based on this frame */
1782 iaxs[fr->callno]->rxcore.tv_sec = 0;
1783 iaxs[fr->callno]->rxcore.tv_usec = 0;
1784 /* wipe "last" if stamps have jumped backwards */
1786 iaxs[fr->callno]->last = 0;
1787 /* should we also empty history? */
1790 /* ms is a measure of the "lateness" of the frame relative to the "reference"
1791 frame we received. (initially the very first, but also see code just above here).
1792 Understand that "ms" can easily be -ve if lag improves since the reference frame.
1793 Called by IAX thread, with iaxsl lock held. */
1794 ms = calc_rxstamp(iaxs[fr->callno], fr->ts) - fr->ts;
1796 /* Rotate our history queue of "lateness". Don't worry about those initial
1797 zeros because the first entry will always be zero */
1798 for (x=0;x<MEMORY_SIZE - 1;x++)
1799 iaxs[fr->callno]->history[x] = iaxs[fr->callno]->history[x+1];
1800 /* Add a history entry for this one */
1801 iaxs[fr->callno]->history[x] = ms;
1807 /* delivery time is sender's sent timestamp converted back into absolute time according to our clock */
1808 if ( (!fromtrunk) && (iaxs[fr->callno]->rxcore.tv_sec || iaxs[fr->callno]->rxcore.tv_usec) ) {
1809 fr->af.delivery.tv_sec = iaxs[fr->callno]->rxcore.tv_sec;
1810 fr->af.delivery.tv_usec = iaxs[fr->callno]->rxcore.tv_usec;
1811 fr->af.delivery.tv_sec += fr->ts / 1000;
1812 fr->af.delivery.tv_usec += (fr->ts % 1000) * 1000;
1813 if (fr->af.delivery.tv_usec >= 1000000) {
1814 fr->af.delivery.tv_usec -= 1000000;
1815 fr->af.delivery.tv_sec += 1;
1821 ast_log(LOG_DEBUG, "schedule_delivery: set delivery to 0 as we don't have an rxcore yet, or frame is from trunk.\n");
1823 fr->af.delivery.tv_sec = 0;
1824 fr->af.delivery.tv_usec = 0;
1827 /* Initialize the minimum to reasonable values. It's too much
1828 work to do the same for the maximum, repeatedly */
1829 min=iaxs[fr->callno]->history[0];
1830 for (z=0;z < iax2_dropcount + 1;z++) {
1831 /* Start very optimistic ;-) */
1833 for (x=0;x<MEMORY_SIZE;x++) {
1834 if (max < iaxs[fr->callno]->history[x]) {
1835 /* We have a candidate new maximum value. Make
1836 sure it's not in our drop list */
1838 for (y=0;!match && (y<z);y++)
1839 match |= (drops[y] == x);
1841 /* It's not in our list, use it as the new maximum */
1842 max = iaxs[fr->callno]->history[x];
1848 /* On our first pass, find the minimum too */
1849 if (min > iaxs[fr->callno]->history[x])
1850 min = iaxs[fr->callno]->history[x];
1857 /* Just for reference, keep the "jitter" value, the difference between the
1858 earliest and the latest. */
1860 iaxs[fr->callno]->jitter = max - min;
1862 /* IIR filter for keeping track of historic jitter, but always increase
1863 historic jitter immediately for increase */
1865 if (iaxs[fr->callno]->jitter > iaxs[fr->callno]->historicjitter )
1866 iaxs[fr->callno]->historicjitter = iaxs[fr->callno]->jitter;
1868 iaxs[fr->callno]->historicjitter = GAMMA * (double)iaxs[fr->callno]->jitter + (1-GAMMA) *
1869 iaxs[fr->callno]->historicjitter;
1871 /* If our jitter buffer is too big (by a significant margin), then we slowly
1872 shrink it to avoid letting the change be perceived */
1873 if (max < iaxs[fr->callno]->jitterbuffer - max_jitter_buffer)
1874 iaxs[fr->callno]->jitterbuffer -= jittershrinkrate;
1876 /* If our jitter buffer headroom is too small (by a significant margin), then we slowly enlarge it */
1877 /* min_jitter_buffer should be SMALLER than max_jitter_buffer - leaving a "no mans land"
1878 in between - otherwise the jitterbuffer size will hunt up and down causing unnecessary
1879 disruption. Set maxexcessbuffer to say 150msec, minexcessbuffer to say 50 */
1880 if (max > iaxs[fr->callno]->jitterbuffer - min_jitter_buffer)
1881 iaxs[fr->callno]->jitterbuffer += jittershrinkrate;
1883 /* If our jitter buffer is smaller than our maximum delay, grow the jitter
1884 buffer immediately to accomodate it (and a little more). */
1885 if (max > iaxs[fr->callno]->jitterbuffer)
1886 iaxs[fr->callno]->jitterbuffer = max
1887 /* + ((float)iaxs[fr->callno]->jitter) * 0.1 */;
1889 /* If the caller just wanted us to update, return now */
1893 /* Subtract the lateness from our jitter buffer to know how long to wait
1894 before sending our packet. */
1895 delay = iaxs[fr->callno]->jitterbuffer - ms;
1897 /* Whatever happens, no frame waits longer than maxjitterbuffer */
1898 if (delay > maxjitterbuffer)
1899 delay = maxjitterbuffer;
1901 /* If jitter buffer is disabled then just pretend the frame is "right on time" */
1902 /* If frame came from trunk, also don't do any delay */
1903 if ( (!iaxs[fr->callno]->usejitterbuf) || fromtrunk )
1907 /* Log jitter stats for possible offline analysis */
1908 ast_log(LOG_DEBUG, "Jitter: call=%d ts=%d orig=%d last=%d %s: min=%d max=%d jb=%d %+d lateness=%d jbdelay=%d jitter=%d historic=%d\n",
1909 fr->callno, fr->ts, orig_ts, iaxs[fr->callno]->last,
1910 (fr->af.frametype == AST_FRAME_VOICE) ? "VOICE" : "CONTROL",
1911 min, max, iaxs[fr->callno]->jitterbuffer,
1912 iaxs[fr->callno]->jitterbuffer - prevjitterbuffer,
1914 iaxs[fr->callno]->jitter, iaxs[fr->callno]->historicjitter);
1918 /* Don't deliver it more than 4 ms late */
1919 if ((delay > -4) || (fr->af.frametype != AST_FRAME_VOICE)) {
1921 ast_log(LOG_DEBUG, "schedule_delivery: Delivering immediately (Calculated delay is %d)\n", delay);
1925 ast_log(LOG_DEBUG, "schedule_delivery: Dropping voice packet since %dms delay is too old\n", delay);
1926 /* Free our iax frame */
1927 iax2_frame_free(fr);
1931 ast_log(LOG_DEBUG, "schedule_delivery: Scheduling delivery in %d ms\n", delay);
1932 fr->retrans = ast_sched_add(sched, delay, do_deliver, fr);
1937 static int iax2_transmit(struct iax_frame *fr)
1939 /* Lock the queue and place this packet at the end */
1942 /* By setting this to 0, the network thread will send it for us, and
1943 queue retransmission if necessary */
1945 ast_mutex_lock(&iaxq.lock);
1952 iaxq.tail->next = fr;
1953 fr->prev = iaxq.tail;
1957 ast_mutex_unlock(&iaxq.lock);
1958 /* Wake up the network thread */
1959 pthread_kill(netthreadid, SIGURG);
1965 static int iax2_digit(struct ast_channel *c, char digit)
1967 return send_command_locked(PTR_TO_CALLNO(c->pvt->pvt), AST_FRAME_DTMF, digit, 0, NULL, 0, -1);
1970 static int iax2_sendtext(struct ast_channel *c, char *text)
1973 return send_command_locked(PTR_TO_CALLNO(c->pvt->pvt), AST_FRAME_TEXT,
1974 0, 0, text, strlen(text) + 1, -1);
1977 static int iax2_sendimage(struct ast_channel *c, struct ast_frame *img)
1979 return send_command_locked(PTR_TO_CALLNO(c->pvt->pvt), AST_FRAME_IMAGE, img->subclass, 0, img->data, img->datalen, -1);
1982 static int iax2_sendhtml(struct ast_channel *c, int subclass, char *data, int datalen)
1984 return send_command_locked(PTR_TO_CALLNO(c->pvt->pvt), AST_FRAME_HTML, subclass, 0, data, datalen, -1);
1987 static int iax2_fixup(struct ast_channel *oldchannel, struct ast_channel *newchan)
1989 unsigned short callno = PTR_TO_CALLNO(newchan->pvt->pvt);
1990 ast_mutex_lock(&iaxsl[callno]);
1992 iaxs[callno]->owner = newchan;
1994 ast_log(LOG_WARNING, "Uh, this isn't a good sign...\n");
1995 ast_mutex_unlock(&iaxsl[callno]);
1999 static struct iax2_peer *build_peer(const char *name, struct ast_variable *v, int temponly);
2000 static struct iax2_user *build_user(const char *name, struct ast_variable *v, int temponly);
2002 static void destroy_user(struct iax2_user *user);
2003 static void destroy_peer(struct iax2_peer *peer);
2005 static struct iax2_peer *realtime_peer(const char *peername)
2007 struct ast_variable *var;
2008 struct ast_variable *tmp;
2009 struct iax2_peer *peer=NULL;
2010 time_t regseconds, nowtime;
2012 var = ast_load_realtime("iaxfriends", "name", peername, NULL);
2014 /* Make sure it's not a user only... */
2015 peer = build_peer(peername, var, 1);
2017 /* Add some finishing touches, addresses, etc */
2021 if (!strcasecmp(tmp->name, "type")) {
2022 if (strcasecmp(tmp->value, "friend") &&
2023 strcasecmp(tmp->value, "peer")) {
2024 /* Whoops, we weren't supposed to exist! */
2029 } else if (!strcasecmp(tmp->name, "regseconds")) {
2030 if (sscanf(tmp->value, "%li", ®seconds) != 1)
2032 } else if (!strcasecmp(tmp->name, "ipaddr")) {
2033 inet_aton(tmp->value, &(peer->addr.sin_addr));
2034 } else if (!strcasecmp(tmp->name, "port")) {
2035 peer->addr.sin_port = htons(atoi(tmp->value));
2036 } else if (!strcasecmp(tmp->name, "host")) {
2037 if (!strcasecmp(tmp->value, "dynamic"))
2042 if (peer && dynamic) {
2044 if ((nowtime - regseconds) > IAX_DEFAULT_REG_EXPIRE) {
2045 memset(&peer->addr, 0, sizeof(peer->addr));
2047 ast_log(LOG_DEBUG, "Bah, we're expired (%ld/%ld/%ld)!\n", nowtime - regseconds, regseconds, nowtime);
2051 ast_destroy_realtime(var);
2056 static struct iax2_user *realtime_user(const char *username)
2058 struct ast_variable *var;
2059 struct ast_variable *tmp;
2060 struct iax2_user *user=NULL;
2061 var = ast_load_realtime("iaxfriends", "name", username, NULL);
2063 /* Make sure it's not a user only... */
2064 user = build_user(username, var, 1);
2066 /* Add some finishing touches, addresses, etc */
2070 if (!strcasecmp(tmp->name, "type")) {
2071 if (strcasecmp(tmp->value, "friend") &&
2072 strcasecmp(tmp->value, "user")) {
2073 /* Whoops, we weren't supposed to exist! */
2082 ast_destroy_realtime(var);
2087 static void realtime_update(const char *peername, struct sockaddr_in *sin)
2091 char regseconds[20];
2095 snprintf(regseconds, sizeof(regseconds), "%ld", nowtime);
2096 ast_inet_ntoa(ipaddr, sizeof(ipaddr), sin->sin_addr);
2097 snprintf(port, sizeof(port), "%d", ntohs(sin->sin_port));
2098 ast_update_realtime("iaxfriends", "name", peername, "ipaddr", ipaddr, "port", port, "regseconds", regseconds, NULL);
2102 static int create_addr(struct sockaddr_in *sin, int *capability, int *sendani, int *maxtime, char *peer, char *context, int *trunk, int *notransfer, int *usejitterbuf, char *username, int usernlen, char *secret, int seclen, int *ofound, char *peercontext, char *timezone, int tzlen)
2104 struct ast_hostent ahp; struct hostent *hp;
2105 struct iax2_peer *p;
2113 sin->sin_family = AF_INET;
2114 ast_mutex_lock(&peerl.lock);
2117 if (!strcasecmp(p->name, peer)) {
2122 ast_mutex_unlock(&peerl.lock);
2124 p = realtime_peer(peer);
2127 if ((p->addr.sin_addr.s_addr || p->defaddr.sin_addr.s_addr) &&
2128 (!p->maxms || ((p->lastms > 0) && (p->lastms <= p->maxms)))) {
2130 *sendani = p->sendani; /* Whether we transmit ANI */
2132 *maxtime = p->maxms; /* Max time they should take */
2134 strncpy(context, p->context, AST_MAX_EXTENSION - 1);
2136 strncpy(peercontext, p->peercontext, AST_MAX_EXTENSION - 1);
2140 *capability = p->capability;
2142 strncpy(username, p->username, usernlen);
2143 if (p->addr.sin_addr.s_addr) {
2144 sin->sin_addr = p->addr.sin_addr;
2145 sin->sin_port = p->addr.sin_port;
2147 sin->sin_addr = p->defaddr.sin_addr;
2148 sin->sin_port = p->defaddr.sin_port;
2151 *notransfer=p->notransfer;
2153 *usejitterbuf=p->usejitterbuf;
2155 if (!ast_strlen_zero(p->dbsecret)) {
2156 char *family, *key=NULL;
2157 family = ast_strdupa(p->dbsecret);
2159 key = strchr(family, '/');
2165 if (!family || !key || ast_db_get(family, key, secret, seclen)) {
2166 ast_log(LOG_WARNING, "Unable to retrieve database password for family/key '%s'!\n", p->dbsecret);
2172 strncpy(secret, p->secret, seclen); /* safe */
2175 snprintf(timezone, tzlen-1, "%s", p->zonetag);
2185 hp = ast_gethostbyname(peer, &ahp);
2187 memcpy(&sin->sin_addr, hp->h_addr, sizeof(sin->sin_addr));
2188 sin->sin_port = htons(IAX_DEFAULT_PORTNO);
2191 ast_log(LOG_WARNING, "No such host: %s\n", peer);
2201 static int auto_congest(void *nothing)
2203 int callno = PTR_TO_CALLNO(nothing);
2204 struct ast_frame f = { AST_FRAME_CONTROL, AST_CONTROL_CONGESTION };
2205 ast_mutex_lock(&iaxsl[callno]);
2207 iaxs[callno]->initid = -1;
2208 iax2_queue_frame(callno, &f);
2209 ast_log(LOG_NOTICE, "Auto-congesting call due to slow response\n");
2211 ast_mutex_unlock(&iaxsl[callno]);
2215 static unsigned int iax2_datetime(char *tz)
2221 localtime_r(&t, &tm);
2222 if (!ast_strlen_zero(tz))
2223 ast_localtime(&t, &tm, tz);
2224 tmp = (tm.tm_sec >> 1) & 0x1f; /* 5 bits of seconds */
2225 tmp |= (tm.tm_min & 0x3f) << 5; /* 6 bits of minutes */
2226 tmp |= (tm.tm_hour & 0x1f) << 11; /* 5 bits of hours */
2227 tmp |= (tm.tm_mday & 0x1f) << 16; /* 5 bits of day of month */
2228 tmp |= ((tm.tm_mon + 1) & 0xf) << 21; /* 4 bits of month */
2229 tmp |= ((tm.tm_year - 100) & 0x7f) << 25; /* 7 bits of year */
2233 static int iax2_call(struct ast_channel *c, char *dest, int timeout)
2235 struct sockaddr_in sin;
2240 char *secret = NULL;
2242 char *l=NULL, *n=NULL;
2243 struct iax_ie_data ied;
2244 char myrdest [5] = "s";
2245 char context[AST_MAX_EXTENSION] ="";
2246 char peercontext[AST_MAX_EXTENSION] ="";
2247 char *portno = NULL;
2249 unsigned short callno = PTR_TO_CALLNO(c->pvt->pvt);
2251 char storedusern[80], storedsecret[80];
2253 if ((c->_state != AST_STATE_DOWN) && (c->_state != AST_STATE_RESERVED)) {
2254 ast_log(LOG_WARNING, "Line is already in use (%s)?\n", c->name);
2257 strncpy(host, dest, sizeof(host)-1);
2259 strsep(&stringp, "/");
2260 /* If no destination extension specified, use 's' */
2261 rdest = strsep(&stringp, "/");
2265 /* Check for trailing options */
2266 opts = strsep(&stringp, "/");
2271 strsep(&stringp, "@");
2272 rcontext = strsep(&stringp, "@");
2274 strsep(&stringp, "@");
2275 username = strsep(&stringp, "@");
2277 /* Really the second argument is the host, not the username */
2285 username = strsep(&stringp, ":");
2286 secret = strsep(&stringp, ":");
2289 if (strsep(&stringp, ":")) {
2291 strsep(&stringp, ":");
2292 portno = strsep(&stringp, ":");
2294 if (create_addr(&sin, NULL, NULL, NULL, hname, context, NULL, NULL, NULL, storedusern, sizeof(storedusern) - 1, storedsecret, sizeof(storedsecret) - 1, NULL, peercontext, tz, sizeof(tz))) {
2295 ast_log(LOG_WARNING, "No address associated with '%s'\n", hname);
2298 /* Keep track of the context for outgoing calls too */
2299 strncpy(c->context, context, sizeof(c->context) - 1);
2301 sin.sin_port = htons(atoi(portno));
2304 n = c->cid.cid_name;
2305 /* Now build request */
2306 memset(&ied, 0, sizeof(ied));
2307 /* On new call, first IE MUST be IAX version of caller */
2308 iax_ie_append_short(&ied, IAX_IE_VERSION, IAX_PROTO_VERSION);
2309 iax_ie_append_str(&ied, IAX_IE_CALLED_NUMBER, rdest);
2310 if (strchr(opts, 'a')) {
2311 /* Request auto answer */
2312 iax_ie_append(&ied, IAX_IE_AUTOANSWER);
2315 iax_ie_append_str(&ied, IAX_IE_CALLING_NUMBER, l);
2316 iax_ie_append_byte(&ied, IAX_IE_CALLINGPRES, c->cid.cid_pres);
2318 iax_ie_append_byte(&ied, IAX_IE_CALLINGPRES, AST_PRES_NUMBER_NOT_AVAILABLE);
2319 iax_ie_append_byte(&ied, IAX_IE_CALLINGTON, c->cid.cid_ton);
2320 iax_ie_append_short(&ied, IAX_IE_CALLINGTNS, c->cid.cid_tns);
2322 iax_ie_append_str(&ied, IAX_IE_CALLING_NAME, n);
2323 if (iaxs[callno]->sendani && c->cid.cid_ani) {
2324 iax_ie_append_str(&ied, IAX_IE_CALLING_ANI, c->cid.cid_ani);
2326 if (c->language && !ast_strlen_zero(c->language))
2327 iax_ie_append_str(&ied, IAX_IE_LANGUAGE, c->language);
2328 if (c->cid.cid_dnid && !ast_strlen_zero(c->cid.cid_dnid))
2329 iax_ie_append_str(&ied, IAX_IE_DNID, c->cid.cid_dnid);
2331 iax_ie_append_str(&ied, IAX_IE_CALLED_CONTEXT, rcontext);
2332 else if (strlen(peercontext))
2333 iax_ie_append_str(&ied, IAX_IE_CALLED_CONTEXT, peercontext);
2334 if (!username && !ast_strlen_zero(storedusern))
2335 username = storedusern;
2337 iax_ie_append_str(&ied, IAX_IE_USERNAME, username);
2338 if (!secret && !ast_strlen_zero(storedsecret))
2339 secret = storedsecret;
2340 ast_mutex_lock(&iaxsl[callno]);
2341 if (!ast_strlen_zero(c->context))
2342 strncpy(iaxs[callno]->context, c->context, sizeof(iaxs[callno]->context) - 1);
2344 strncpy(iaxs[callno]->username, username, sizeof(iaxs[callno]->username)-1);
2346 if (secret[0] == '[') {
2347 /* This is an RSA key, not a normal secret */
2348 strncpy(iaxs[callno]->outkey, secret + 1, sizeof(iaxs[callno]->secret)-1);
2349 if (!ast_strlen_zero(iaxs[callno]->outkey)) {
2350 iaxs[callno]->outkey[strlen(iaxs[callno]->outkey) - 1] = '\0';
2353 strncpy(iaxs[callno]->secret, secret, sizeof(iaxs[callno]->secret)-1);
2355 iax_ie_append_int(&ied, IAX_IE_FORMAT, c->nativeformats);
2356 iax_ie_append_int(&ied, IAX_IE_CAPABILITY, iaxs[callno]->capability);
2357 iax_ie_append_short(&ied, IAX_IE_ADSICPE, c->adsicpe);
2358 iax_ie_append_int(&ied, IAX_IE_DATETIME, iax2_datetime(tz));
2359 /* Transmit the string in a "NEW" request */
2361 /* XXX We have no equivalent XXX */
2362 if (option_verbose > 2)
2363 ast_verbose(VERBOSE_PREFIX_3 "Calling using options '%s'\n", requeststr);
2365 if (iaxs[callno]->maxtime) {
2366 /* Initialize pingtime and auto-congest time */
2367 iaxs[callno]->pingtime = iaxs[callno]->maxtime / 2;
2368 iaxs[callno]->initid = ast_sched_add(sched, iaxs[callno]->maxtime * 2, auto_congest, CALLNO_TO_PTR(callno));
2369 } else if (autokill) {
2370 iaxs[callno]->pingtime = autokill / 2;
2371 iaxs[callno]->initid = ast_sched_add(sched, autokill * 2, auto_congest, CALLNO_TO_PTR(callno));
2373 send_command(iaxs[callno], AST_FRAME_IAX,
2374 IAX_COMMAND_NEW, 0, ied.buf, ied.pos, -1);
2375 ast_mutex_unlock(&iaxsl[callno]);
2376 ast_setstate(c, AST_STATE_RINGING);
2380 static int iax2_hangup(struct ast_channel *c)
2382 unsigned short callno = PTR_TO_CALLNO(c->pvt->pvt);
2384 ast_mutex_lock(&iaxsl[callno]);
2385 if (callno && iaxs[callno]) {
2386 ast_log(LOG_DEBUG, "We're hanging up %s now...\n", c->name);
2387 alreadygone = iaxs[callno]->alreadygone;
2388 /* Send the hangup unless we have had a transmission error or are already gone */
2389 if (!iaxs[callno]->error && !alreadygone)
2390 send_command_final(iaxs[callno], AST_FRAME_IAX, IAX_COMMAND_HANGUP, 0, NULL, 0, -1);
2391 /* Explicitly predestroy it */
2392 iax2_predestroy_nolock(callno);
2393 /* If we were already gone to begin with, destroy us now */
2395 ast_log(LOG_DEBUG, "Really destroying %s now...\n", c->name);
2396 iax2_destroy_nolock(callno);
2399 ast_mutex_unlock(&iaxsl[callno]);
2400 if (option_verbose > 2)
2401 ast_verbose(VERBOSE_PREFIX_3 "Hungup '%s'\n", c->name);
2405 static int iax2_setoption(struct ast_channel *c, int option, void *data, int datalen)
2407 struct ast_option_header *h;
2409 h = malloc(datalen + sizeof(struct ast_option_header));
2411 h->flag = AST_OPTION_FLAG_REQUEST;
2412 h->option = htons(option);
2413 memcpy(h->data, data, datalen);
2414 res = send_command_locked(PTR_TO_CALLNO(c->pvt->pvt), AST_FRAME_CONTROL,
2415 AST_CONTROL_OPTION, 0, (char *)h, datalen + sizeof(struct ast_option_header), -1);
2419 ast_log(LOG_WARNING, "Out of memory\n");
2423 static struct ast_frame *iax2_read(struct ast_channel *c)
2425 static struct ast_frame f = { AST_FRAME_NULL, };
2426 ast_log(LOG_NOTICE, "I should never be called!\n");
2430 static int iax2_start_transfer(unsigned short callno0, unsigned short callno1)
2433 struct iax_ie_data ied0;
2434 struct iax_ie_data ied1;
2435 unsigned int transferid = rand();
2436 memset(&ied0, 0, sizeof(ied0));
2437 iax_ie_append_addr(&ied0, IAX_IE_APPARENT_ADDR, &iaxs[callno1]->addr);
2438 iax_ie_append_short(&ied0, IAX_IE_CALLNO, iaxs[callno1]->peercallno);
2439 iax_ie_append_int(&ied0, IAX_IE_TRANSFERID, transferid);
2441 memset(&ied1, 0, sizeof(ied1));
2442 iax_ie_append_addr(&ied1, IAX_IE_APPARENT_ADDR, &iaxs[callno0]->addr);
2443 iax_ie_append_short(&ied1, IAX_IE_CALLNO, iaxs[callno0]->peercallno);
2444 iax_ie_append_int(&ied1, IAX_IE_TRANSFERID, transferid);
2446 res = send_command(iaxs[callno0], AST_FRAME_IAX, IAX_COMMAND_TXREQ, 0, ied0.buf, ied0.pos, -1);
2449 res = send_command(iaxs[callno1], AST_FRAME_IAX, IAX_COMMAND_TXREQ, 0, ied1.buf, ied1.pos, -1);
2452 iaxs[callno0]->transferring = TRANSFER_BEGIN;
2453 iaxs[callno1]->transferring = TRANSFER_BEGIN;
2457 static void lock_both(unsigned short callno0, unsigned short callno1)
2459 ast_mutex_lock(&iaxsl[callno0]);
2460 while (ast_mutex_trylock(&iaxsl[callno1])) {
2461 ast_mutex_unlock(&iaxsl[callno0]);
2463 ast_mutex_lock(&iaxsl[callno0]);
2467 static void unlock_both(unsigned short callno0, unsigned short callno1)
2469 ast_mutex_unlock(&iaxsl[callno1]);
2470 ast_mutex_unlock(&iaxsl[callno0]);
2473 static int iax2_bridge(struct ast_channel *c0, struct ast_channel *c1, int flags, struct ast_frame **fo, struct ast_channel **rc)
2475 struct ast_channel *cs[3];
2476 struct ast_channel *who;
2479 int transferstarted=0;
2480 struct ast_frame *f;
2481 unsigned short callno0 = PTR_TO_CALLNO(c0->pvt->pvt);
2482 unsigned short callno1 = PTR_TO_CALLNO(c1->pvt->pvt);
2483 struct timeval waittimer = {0, 0}, tv;
2485 lock_both(callno0, callno1);
2486 /* Put them in native bridge mode */
2487 iaxs[callno0]->bridgecallno = callno1;
2488 iaxs[callno1]->bridgecallno = callno0;
2489 unlock_both(callno0, callno1);
2491 /* If not, try to bridge until we can execute a transfer, if we can */
2494 for (/* ever */;;) {
2495 /* Check in case we got masqueraded into */
2496 if ((c0->type != type) || (c1->type != type)) {
2497 if (option_verbose > 2)
2498 ast_verbose(VERBOSE_PREFIX_3 "Can't masquerade, we're different...\n");
2499 /* Remove from native mode */
2500 if (c0->type == type) {
2501 ast_mutex_lock(&iaxsl[callno0]);
2502 iaxs[callno0]->bridgecallno = 0;
2503 ast_mutex_unlock(&iaxsl[callno0]);
2505 if (c1->type == type) {
2506 ast_mutex_lock(&iaxsl[callno1]);
2507 iaxs[callno1]->bridgecallno = 0;
2508 ast_mutex_unlock(&iaxsl[callno1]);
2512 if (c0->nativeformats != c1->nativeformats) {
2513 if (option_verbose > 2)
2514 ast_verbose(VERBOSE_PREFIX_3 "Operating with different codecs, can't native bridge...\n");
2515 /* Remove from native mode */
2516 lock_both(callno0, callno1);
2517 iaxs[callno0]->bridgecallno = 0;
2518 iaxs[callno1]->bridgecallno = 0;
2519 unlock_both(callno0, callno1);
2522 /* check if transfered and if we really want native bridging */
2523 if (!transferstarted && !iaxs[callno0]->notransfer && !iaxs[callno1]->notransfer) {
2524 /* Try the transfer */
2525 if (iax2_start_transfer(callno0, callno1))
2526 ast_log(LOG_WARNING, "Unable to start the transfer\n");
2527 transferstarted = 1;
2529 if ((iaxs[callno0]->transferring == TRANSFER_RELEASED) && (iaxs[callno1]->transferring == TRANSFER_RELEASED)) {
2530 /* Call has been transferred. We're no longer involved */
2531 gettimeofday(&tv, NULL);
2532 if (!waittimer.tv_sec && !waittimer.tv_usec) {
2533 waittimer.tv_sec = tv.tv_sec;
2534 waittimer.tv_usec = tv.tv_usec;
2535 } else if (tv.tv_sec - waittimer.tv_sec > IAX_LINGER_TIMEOUT) {
2536 c0->_softhangup |= AST_SOFTHANGUP_DEV;
2537 c1->_softhangup |= AST_SOFTHANGUP_DEV;
2545 who = ast_waitfor_n(cs, 2, &to);
2547 if (ast_check_hangup(c0) || ast_check_hangup(c1)) {
2560 if ((f->frametype == AST_FRAME_CONTROL) && !(flags & AST_BRIDGE_IGNORE_SIGS)) {
2566 if ((f->frametype == AST_FRAME_VOICE) ||
2567 (f->frametype == AST_FRAME_TEXT) ||
2568 (f->frametype == AST_FRAME_VIDEO) ||
2569 (f->frametype == AST_FRAME_IMAGE) ||
2570 (f->frametype == AST_FRAME_DTMF)) {
2571 if ((f->frametype == AST_FRAME_DTMF) &&
2572 (flags & (AST_BRIDGE_DTMF_CHANNEL_0 | AST_BRIDGE_DTMF_CHANNEL_1))) {
2574 if ((flags & AST_BRIDGE_DTMF_CHANNEL_0)) {
2577 /* Take out of conference mode */
2579 /* Remove from native mode */
2585 if (flags & AST_BRIDGE_DTMF_CHANNEL_1) {
2589 /* Remove from native mode */
2596 ast_log(LOG_DEBUG, "Read from %s\n", who->name);
2598 ast_log(LOG_DEBUG, "Servicing channel %s twice in a row?\n", last->name);
2610 /* Swap who gets priority */
2615 lock_both(callno0, callno1);
2617 iaxs[callno0]->bridgecallno = 0;
2619 iaxs[callno1]->bridgecallno = 0;
2620 unlock_both(callno0, callno1);
2624 static int iax2_answer(struct ast_channel *c)
2626 unsigned short callno = PTR_TO_CALLNO(c->pvt->pvt);
2628 ast_log(LOG_DEBUG, "Answering\n");
2629 return send_command_locked(callno, AST_FRAME_CONTROL, AST_CONTROL_ANSWER, 0, NULL, 0, -1);
2632 static int iax2_indicate(struct ast_channel *c, int condition)
2634 unsigned short callno = PTR_TO_CALLNO(c->pvt->pvt);
2636 ast_log(LOG_DEBUG, "Indicating condition %d\n", condition);
2637 return send_command_locked(callno, AST_FRAME_CONTROL, condition, 0, NULL, 0, -1);
2640 static int iax2_transfer(struct ast_channel *c, char *dest)
2642 unsigned short callno = PTR_TO_CALLNO(c->pvt->pvt);
2643 struct iax_ie_data ied;
2644 char tmp[256] = "", *context;
2645 strncpy(tmp, dest, sizeof(tmp) - 1);
2646 context = strchr(tmp, '@');
2651 memset(&ied, 0, sizeof(ied));
2652 iax_ie_append_str(&ied, IAX_IE_CALLED_NUMBER, tmp);
2654 iax_ie_append_str(&ied, IAX_IE_CALLED_CONTEXT, context);
2656 ast_log(LOG_DEBUG, "Transferring '%s' to '%s'\n", c->name, dest);
2657 return send_command_locked(callno, AST_FRAME_IAX, IAX_COMMAND_TRANSFER, 0, ied.buf, ied.pos, -1);
2661 static int iax2_write(struct ast_channel *c, struct ast_frame *f);
2663 static int iax2_getpeertrunk(struct sockaddr_in sin)
2665 struct iax2_peer *peer;
2667 ast_mutex_lock(&peerl.lock);
2670 if ((peer->addr.sin_addr.s_addr == sin.sin_addr.s_addr) &&
2671 (peer->addr.sin_port == sin.sin_port)) {
2677 ast_mutex_unlock(&peerl.lock);
2681 static struct ast_channel *ast_iax2_new(int callno, int state, int capability)
2683 struct ast_channel *tmp;
2684 struct chan_iax2_pvt *i;
2685 struct ast_variable *v = NULL;
2687 /* Don't hold call lock */
2688 ast_mutex_unlock(&iaxsl[callno]);
2689 tmp = ast_channel_alloc(1);
2690 ast_mutex_lock(&iaxsl[callno]);
2693 if (!ast_strlen_zero(i->username))
2694 snprintf(tmp->name, sizeof(tmp->name), "IAX2/%s@%s/%d", i->username, i->host, i->callno);
2696 snprintf(tmp->name, sizeof(tmp->name), "IAX2/%s/%d", i->host, i->callno);
2698 /* We can support any format by default, until we get restricted */
2699 tmp->nativeformats = capability;
2700 tmp->readformat = 0;
2701 tmp->writeformat = 0;
2702 tmp->pvt->pvt = CALLNO_TO_PTR(i->callno);
2703 tmp->pvt->send_digit = iax2_digit;
2704 tmp->pvt->send_text = iax2_sendtext;
2705 tmp->pvt->send_image = iax2_sendimage;
2706 tmp->pvt->send_html = iax2_sendhtml;
2707 tmp->pvt->call = iax2_call;
2708 tmp->pvt->hangup = iax2_hangup;
2709 tmp->pvt->answer = iax2_answer;
2710 tmp->pvt->read = iax2_read;
2711 tmp->pvt->write = iax2_write;
2712 tmp->pvt->write_video = iax2_write;
2713 tmp->pvt->indicate = iax2_indicate;
2714 tmp->pvt->setoption = iax2_setoption;
2715 tmp->pvt->bridge = iax2_bridge;
2716 tmp->pvt->transfer = iax2_transfer;
2717 if (!ast_strlen_zero(i->cid_num))
2718 tmp->cid.cid_num = strdup(i->cid_num);
2719 if (!ast_strlen_zero(i->cid_name))
2720 tmp->cid.cid_name = strdup(i->cid_name);
2721 if (!ast_strlen_zero(i->ani))
2722 tmp->cid.cid_ani = strdup(i->ani);
2723 if (!ast_strlen_zero(i->language))
2724 strncpy(tmp->language, i->language, sizeof(tmp->language)-1);
2725 if (!ast_strlen_zero(i->dnid))
2726 tmp->cid.cid_dnid = strdup(i->dnid);
2727 tmp->cid.cid_pres = i->calling_pres;
2728 tmp->cid.cid_ton = i->calling_ton;
2729 tmp->cid.cid_tns = i->calling_tns;
2730 if (!ast_strlen_zero(i->accountcode))
2731 strncpy(tmp->accountcode, i->accountcode, sizeof(tmp->accountcode)-1);
2733 tmp->amaflags = i->amaflags;
2734 strncpy(tmp->context, i->context, sizeof(tmp->context)-1);
2735 strncpy(tmp->exten, i->exten, sizeof(tmp->exten)-1);
2736 tmp->adsicpe = i->peeradsicpe;
2737 tmp->pvt->fixup = iax2_fixup;
2739 i->capability = capability;
2740 ast_setstate(tmp, state);
2741 ast_mutex_lock(&usecnt_lock);
2743 ast_mutex_unlock(&usecnt_lock);
2744 ast_update_use_count();
2745 if (state != AST_STATE_DOWN) {
2746 if (ast_pbx_start(tmp)) {
2747 ast_log(LOG_WARNING, "Unable to start PBX on %s\n", tmp->name);
2752 for (v = i->vars ; v ; v = v->next)
2753 pbx_builtin_setvar_helper(tmp,v->name,v->value);
2759 static unsigned int calc_txpeerstamp(struct iax2_trunk_peer *tpeer, int sampms, struct timeval *tv)
2761 unsigned long int mssincetx; /* unsigned to handle overflows */
2764 tpeer->trunkact = *tv;
2765 mssincetx = (tv->tv_sec - tpeer->lasttxtime.tv_sec) * 1000 +
2766 (1000000 + tv->tv_usec - tpeer->lasttxtime.tv_usec) / 1000 - 1000;
2767 if (mssincetx > 5000 || (!tpeer->txtrunktime.tv_sec && !tpeer->txtrunktime.tv_usec)) {
2768 /* If it's been at least 5 seconds since the last time we transmitted on this trunk, reset our timers */
2769 tpeer->txtrunktime.tv_sec = tv->tv_sec;
2770 tpeer->txtrunktime.tv_usec = tv->tv_usec;
2771 tpeer->lastsent = 999999;
2773 /* Update last transmit time now */
2774 tpeer->lasttxtime.tv_sec = tv->tv_sec;
2775 tpeer->lasttxtime.tv_usec = tv->tv_usec;
2777 /* Calculate ms offset */
2778 ms = (tv->tv_sec - tpeer->txtrunktime.tv_sec) * 1000 +
2779 (1000000 + tv->tv_usec - tpeer->txtrunktime.tv_usec) / 1000 - 1000;
2780 /* Predict from last value */
2781 pred = tpeer->lastsent + sampms;
2782 if (abs(ms - pred) < MAX_TIMESTAMP_SKEW)
2785 /* We never send the same timestamp twice, so fudge a little if we must */
2786 if (ms == tpeer->lastsent)
2787 ms = tpeer->lastsent + 1;
2788 tpeer->lastsent = ms;
2792 static unsigned int fix_peerts(struct timeval *tv, int callno, unsigned int ts)
2794 long ms; /* NOT unsigned */
2795 if (!iaxs[callno]->rxcore.tv_sec && !iaxs[callno]->rxcore.tv_usec) {
2796 /* Initialize rxcore time if appropriate */
2797 gettimeofday(&iaxs[callno]->rxcore, NULL);
2798 /* Round to nearest 20ms so traces look pretty */
2799 iaxs[callno]->rxcore.tv_usec -= iaxs[callno]->rxcore.tv_usec % 20000;
2801 /* Calculate difference between trunk and channel */
2802 ms = (tv->tv_sec - iaxs[callno]->rxcore.tv_sec) * 1000 +
2803 (1000000 + tv->tv_usec - iaxs[callno]->rxcore.tv_usec) / 1000 - 1000;
2804 /* Return as the sum of trunk time and the difference between trunk and real time */
2808 static unsigned int calc_timestamp(struct chan_iax2_pvt *p, unsigned int ts, struct ast_frame *f)
2814 struct timeval *delivery = NULL;
2816 /* What sort of frame do we have?: voice is self-explanatory
2817 "genuine" means an IAX frame - things like LAGRQ/RP, PING/PONG, ACK
2818 non-genuine frames are CONTROL frames [ringing etc], DTMF
2819 The "genuine" distinction is needed because genuine frames must get a clock-based timestamp,
2820 the others need a timestamp slaved to the voice frames so that they go in sequence
2823 if (f->frametype == AST_FRAME_VOICE) {
2825 delivery = &f->delivery;
2826 } else if (f->frametype == AST_FRAME_IAX) {
2830 if (!p->offset.tv_sec && !p->offset.tv_usec) {
2831 gettimeofday(&p->offset, NULL);
2832 /* Round to nearest 20ms for nice looking traces */
2833 p->offset.tv_usec -= p->offset.tv_usec % 20000;
2835 /* If the timestamp is specified, just send it as is */
2838 /* If we have a time that the frame arrived, always use it to make our timestamp */
2839 if (delivery && (delivery->tv_sec || delivery->tv_usec)) {
2840 ms = (delivery->tv_sec - p->offset.tv_sec) * 1000 +
2841 (1000000 + delivery->tv_usec - p->offset.tv_usec) / 1000 - 1000;
2843 ast_log(LOG_DEBUG, "calc_timestamp: call %d/%d: Timestamp slaved to delivery time\n", p->callno, iaxs[p->callno]->peercallno);
2845 gettimeofday(&tv, NULL);
2846 ms = (tv.tv_sec - p->offset.tv_sec) * 1000 +
2847 (1000000 + tv.tv_usec - p->offset.tv_usec) / 1000 - 1000;
2851 /* On a voice frame, use predicted values if appropriate */
2852 if (abs(ms - p->nextpred) <= MAX_TIMESTAMP_SKEW) {
2854 p->nextpred = ms; /*f->samples / 8;*/
2855 if (p->nextpred <= p->lastsent)
2856 p->nextpred = p->lastsent + 3;
2862 /* On a dataframe, use last value + 3 (to accomodate jitter buffer shrinking) if appropriate unless
2863 it's a genuine frame */
2865 /* genuine (IAX LAGRQ etc) must keep their clock-based stamps */
2866 if (ms <= p->lastsent)
2867 ms = p->lastsent + 3;
2868 } else if (abs(ms - p->lastsent) <= MAX_TIMESTAMP_SKEW) {
2869 /* non-genuine frames (!?) (DTMF, CONTROL) should be pulled into the predicted stream stamps */
2870 ms = p->lastsent + 3;
2876 p->nextpred = p->nextpred + f->samples / 8;
2878 printf("TS: %s - %dms\n", voice ? "Audio" : "Control", ms);
2883 #ifdef BRIDGE_OPTIMIZATION
2884 static unsigned int calc_fakestamp(struct chan_iax2_pvt *p1, struct chan_iax2_pvt *p2, unsigned int fakets)
2887 /* Receive from p1, send to p2 */
2889 /* Setup rxcore if necessary on outgoing channel */
2890 if (!p1->rxcore.tv_sec && !p1->rxcore.tv_usec)
2891 gettimeofday(&p1->rxcore, NULL);
2893 /* Setup txcore if necessary on outgoing channel */
2894 if (!p2->offset.tv_sec && !p2->offset.tv_usec)
2895 gettimeofday(&p2->offset, NULL);
2897 /* Now, ts is the timestamp of the original packet in the orignal context.
2898 Adding rxcore to it gives us when we would want the packet to be delivered normally.
2899 Subtracting txcore of the outgoing channel gives us what we'd expect */
2901 ms = (p1->rxcore.tv_sec - p2->offset.tv_sec) * 1000 +
2902 (1000000 + p1->rxcore.tv_usec - p2->offset.tv_usec) / 1000 - 1000;
2905 /* FIXME? SLD would rather remove this and leave it to the end system to deal with */
2906 if (fakets <= p2->lastsent)
2907 fakets = p2->lastsent + 1;
2908 p2->lastsent = fakets;
2913 static unsigned int calc_rxstamp(struct chan_iax2_pvt *p, unsigned int offset)
2915 /* Returns where in "receive time" we are. That is, how many ms
2916 since we received (or would have received) the frame with timestamp 0 */
2919 /* Setup rxcore if necessary */
2920 if (!p->rxcore.tv_sec && !p->rxcore.tv_usec) {
2921 gettimeofday(&p->rxcore, NULL);
2923 ast_log(LOG_DEBUG, "calc_rxstamp: call=%d: rxcore set to %d.%6.6d - %dms\n",
2924 p->callno, (int)(p->rxcore.tv_sec), (int)(p->rxcore.tv_usec), offset);
2925 p->rxcore.tv_sec -= offset / 1000;
2926 p->rxcore.tv_usec -= (offset % 1000) * 1000;
2927 if (p->rxcore.tv_usec < 0) {
2928 p->rxcore.tv_usec += 1000000;
2929 p->rxcore.tv_sec -= 1;
2933 ast_log(LOG_DEBUG, "calc_rxstamp: call=%d: works out as %d.%6.6d\n",
2934 p->callno, (int)(p->rxcore.tv_sec),(int)( p->rxcore.tv_usec));
2938 gettimeofday(&tv, NULL);
2939 ms = (tv.tv_sec - p->rxcore.tv_sec) * 1000 +
2940 (1000000 + tv.tv_usec - p->rxcore.tv_usec) / 1000 - 1000;
2944 static struct iax2_trunk_peer *find_tpeer(struct sockaddr_in *sin)
2946 struct iax2_trunk_peer *tpeer;
2947 char iabuf[INET_ADDRSTRLEN];
2948 /* Finds and locks trunk peer */
2949 ast_mutex_lock(&tpeerlock);
2952 /* We don't lock here because tpeer->addr *never* changes */
2953 if (!inaddrcmp(&tpeer->addr, sin)) {
2954 ast_mutex_lock(&tpeer->lock);
2957 tpeer = tpeer->next;
2960 tpeer = malloc(sizeof(struct iax2_trunk_peer));
2962 memset(tpeer, 0, sizeof(struct iax2_trunk_peer));
2963 ast_mutex_init(&tpeer->lock);
2964 tpeer->lastsent = 9999;
2965 memcpy(&tpeer->addr, sin, sizeof(tpeer->addr));
2966 gettimeofday(&tpeer->trunkact, NULL);
2967 ast_mutex_lock(&tpeer->lock);
2968 tpeer->next = tpeers;
2970 ast_log(LOG_DEBUG, "Created trunk peer for '%s:%d'\n", ast_inet_ntoa(iabuf, sizeof(iabuf), tpeer->addr.sin_addr), ntohs(tpeer->addr.sin_port));
2973 ast_mutex_unlock(&tpeerlock);
2977 static int iax2_trunk_queue(struct chan_iax2_pvt *pvt, struct ast_frame *f)
2979 struct iax2_trunk_peer *tpeer;
2981 struct ast_iax2_meta_trunk_entry *met;
2982 char iabuf[INET_ADDRSTRLEN];
2983 tpeer = find_tpeer(&pvt->addr);
2985 if (tpeer->trunkdatalen + f->datalen + 4 >= tpeer->trunkdataalloc) {
2986 /* Need to reallocate space */
2987 if (tpeer->trunkdataalloc < MAX_TRUNKDATA) {
2988 tmp = realloc(tpeer->trunkdata, tpeer->trunkdataalloc + DEFAULT_TRUNKDATA + IAX2_TRUNK_PREFACE);
2990 tpeer->trunkdataalloc += DEFAULT_TRUNKDATA;
2991 tpeer->trunkdata = tmp;
2992 ast_log(LOG_DEBUG, "Expanded trunk '%s:%d' to %d bytes\n", ast_inet_ntoa(iabuf, sizeof(iabuf), tpeer->addr.sin_addr), ntohs(tpeer->addr.sin_port), tpeer->trunkdataalloc);
2994 ast_log(LOG_WARNING, "Insufficient memory to expand trunk data to %s:%d\n", ast_inet_ntoa(iabuf, sizeof(iabuf), tpeer->addr.sin_addr), ntohs(tpeer->addr.sin_port));
2995 ast_mutex_unlock(&tpeer->lock);
2999 ast_log(LOG_WARNING, "Maximum trunk data space exceeded to %s:%d\n", ast_inet_ntoa(iabuf, sizeof(iabuf), tpeer->addr.sin_addr), ntohs(tpeer->addr.sin_port));
3000 ast_mutex_unlock(&tpeer->lock);
3005 /* Append to meta frame */
3006 ptr = tpeer->trunkdata + IAX2_TRUNK_PREFACE + tpeer->trunkdatalen;
3007 met = (struct ast_iax2_meta_trunk_entry *)ptr;
3008 /* Store call number and length in meta header */
3009 met->callno = htons(pvt->callno);
3010 met->len = htons(f->datalen);
3011 /* Advance pointers/decrease length past trunk entry header */
3012 ptr += sizeof(struct ast_iax2_meta_trunk_entry);
3013 tpeer->trunkdatalen += sizeof(struct ast_iax2_meta_trunk_entry);
3014 /* Copy actual trunk data */