2 * Asterisk -- An open source telephony toolkit.
4 * Copyright (C) 1999 - 2006, Digium, Inc.
6 * Mark Spencer <markster@digium.com>
8 * See http://www.asterisk.org for more information about
9 * the Asterisk project. Please do not directly contact
10 * any of the maintainers of this project for assistance;
11 * the project provides a web site, mailing lists and IRC
12 * channels for your use.
14 * This program is free software, distributed under the terms of
15 * the GNU General Public License Version 2. See the LICENSE file
16 * at the top of the source tree.
21 * \brief Implementation of Inter-Asterisk eXchange Version 2
23 * \author Mark Spencer <markster@digium.com>
26 * \arg \ref Config_iax
28 * \ingroup channel_drivers
37 ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
41 #include <sys/types.h>
44 #include <sys/socket.h>
45 #include <netinet/in.h>
46 #include <arpa/inet.h>
47 #include <netinet/in_systm.h>
48 #include <netinet/ip.h>
50 #include <sys/signal.h>
62 #include <sys/ioctl.h>
63 #include <zaptel/zaptel.h>
66 #include "asterisk/lock.h"
67 #include "asterisk/frame.h"
68 #include "asterisk/channel.h"
69 #include "asterisk/logger.h"
70 #include "asterisk/module.h"
71 #include "asterisk/pbx.h"
72 #include "asterisk/sched.h"
73 #include "asterisk/io.h"
74 #include "asterisk/config.h"
75 #include "asterisk/options.h"
76 #include "asterisk/cli.h"
77 #include "asterisk/translate.h"
78 #include "asterisk/md5.h"
79 #include "asterisk/cdr.h"
80 #include "asterisk/crypto.h"
81 #include "asterisk/acl.h"
82 #include "asterisk/manager.h"
83 #include "asterisk/callerid.h"
84 #include "asterisk/app.h"
85 #include "asterisk/astdb.h"
86 #include "asterisk/musiconhold.h"
87 #include "asterisk/features.h"
88 #include "asterisk/utils.h"
89 #include "asterisk/causes.h"
90 #include "asterisk/localtime.h"
91 #include "asterisk/aes.h"
92 #include "asterisk/dnsmgr.h"
93 #include "asterisk/devicestate.h"
94 #include "asterisk/netsock.h"
95 #include "asterisk/stringfields.h"
96 #include "asterisk/linkedlists.h"
99 #include "iax2-parser.h"
100 #include "iax2-provision.h"
101 #include "jitterbuf.h"
103 /* Define SCHED_MULTITHREADED to run the scheduler in a special
104 multithreaded mode. */
105 #define SCHED_MULTITHREADED
107 /* Define DEBUG_SCHED_MULTITHREADED to keep track of where each
108 thread is actually doing. */
109 #define DEBUG_SCHED_MULTITHREAD
111 #ifndef IPTOS_MINCOST
112 #define IPTOS_MINCOST 0x02
116 static int nochecksums = 0;
120 #define PTR_TO_CALLNO(a) ((unsigned short)(unsigned long)(a))
121 #define CALLNO_TO_PTR(a) ((void *)(unsigned long)(a))
123 #define DEFAULT_THREAD_COUNT 10
124 #define DEFAULT_MAX_THREAD_COUNT 100
125 #define DEFAULT_RETRY_TIME 1000
126 #define MEMORY_SIZE 100
127 #define DEFAULT_DROP 3
128 /* Flag to use with trunk calls, keeping these calls high up. It halves our effective use
129 but keeps the division between trunked and non-trunked better. */
130 #define TRUNK_CALL_START 0x4000
132 #define DEBUG_SUPPORT
134 #define MIN_REUSE_TIME 60 /* Don't reuse a call number within 60 seconds */
136 /* Sample over last 100 units to determine historic jitter */
139 static struct ast_codec_pref prefs;
141 static const char tdesc[] = "Inter Asterisk eXchange Driver (Ver 2)";
144 /*! \brief Maximum transmission unit for the UDP packet in the trunk not to be
145 fragmented. This is based on 1516 - ethernet - ip - udp - iax minus one g711 frame = 1240 */
146 #define MAX_TRUNK_MTU 1240
148 static int global_max_trunk_mtu; /*!< Maximum MTU, 0 if not used */
149 static int trunk_timed, trunk_untimed, trunk_maxmtu, trunk_nmaxmtu ; /*!< Trunk MTU statistics */
152 static char context[80] = "default";
154 static char language[MAX_LANGUAGE] = "";
155 static char regcontext[AST_MAX_CONTEXT] = "";
157 static int maxauthreq = 3;
158 static int max_retries = 4;
159 static int ping_time = 20;
160 static int lagrq_time = 10;
161 static int maxtrunkcall = TRUNK_CALL_START;
162 static int maxnontrunkcall = 1;
163 static int maxjitterbuffer=1000;
164 static int resyncthreshold=1000;
165 static int maxjitterinterps=10;
166 static int trunkfreq = 20;
167 static int authdebug = 1;
168 static int autokill = 0;
169 static int iaxcompat = 0;
171 static int iaxdefaultdpcache=10 * 60; /* Cache dialplan entries for 10 minutes by default */
173 static int iaxdefaulttimeout = 5; /* Default to wait no more than 5 seconds for a reply to come back */
175 static unsigned int tos = 0;
177 static int min_reg_expire;
178 static int max_reg_expire;
180 static int timingfd = -1; /* Timing file descriptor */
182 static struct ast_netsock_list *netsock;
183 static int defaultsockfd = -1;
185 int (*iax2_regfunk)(const char *username, int onoff) = NULL;
188 #define IAX_CAPABILITY_FULLBANDWIDTH 0xFFFF
190 #define IAX_CAPABILITY_MEDBANDWIDTH (IAX_CAPABILITY_FULLBANDWIDTH & \
191 ~AST_FORMAT_SLINEAR & \
196 #define IAX_CAPABILITY_LOWBANDWIDTH (IAX_CAPABILITY_MEDBANDWIDTH & \
198 ~AST_FORMAT_G726_AAL2 & \
201 #define IAX_CAPABILITY_LOWFREE (IAX_CAPABILITY_LOWBANDWIDTH & \
205 #define DEFAULT_MAXMS 2000 /* Must be faster than 2 seconds by default */
206 #define DEFAULT_FREQ_OK 60 * 1000 /* How often to check for the host to be up */
207 #define DEFAULT_FREQ_NOTOK 10 * 1000 /* How often to check, if the host is down... */
209 static struct io_context *io;
210 static struct sched_context *sched;
212 static int iax2_capability = IAX_CAPABILITY_FULLBANDWIDTH;
214 static int iaxdebug = 0;
216 static int iaxtrunkdebug = 0;
218 static int test_losspct = 0;
220 static int test_late = 0;
221 static int test_resync = 0;
222 static int test_jit = 0;
223 static int test_jitpct = 0;
224 #endif /* IAXTESTS */
226 static char accountcode[AST_MAX_ACCOUNT_CODE];
227 static char mohinterpret[MAX_MUSICCLASS];
228 static char mohsuggest[MAX_MUSICCLASS];
229 static int amaflags = 0;
231 static int delayreject = 0;
232 static int iax2_encryption = 0;
234 static struct ast_flags globalflags = { 0 };
236 static pthread_t netthreadid = AST_PTHREADT_NULL;
237 static pthread_t schedthreadid = AST_PTHREADT_NULL;
238 AST_MUTEX_DEFINE_STATIC(sched_lock);
239 static ast_cond_t sched_cond;
242 IAX_STATE_STARTED = (1 << 0),
243 IAX_STATE_AUTHENTICATED = (1 << 1),
244 IAX_STATE_TBD = (1 << 2),
245 IAX_STATE_UNCHANGED = (1 << 3),
248 struct iax2_context {
249 char context[AST_MAX_CONTEXT];
250 struct iax2_context *next;
254 IAX_HASCALLERID = (1 << 0), /*!< CallerID has been specified */
255 IAX_DELME = (1 << 1), /*!< Needs to be deleted */
256 IAX_TEMPONLY = (1 << 2), /*!< Temporary (realtime) */
257 IAX_TRUNK = (1 << 3), /*!< Treat as a trunk */
258 IAX_NOTRANSFER = (1 << 4), /*!< Don't native bridge */
259 IAX_USEJITTERBUF = (1 << 5), /*!< Use jitter buffer */
260 IAX_DYNAMIC = (1 << 6), /*!< dynamic peer */
261 IAX_SENDANI = (1 << 7), /*!< Send ANI along with CallerID */
262 /* (1 << 8) is currently unused due to the deprecation of an old option. Go ahead, take it! */
263 IAX_ALREADYGONE = (1 << 9), /*!< Already disconnected */
264 IAX_PROVISION = (1 << 10), /*!< This is a provisioning request */
265 IAX_QUELCH = (1 << 11), /*!< Whether or not we quelch audio */
266 IAX_ENCRYPTED = (1 << 12), /*!< Whether we should assume encrypted tx/rx */
267 IAX_KEYPOPULATED = (1 << 13), /*!< Whether we have a key populated */
268 IAX_CODEC_USER_FIRST = (1 << 14), /*!< are we willing to let the other guy choose the codec? */
269 IAX_CODEC_NOPREFS = (1 << 15), /*!< Force old behaviour by turning off prefs */
270 IAX_CODEC_NOCAP = (1 << 16), /*!< only consider requested format and ignore capabilities*/
271 IAX_RTCACHEFRIENDS = (1 << 17), /*!< let realtime stay till your reload */
272 IAX_RTUPDATE = (1 << 18), /*!< Send a realtime update */
273 IAX_RTAUTOCLEAR = (1 << 19), /*!< erase me on expire */
274 IAX_FORCEJITTERBUF = (1 << 20), /*!< Force jitterbuffer, even when bridged to a channel that can take jitter */
275 IAX_RTIGNOREREGEXPIRE = (1 << 21), /*!< When using realtime, ignore registration expiration */
276 IAX_TRUNKTIMESTAMPS = (1 << 22), /*!< Send trunk timestamps */
277 IAX_TRANSFERMEDIA = (1 << 23), /*!< When doing IAX2 transfers, transfer media only */
278 IAX_MAXAUTHREQ = (1 << 24), /*!< Maximum outstanding AUTHREQ restriction is in place */
281 static int global_rtautoclear = 120;
283 static int reload_config(void);
284 static int iax2_reload(int fd, int argc, char *argv[]);
288 AST_DECLARE_STRING_FIELDS(
289 AST_STRING_FIELD(name);
290 AST_STRING_FIELD(secret);
291 AST_STRING_FIELD(dbsecret);
292 AST_STRING_FIELD(accountcode);
293 AST_STRING_FIELD(mohinterpret);
294 AST_STRING_FIELD(mohsuggest);
295 AST_STRING_FIELD(inkeys); /*!< Key(s) this user can use to authenticate to us */
296 AST_STRING_FIELD(language);
297 AST_STRING_FIELD(cid_num);
298 AST_STRING_FIELD(cid_name);
307 int maxauthreq; /*!< Maximum allowed outstanding AUTHREQs */
308 int curauthreq; /*!< Current number of outstanding AUTHREQs */
309 struct ast_codec_pref prefs;
311 struct iax2_context *contexts;
312 struct ast_variable *vars;
313 AST_LIST_ENTRY(iax2_user) entry;
317 AST_DECLARE_STRING_FIELDS(
318 AST_STRING_FIELD(name);
319 AST_STRING_FIELD(username);
320 AST_STRING_FIELD(secret);
321 AST_STRING_FIELD(dbsecret);
322 AST_STRING_FIELD(outkey); /*!< What key we use to talk to this peer */
324 AST_STRING_FIELD(regexten); /*!< Extension to register (if regcontext is used) */
325 AST_STRING_FIELD(context); /*!< For transfers only */
326 AST_STRING_FIELD(peercontext); /*!< Context to pass to peer */
327 AST_STRING_FIELD(mailbox); /*!< Mailbox */
328 AST_STRING_FIELD(mohinterpret);
329 AST_STRING_FIELD(mohsuggest);
330 AST_STRING_FIELD(inkeys); /*!< Key(s) this peer can use to authenticate to us */
331 /* Suggested caller id if registering */
332 AST_STRING_FIELD(cid_num); /*!< Default context (for transfer really) */
333 AST_STRING_FIELD(cid_name); /*!< Default context (for transfer really) */
334 AST_STRING_FIELD(zonetag); /*!< Time Zone */
336 struct ast_codec_pref prefs;
337 struct ast_dnsmgr_entry *dnsmgr; /*!< DNS refresh manager */
338 struct sockaddr_in addr;
340 int sockfd; /*!< Socket to use for transmission */
345 /* Dynamic Registration fields */
346 struct sockaddr_in defaddr; /*!< Default address if there is one */
347 int authmethods; /*!< Authentication methods (IAX_AUTH_*) */
348 int encmethods; /*!< Encryption methods (IAX_ENCRYPT_*) */
350 int expire; /*!< Schedule entry for expiry */
351 int expiry; /*!< How soon to expire */
352 int capability; /*!< Capability */
355 int callno; /*!< Call number of POKE request */
356 int pokeexpire; /*!< Scheduled qualification-related task (ie iax2_poke_peer_s or iax2_poke_noanswer) */
357 int lastms; /*!< How long last response took (in ms), or -1 for no response */
358 int maxms; /*!< Max ms we will accept for the host to be up, 0 to not monitor */
360 int pokefreqok; /*!< How often to check if the host is up */
361 int pokefreqnotok; /*!< How often to check when the host has been determined to be down */
362 int historicms; /*!< How long recent average responses took */
363 int smoothing; /*!< Sample over how many units to determine historic ms */
366 AST_LIST_ENTRY(iax2_peer) entry;
369 #define IAX2_TRUNK_PREFACE (sizeof(struct iax_frame) + sizeof(struct ast_iax2_meta_hdr) + sizeof(struct ast_iax2_meta_trunk_hdr))
371 struct iax2_trunk_peer {
374 struct sockaddr_in addr;
375 struct timeval txtrunktime; /*!< Transmit trunktime */
376 struct timeval rxtrunktime; /*!< Receive trunktime */
377 struct timeval lasttxtime; /*!< Last transmitted trunktime */
378 struct timeval trunkact; /*!< Last trunk activity */
379 unsigned int lastsent; /*!< Last sent time */
380 /* Trunk data and length */
381 unsigned char *trunkdata;
382 unsigned int trunkdatalen;
383 unsigned int trunkdataalloc;
387 AST_LIST_ENTRY(iax2_trunk_peer) list;
390 static AST_LIST_HEAD_STATIC(tpeers, iax2_trunk_peer);
392 struct iax_firmware {
393 AST_LIST_ENTRY(iax_firmware) list;
397 struct ast_iax2_firmware_header *fwh;
402 REG_STATE_UNREGISTERED = 0,
405 REG_STATE_REGISTERED,
411 enum iax_transfer_state {
416 TRANSFER_PASSTHROUGH,
420 TRANSFER_MPASSTHROUGH,
425 struct iax2_registry {
426 struct sockaddr_in addr; /*!< Who we connect to for registration purposes */
428 char secret[80]; /*!< Password or key name in []'s */
430 int expire; /*!< Sched ID of expiration */
431 int refresh; /*!< How often to refresh */
432 enum iax_reg_state regstate;
433 int messages; /*!< Message count, low 8 bits = new, high 8 bits = old */
434 int callno; /*!< Associated call number if applicable */
435 struct sockaddr_in us; /*!< Who the server thinks we are */
436 struct ast_dnsmgr_entry *dnsmgr; /*!< DNS refresh manager */
437 AST_LIST_ENTRY(iax2_registry) entry;
440 static AST_LIST_HEAD_STATIC(registrations, iax2_registry);
442 /* Don't retry more frequently than every 10 ms, or less frequently than every 5 seconds */
443 #define MIN_RETRY_TIME 100
444 #define MAX_RETRY_TIME 10000
446 #define MAX_JITTER_BUFFER 50
447 #define MIN_JITTER_BUFFER 10
449 #define DEFAULT_TRUNKDATA 640 * 10 /*!< 40ms, uncompressed linear * 10 channels */
450 #define MAX_TRUNKDATA 640 * 200 /*!< 40ms, uncompressed linear * 200 channels */
452 #define MAX_TIMESTAMP_SKEW 160 /*!< maximum difference between actual and predicted ts for sending */
454 /* If consecutive voice frame timestamps jump by more than this many milliseconds, then jitter buffer will resync */
455 #define TS_GAP_FOR_JB_RESYNC 5000
457 static int iaxthreadcount = DEFAULT_THREAD_COUNT;
458 static int iaxmaxthreadcount = DEFAULT_MAX_THREAD_COUNT;
459 static int iaxdynamicthreadcount = 0;
471 struct chan_iax2_pvt {
472 /*! Socket to send/receive on for this call */
474 /*! Last received voice format */
476 /*! Last received video format */
478 /*! Last sent voice format */
480 /*! Last sent video format */
482 /*! What we are capable of sending */
484 /*! Last received timestamp */
486 /*! Last sent timestamp - never send the same timestamp twice in a single call */
487 unsigned int lastsent;
488 /*! Next outgoing timestamp if everything is good */
489 unsigned int nextpred;
490 /*! True if the last voice we transmitted was not silence/CNG */
491 unsigned int notsilenttx:1;
493 unsigned int pingtime;
494 /*! Max time for initial response */
497 struct sockaddr_in addr;
498 /*! Actual used codec preferences */
499 struct ast_codec_pref prefs;
500 /*! Requested codec preferences */
501 struct ast_codec_pref rprefs;
502 /*! Our call number */
503 unsigned short callno;
505 unsigned short peercallno;
506 /*! Peer selected format */
508 /*! Peer capability */
510 /*! timeval that we base our transmission on */
511 struct timeval offset;
512 /*! timeval that we base our delivery on */
513 struct timeval rxcore;
514 /*! The jitterbuffer */
516 /*! active jb read scheduler id */
520 /*! Error, as discovered by the manager */
522 /*! Owner if we have one */
523 struct ast_channel *owner;
524 /*! What's our state? */
525 struct ast_flags state;
526 /*! Expiry (optional) */
528 /*! Next outgoing sequence number */
529 unsigned char oseqno;
530 /*! Next sequence number they have not yet acknowledged */
531 unsigned char rseqno;
532 /*! Next incoming sequence number */
533 unsigned char iseqno;
534 /*! Last incoming sequence number we have acknowledged */
535 unsigned char aseqno;
537 AST_DECLARE_STRING_FIELDS(
539 AST_STRING_FIELD(peer);
540 /*! Default Context */
541 AST_STRING_FIELD(context);
542 /*! Caller ID if available */
543 AST_STRING_FIELD(cid_num);
544 AST_STRING_FIELD(cid_name);
545 /*! Hidden Caller ID (i.e. ANI) if appropriate */
546 AST_STRING_FIELD(ani);
548 AST_STRING_FIELD(dnid);
550 AST_STRING_FIELD(rdnis);
551 /*! Requested Extension */
552 AST_STRING_FIELD(exten);
553 /*! Expected Username */
554 AST_STRING_FIELD(username);
555 /*! Expected Secret */
556 AST_STRING_FIELD(secret);
558 AST_STRING_FIELD(challenge);
559 /*! Public keys permitted keys for incoming authentication */
560 AST_STRING_FIELD(inkeys);
561 /*! Private key for outgoing authentication */
562 AST_STRING_FIELD(outkey);
563 /*! Preferred language */
564 AST_STRING_FIELD(language);
565 /*! Hostname/peername for naming purposes */
566 AST_STRING_FIELD(host);
568 AST_STRING_FIELD(dproot);
569 AST_STRING_FIELD(accountcode);
570 AST_STRING_FIELD(mohinterpret);
571 AST_STRING_FIELD(mohsuggest);
574 /*! permitted authentication methods */
576 /*! permitted encryption methods */
578 /*! Encryption AES-128 Key */
580 /*! Decryption AES-128 Key */
582 /*! 32 bytes of semi-random data */
583 unsigned char semirand[32];
584 /*! Associated registry */
585 struct iax2_registry *reg;
586 /*! Associated peer for poking */
587 struct iax2_peer *peerpoke;
592 /*! Transferring status */
593 enum iax_transfer_state transferring;
594 /*! Transfer identifier */
596 /*! Who we are IAX transferring to */
597 struct sockaddr_in transfer;
598 /*! What's the new call number for the transfer */
599 unsigned short transfercallno;
600 /*! Transfer decrypt AES-128 Key */
601 aes_encrypt_ctx tdcx;
603 /*! Status of knowledge of peer ADSI capability */
606 /*! Who we are bridged to */
607 unsigned short bridgecallno;
609 int pingid; /*!< Transmit PING request */
610 int lagid; /*!< Retransmit lag request */
611 int autoid; /*!< Auto hangup for Dialplan requestor */
612 int authid; /*!< Authentication rejection ID */
613 int authfail; /*!< Reason to report failure */
614 int initid; /*!< Initial peer auto-congest ID (based on qualified peers) */
619 AST_LIST_HEAD_NOLOCK(, iax2_dpcache) dpentries;
620 struct ast_variable *vars;
621 /*! last received remote rr */
622 struct iax_rr remote_rr;
623 /*! Current base time: (just for stats) */
625 /*! Dropped frame count: (just for stats) */
627 /*! received frame count: (just for stats) */
631 static struct ast_iax2_queue {
632 AST_LIST_HEAD(, iax_frame) queue;
635 .queue = AST_LIST_HEAD_INIT_VALUE
638 static AST_LIST_HEAD_STATIC(users, iax2_user);
640 static AST_LIST_HEAD_STATIC(peers, iax2_peer);
642 static AST_LIST_HEAD_STATIC(firmwares, iax_firmware);
644 /*! Extension exists */
645 #define CACHE_FLAG_EXISTS (1 << 0)
646 /*! Extension is nonexistent */
647 #define CACHE_FLAG_NONEXISTENT (1 << 1)
648 /*! Extension can exist */
649 #define CACHE_FLAG_CANEXIST (1 << 2)
650 /*! Waiting to hear back response */
651 #define CACHE_FLAG_PENDING (1 << 3)
653 #define CACHE_FLAG_TIMEOUT (1 << 4)
654 /*! Request transmitted */
655 #define CACHE_FLAG_TRANSMITTED (1 << 5)
657 #define CACHE_FLAG_UNKNOWN (1 << 6)
659 #define CACHE_FLAG_MATCHMORE (1 << 7)
661 struct iax2_dpcache {
662 char peercontext[AST_MAX_CONTEXT];
663 char exten[AST_MAX_EXTENSION];
665 struct timeval expiry;
667 unsigned short callno;
669 AST_LIST_ENTRY(iax2_dpcache) cache_list;
670 AST_LIST_ENTRY(iax2_dpcache) peer_list;
673 static AST_LIST_HEAD_STATIC(dpcache, iax2_dpcache);
675 static void reg_source_db(struct iax2_peer *p);
676 static struct iax2_peer *realtime_peer(const char *peername, struct sockaddr_in *sin);
678 static void destroy_peer(struct iax2_peer *peer);
679 static int ast_cli_netstats(struct mansession *s, int fd, int limit_fmt);
681 #define IAX_IOSTATE_IDLE 0
682 #define IAX_IOSTATE_READY 1
683 #define IAX_IOSTATE_PROCESSING 2
684 #define IAX_IOSTATE_SCHEDREADY 3
686 #define IAX_TYPE_POOL 1
687 #define IAX_TYPE_DYNAMIC 2
690 AST_LIST_ENTRY(iax2_thread) list;
693 #ifdef SCHED_MULTITHREADED
694 void (*schedfunc)(void *);
697 #ifdef DEBUG_SCHED_MULTITHREAD
703 struct sockaddr_in iosin;
704 unsigned char buf[4096];
713 static AST_LIST_HEAD_STATIC(idle_list, iax2_thread);
714 static AST_LIST_HEAD_STATIC(active_list, iax2_thread);
715 static AST_LIST_HEAD_STATIC(dynamic_list, iax2_thread);
717 static void *iax2_process_thread(void *data);
719 static void signal_condition(ast_mutex_t *lock, ast_cond_t *cond)
721 ast_mutex_lock(lock);
722 ast_cond_signal(cond);
723 ast_mutex_unlock(lock);
726 static void iax_debug_output(const char *data)
729 ast_verbose("%s", data);
732 static void iax_error_output(const char *data)
734 ast_log(LOG_WARNING, "%s", data);
737 static void jb_error_output(const char *fmt, ...)
743 vsnprintf(buf, sizeof(buf), fmt, args);
746 ast_log(LOG_ERROR, buf);
749 static void jb_warning_output(const char *fmt, ...)
755 vsnprintf(buf, sizeof(buf), fmt, args);
758 ast_log(LOG_WARNING, buf);
761 static void jb_debug_output(const char *fmt, ...)
767 vsnprintf(buf, sizeof(buf), fmt, args);
774 * \brief an array of iax2 pvt structures
776 * The container for active chan_iax2_pvt structures is implemented as an
777 * array for extremely quick direct access to the correct pvt structure
778 * based on the local call number. The local call number is used as the
779 * index into the array where the associated pvt structure is stored.
781 static struct chan_iax2_pvt *iaxs[IAX_MAX_CALLS];
783 * \brief chan_iax2_pvt structure locks
785 * These locks are used when accessing a pvt structure in the iaxs array.
786 * The index used here is the same as used in the iaxs array. It is the
787 * local call number for the associated pvt struct.
789 static ast_mutex_t iaxsl[IAX_MAX_CALLS];
791 * \brief The last time a call number was used
793 * It is important to know the last time that a call number was used locally so
794 * that it is not used again too soon. The reason for this is the same as the
795 * reason that the TCP protocol state machine requires a "TIME WAIT" state.
797 * For example, say that a call is up. Then, the remote side sends a HANGUP,
798 * which we respond to with an ACK. However, there is no way to know whether
799 * the ACK made it there successfully. If it were to get lost, the remote
800 * side may retransmit the HANGUP. If in the meantime, this call number has
801 * been reused locally, given the right set of circumstances, this retransmitted
802 * HANGUP could potentially improperly hang up the new session. So, to avoid
803 * this potential issue, we must wait a specified timeout period before reusing
804 * a local call number.
806 * The specified time that we must wait before reusing a local call number is
807 * defined as MIN_REUSE_TIME, with a default of 60 seconds.
809 static struct timeval lastused[IAX_MAX_CALLS];
811 static enum ast_bridge_result iax2_bridge(struct ast_channel *c0, struct ast_channel *c1, int flags, struct ast_frame **fo, struct ast_channel **rc, int timeoutms);
812 static int expire_registry(void *data);
813 static int iax2_answer(struct ast_channel *c);
814 static int iax2_call(struct ast_channel *c, char *dest, int timeout);
815 static int iax2_devicestate(void *data);
816 static int iax2_digit_begin(struct ast_channel *c, char digit);
817 static int iax2_digit_end(struct ast_channel *c, char digit);
818 static int iax2_do_register(struct iax2_registry *reg);
819 static int iax2_fixup(struct ast_channel *oldchannel, struct ast_channel *newchan);
820 static int iax2_hangup(struct ast_channel *c);
821 static int iax2_indicate(struct ast_channel *c, int condition, const void *data, size_t datalen);
822 static int iax2_poke_peer(struct iax2_peer *peer, int heldcall);
823 static int iax2_provision(struct sockaddr_in *end, int sockfd, char *dest, const char *template, int force);
824 static int iax2_send(struct chan_iax2_pvt *pvt, struct ast_frame *f, unsigned int ts, int seqno, int now, int transfer, int final);
825 static int iax2_sendhtml(struct ast_channel *c, int subclass, const char *data, int datalen);
826 static int iax2_sendimage(struct ast_channel *c, struct ast_frame *img);
827 static int iax2_sendtext(struct ast_channel *c, const char *text);
828 static int iax2_setoption(struct ast_channel *c, int option, void *data, int datalen);
829 static int iax2_transfer(struct ast_channel *c, const char *dest);
830 static int iax2_write(struct ast_channel *c, struct ast_frame *f);
831 static int send_trunk(struct iax2_trunk_peer *tpeer, struct timeval *now);
832 static int send_command(struct chan_iax2_pvt *, char, int, unsigned int, const unsigned char *, int, int);
833 static int send_command_final(struct chan_iax2_pvt *, char, int, unsigned int, const unsigned char *, int, int);
834 static int send_command_immediate(struct chan_iax2_pvt *, char, int, unsigned int, const unsigned char *, int, int);
835 static int send_command_locked(unsigned short callno, char, int, unsigned int, const unsigned char *, int, int);
836 static int send_command_transfer(struct chan_iax2_pvt *, char, int, unsigned int, const unsigned char *, int);
837 static struct ast_channel *iax2_request(const char *type, int format, void *data, int *cause);
838 static struct ast_frame *iax2_read(struct ast_channel *c);
839 static struct iax2_peer *build_peer(const char *name, struct ast_variable *v, struct ast_variable *alt, int temponly);
840 static struct iax2_user *build_user(const char *name, struct ast_variable *v, struct ast_variable *alt, int temponly);
841 static void realtime_update_peer(const char *peername, struct sockaddr_in *sin, time_t regtime);
842 static void destroy_user(struct iax2_user *user);
843 static void prune_peers(void);
845 static const struct ast_channel_tech iax2_tech = {
847 .description = tdesc,
848 .capabilities = IAX_CAPABILITY_FULLBANDWIDTH,
849 .properties = AST_CHAN_TP_WANTSJITTER,
850 .requester = iax2_request,
851 .devicestate = iax2_devicestate,
852 .send_digit_begin = iax2_digit_begin,
853 .send_digit_end = iax2_digit_end,
854 .send_text = iax2_sendtext,
855 .send_image = iax2_sendimage,
856 .send_html = iax2_sendhtml,
858 .hangup = iax2_hangup,
859 .answer = iax2_answer,
862 .write_video = iax2_write,
863 .indicate = iax2_indicate,
864 .setoption = iax2_setoption,
865 .bridge = iax2_bridge,
866 .transfer = iax2_transfer,
870 static struct iax2_thread *find_idle_thread(void)
872 struct iax2_thread *thread = NULL;
874 /* Pop the head of the list off */
875 AST_LIST_LOCK(&idle_list);
876 thread = AST_LIST_REMOVE_HEAD(&idle_list, list);
877 AST_LIST_UNLOCK(&idle_list);
879 /* If no idle thread is available from the regular list, try dynamic */
880 if (thread == NULL) {
881 AST_LIST_LOCK(&dynamic_list);
882 thread = AST_LIST_FIRST(&dynamic_list);
883 if (thread != NULL) {
884 AST_LIST_REMOVE(&dynamic_list, thread, list);
886 /* Make sure we absolutely have a thread... if not, try to make one if allowed */
887 if (thread == NULL && iaxmaxthreadcount > iaxdynamicthreadcount) {
888 /* We need to MAKE a thread! */
889 thread = ast_calloc(1, sizeof(*thread));
890 if (thread != NULL) {
891 thread->threadnum = iaxdynamicthreadcount;
892 thread->type = IAX_TYPE_DYNAMIC;
893 ast_mutex_init(&thread->lock);
894 ast_cond_init(&thread->cond, NULL);
895 if (ast_pthread_create(&thread->threadid, NULL, iax2_process_thread, thread)) {
899 /* All went well and the thread is up, so increment our count */
900 iaxdynamicthreadcount++;
904 AST_LIST_UNLOCK(&dynamic_list);
910 #ifdef SCHED_MULTITHREADED
911 static int __schedule_action(void (*func)(void *data), void *data, const char *funcname)
913 struct iax2_thread *thread = NULL;
914 static time_t lasterror;
917 thread = find_idle_thread();
919 if (thread != NULL) {
920 thread->schedfunc = func;
921 thread->scheddata = data;
922 thread->iostate = IAX_IOSTATE_SCHEDREADY;
923 #ifdef DEBUG_SCHED_MULTITHREAD
924 ast_copy_string(thread->curfunc, funcname, sizeof(thread->curfunc));
926 signal_condition(&thread->lock, &thread->cond);
931 ast_log(LOG_NOTICE, "Out of idle IAX2 threads for scheduling!\n");
936 #define schedule_action(func, data) __schedule_action(func, data, __PRETTY_FUNCTION__)
939 static void __send_ping(void *data)
941 int callno = (long)data;
942 send_command_locked(callno, AST_FRAME_IAX, IAX_COMMAND_PING, 0, NULL, 0, -1);
945 static int send_ping(void *data)
947 int callno = (long)data;
949 #ifdef SCHED_MULTITHREADED
950 if (schedule_action(__send_ping, data))
959 static int get_encrypt_methods(const char *s)
962 if (!strcasecmp(s, "aes128"))
963 e = IAX_ENCRYPT_AES128;
964 else if (ast_true(s))
965 e = IAX_ENCRYPT_AES128;
971 static void __send_lagrq(void *data)
973 int callno = (long)data;
974 /* Ping only if it's real not if it's bridged */
975 send_command_locked(callno, AST_FRAME_IAX, IAX_COMMAND_LAGRQ, 0, NULL, 0, -1);
978 static int send_lagrq(void *data)
980 int callno = (long)data;
982 #ifdef SCHED_MULTITHREADED
983 if (schedule_action(__send_lagrq, data))
992 static unsigned char compress_subclass(int subclass)
996 /* If it's 128 or smaller, just return it */
997 if (subclass < IAX_FLAG_SC_LOG)
999 /* Otherwise find its power */
1000 for (x = 0; x < IAX_MAX_SHIFT; x++) {
1001 if (subclass & (1 << x)) {
1003 ast_log(LOG_WARNING, "Can't compress subclass %d\n", subclass);
1009 return power | IAX_FLAG_SC_LOG;
1012 static int uncompress_subclass(unsigned char csub)
1014 /* If the SC_LOG flag is set, return 2^csub otherwise csub */
1015 if (csub & IAX_FLAG_SC_LOG) {
1016 /* special case for 'compressed' -1 */
1020 return 1 << (csub & ~IAX_FLAG_SC_LOG & IAX_MAX_SHIFT);
1026 static struct iax2_peer *find_peer(const char *name, int realtime)
1028 struct iax2_peer *peer = NULL;
1030 /* Grab peer from linked list */
1031 AST_LIST_LOCK(&peers);
1032 AST_LIST_TRAVERSE(&peers, peer, entry) {
1033 if (!strcasecmp(peer->name, name)) {
1037 AST_LIST_UNLOCK(&peers);
1039 /* Now go for realtime if applicable */
1040 if(!peer && realtime)
1041 peer = realtime_peer(name, NULL);
1045 static int iax2_getpeername(struct sockaddr_in sin, char *host, int len, int lockpeer)
1047 struct iax2_peer *peer = NULL;
1051 AST_LIST_LOCK(&peers);
1052 AST_LIST_TRAVERSE(&peers, peer, entry) {
1053 if ((peer->addr.sin_addr.s_addr == sin.sin_addr.s_addr) &&
1054 (peer->addr.sin_port == sin.sin_port)) {
1055 ast_copy_string(host, peer->name, len);
1061 AST_LIST_UNLOCK(&peers);
1063 peer = realtime_peer(NULL, &sin);
1065 ast_copy_string(host, peer->name, len);
1066 if (ast_test_flag(peer, IAX_TEMPONLY))
1075 static struct chan_iax2_pvt *new_iax(struct sockaddr_in *sin, int lockpeer, const char *host)
1077 struct chan_iax2_pvt *tmp;
1080 if (!(tmp = ast_calloc(1, sizeof(*tmp))))
1083 if (ast_string_field_init(tmp, 32)) {
1096 ast_string_field_set(tmp,exten, "s");
1097 ast_string_field_set(tmp,host, host);
1101 jbconf.max_jitterbuf = maxjitterbuffer;
1102 jbconf.resync_threshold = resyncthreshold;
1103 jbconf.max_contig_interp = maxjitterinterps;
1104 jb_setconf(tmp->jb,&jbconf);
1106 AST_LIST_HEAD_INIT_NOLOCK(&tmp->dpentries);
1111 static struct iax_frame *iaxfrdup2(struct iax_frame *fr)
1113 struct iax_frame *new = iax_frame_new(DIRECTION_INGRESS, fr->af.datalen);
1115 size_t mallocd_datalen = new->mallocd_datalen;
1116 memcpy(new, fr, sizeof(*new));
1117 iax_frame_wrap(new, &fr->af);
1118 new->mallocd_datalen = mallocd_datalen;
1121 new->direction = DIRECTION_INGRESS;
1127 #define NEW_PREVENT 0
1131 static int match(struct sockaddr_in *sin, unsigned short callno, unsigned short dcallno, struct chan_iax2_pvt *cur)
1133 if ((cur->addr.sin_addr.s_addr == sin->sin_addr.s_addr) &&
1134 (cur->addr.sin_port == sin->sin_port)) {
1135 /* This is the main host */
1136 if ((cur->peercallno == callno) ||
1137 ((dcallno == cur->callno) && !cur->peercallno)) {
1138 /* That's us. Be sure we keep track of the peer call number */
1142 if ((cur->transfer.sin_addr.s_addr == sin->sin_addr.s_addr) &&
1143 (cur->transfer.sin_port == sin->sin_port) && (cur->transferring)) {
1144 /* We're transferring */
1145 if (dcallno == cur->callno)
1151 static void update_max_trunk(void)
1153 int max = TRUNK_CALL_START;
1155 /* XXX Prolly don't need locks here XXX */
1156 for (x=TRUNK_CALL_START;x<IAX_MAX_CALLS - 1; x++) {
1161 if (option_debug && iaxdebug)
1162 ast_log(LOG_DEBUG, "New max trunk callno is %d\n", max);
1165 static void update_max_nontrunk(void)
1169 /* XXX Prolly don't need locks here XXX */
1170 for (x=1;x<TRUNK_CALL_START - 1; x++) {
1174 maxnontrunkcall = max;
1175 if (option_debug && iaxdebug)
1176 ast_log(LOG_DEBUG, "New max nontrunk callno is %d\n", max);
1179 static int make_trunk(unsigned short callno, int locked)
1184 if (iaxs[callno]->oseqno) {
1185 ast_log(LOG_WARNING, "Can't make trunk once a call has started!\n");
1188 if (callno & TRUNK_CALL_START) {
1189 ast_log(LOG_WARNING, "Call %d is already a trunk\n", callno);
1192 gettimeofday(&now, NULL);
1193 for (x=TRUNK_CALL_START;x<IAX_MAX_CALLS - 1; x++) {
1194 ast_mutex_lock(&iaxsl[x]);
1195 if (!iaxs[x] && ((now.tv_sec - lastused[x].tv_sec) > MIN_REUSE_TIME)) {
1196 iaxs[x] = iaxs[callno];
1197 iaxs[x]->callno = x;
1198 iaxs[callno] = NULL;
1199 /* Update the two timers that should have been started */
1200 if (iaxs[x]->pingid > -1)
1201 ast_sched_del(sched, iaxs[x]->pingid);
1202 if (iaxs[x]->lagid > -1)
1203 ast_sched_del(sched, iaxs[x]->lagid);
1204 iaxs[x]->pingid = ast_sched_add(sched, ping_time * 1000, send_ping, (void *)(long)x);
1205 iaxs[x]->lagid = ast_sched_add(sched, lagrq_time * 1000, send_lagrq, (void *)(long)x);
1207 ast_mutex_unlock(&iaxsl[callno]);
1210 ast_mutex_unlock(&iaxsl[x]);
1213 ast_mutex_unlock(&iaxsl[x]);
1215 if (x >= IAX_MAX_CALLS - 1) {
1216 ast_log(LOG_WARNING, "Unable to trunk call: Insufficient space\n");
1220 ast_log(LOG_DEBUG, "Made call %d into trunk call %d\n", callno, x);
1221 /* We move this call from a non-trunked to a trunked call */
1223 update_max_nontrunk();
1228 * \todo XXX Note that this function contains a very expensive operation that
1229 * happens for *every* incoming media frame. It iterates through every
1230 * possible call number, locking and unlocking each one, to try to match the
1231 * incoming frame to an active call. Call numbers can be up to 2^15, 32768.
1232 * So, for an call with a local call number of 20000, every incoming audio
1233 * frame would require 20000 mutex lock and unlock operations. Ouch.
1235 * It's a shame that IAX2 media frames carry the source call number instead of
1236 * the destination call number. If they did, this lookup wouldn't be needed.
1237 * However, it's too late to change that now. Instead, we need to come up with
1238 * a better way of indexing active calls so that these frequent lookups are not
1241 static int find_callno(unsigned short callno, unsigned short dcallno, struct sockaddr_in *sin, int new, int lockpeer, int sockfd)
1247 if (new <= NEW_ALLOW) {
1248 /* Look for an existing connection first */
1249 for (x=1;(res < 1) && (x<maxnontrunkcall);x++) {
1250 ast_mutex_lock(&iaxsl[x]);
1252 /* Look for an exact match */
1253 if (match(sin, callno, dcallno, iaxs[x])) {
1257 ast_mutex_unlock(&iaxsl[x]);
1259 for (x=TRUNK_CALL_START;(res < 1) && (x<maxtrunkcall);x++) {
1260 ast_mutex_lock(&iaxsl[x]);
1262 /* Look for an exact match */
1263 if (match(sin, callno, dcallno, iaxs[x])) {
1267 ast_mutex_unlock(&iaxsl[x]);
1270 if ((res < 1) && (new >= NEW_ALLOW)) {
1271 if (!iax2_getpeername(*sin, host, sizeof(host), lockpeer))
1272 snprintf(host, sizeof(host), "%s:%d", ast_inet_ntoa(sin->sin_addr), ntohs(sin->sin_port));
1273 gettimeofday(&now, NULL);
1274 for (x=1;x<TRUNK_CALL_START;x++) {
1275 /* Find first unused call number that hasn't been used in a while */
1276 ast_mutex_lock(&iaxsl[x]);
1277 if (!iaxs[x] && ((now.tv_sec - lastused[x].tv_sec) > MIN_REUSE_TIME)) break;
1278 ast_mutex_unlock(&iaxsl[x]);
1280 /* We've still got lock held if we found a spot */
1281 if (x >= TRUNK_CALL_START) {
1282 ast_log(LOG_WARNING, "No more space\n");
1285 iaxs[x] = new_iax(sin, lockpeer, host);
1286 update_max_nontrunk();
1288 if (option_debug && iaxdebug)
1289 ast_log(LOG_DEBUG, "Creating new call structure %d\n", x);
1290 iaxs[x]->sockfd = sockfd;
1291 iaxs[x]->addr.sin_port = sin->sin_port;
1292 iaxs[x]->addr.sin_family = sin->sin_family;
1293 iaxs[x]->addr.sin_addr.s_addr = sin->sin_addr.s_addr;
1294 iaxs[x]->peercallno = callno;
1295 iaxs[x]->callno = x;
1296 iaxs[x]->pingtime = DEFAULT_RETRY_TIME;
1297 iaxs[x]->expiry = min_reg_expire;
1298 iaxs[x]->pingid = ast_sched_add(sched, ping_time * 1000, send_ping, (void *)(long)x);
1299 iaxs[x]->lagid = ast_sched_add(sched, lagrq_time * 1000, send_lagrq, (void *)(long)x);
1300 iaxs[x]->amaflags = amaflags;
1301 ast_copy_flags(iaxs[x], (&globalflags), IAX_NOTRANSFER | IAX_TRANSFERMEDIA | IAX_USEJITTERBUF | IAX_FORCEJITTERBUF);
1303 ast_string_field_set(iaxs[x], accountcode, accountcode);
1304 ast_string_field_set(iaxs[x], mohinterpret, mohinterpret);
1305 ast_string_field_set(iaxs[x], mohsuggest, mohsuggest);
1307 ast_log(LOG_WARNING, "Out of resources\n");
1308 ast_mutex_unlock(&iaxsl[x]);
1311 ast_mutex_unlock(&iaxsl[x]);
1317 static void iax2_frame_free(struct iax_frame *fr)
1319 if (fr->retrans > -1)
1320 ast_sched_del(sched, fr->retrans);
1324 static int iax2_queue_frame(int callno, struct ast_frame *f)
1326 /* Assumes lock for callno is already held... */
1328 if (iaxs[callno] && iaxs[callno]->owner) {
1329 if (ast_mutex_trylock(&iaxs[callno]->owner->lock)) {
1330 /* Avoid deadlock by pausing and trying again */
1331 ast_mutex_unlock(&iaxsl[callno]);
1333 ast_mutex_lock(&iaxsl[callno]);
1335 ast_queue_frame(iaxs[callno]->owner, f);
1336 ast_mutex_unlock(&iaxs[callno]->owner->lock);
1345 static void destroy_firmware(struct iax_firmware *cur)
1347 /* Close firmware */
1349 munmap(cur->fwh, ntohl(cur->fwh->datalen) + sizeof(*(cur->fwh)));
1355 static int try_firmware(char *s)
1358 struct iax_firmware *cur = NULL;
1359 int ifd, fd, res, len, chunk;
1360 struct ast_iax2_firmware_header *fwh, fwh2;
1361 struct MD5Context md5;
1362 unsigned char sum[16], buf[1024];
1365 if (!(s2 = alloca(strlen(s) + 100))) {
1366 ast_log(LOG_WARNING, "Alloca failed!\n");
1370 last = strrchr(s, '/');
1376 snprintf(s2, strlen(s) + 100, "/var/tmp/%s-%ld", last, (unsigned long)ast_random());
1378 if ((res = stat(s, &stbuf) < 0)) {
1379 ast_log(LOG_WARNING, "Failed to stat '%s': %s\n", s, strerror(errno));
1383 /* Make sure it's not a directory */
1384 if (S_ISDIR(stbuf.st_mode))
1386 ifd = open(s, O_RDONLY);
1388 ast_log(LOG_WARNING, "Cannot open '%s': %s\n", s, strerror(errno));
1391 fd = open(s2, O_RDWR | O_CREAT | O_EXCL);
1393 ast_log(LOG_WARNING, "Cannot open '%s' for writing: %s\n", s2, strerror(errno));
1397 /* Unlink our newly created file */
1400 /* Now copy the firmware into it */
1401 len = stbuf.st_size;
1404 if (chunk > sizeof(buf))
1405 chunk = sizeof(buf);
1406 res = read(ifd, buf, chunk);
1408 ast_log(LOG_WARNING, "Only read %d of %d bytes of data :(: %s\n", res, chunk, strerror(errno));
1413 res = write(fd, buf, chunk);
1415 ast_log(LOG_WARNING, "Only write %d of %d bytes of data :(: %s\n", res, chunk, strerror(errno));
1423 /* Return to the beginning */
1424 lseek(fd, 0, SEEK_SET);
1425 if ((res = read(fd, &fwh2, sizeof(fwh2))) != sizeof(fwh2)) {
1426 ast_log(LOG_WARNING, "Unable to read firmware header in '%s'\n", s);
1430 if (ntohl(fwh2.magic) != IAX_FIRMWARE_MAGIC) {
1431 ast_log(LOG_WARNING, "'%s' is not a valid firmware file\n", s);
1435 if (ntohl(fwh2.datalen) != (stbuf.st_size - sizeof(fwh2))) {
1436 ast_log(LOG_WARNING, "Invalid data length in firmware '%s'\n", s);
1440 if (fwh2.devname[sizeof(fwh2.devname) - 1] || ast_strlen_zero((char *)fwh2.devname)) {
1441 ast_log(LOG_WARNING, "No or invalid device type specified for '%s'\n", s);
1445 fwh = mmap(NULL, stbuf.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
1447 ast_log(LOG_WARNING, "mmap failed: %s\n", strerror(errno));
1452 MD5Update(&md5, fwh->data, ntohl(fwh->datalen));
1453 MD5Final(sum, &md5);
1454 if (memcmp(sum, fwh->chksum, sizeof(sum))) {
1455 ast_log(LOG_WARNING, "Firmware file '%s' fails checksum\n", s);
1456 munmap(fwh, stbuf.st_size);
1461 AST_LIST_TRAVERSE(&firmwares, cur, list) {
1462 if (!strcmp((char *)cur->fwh->devname, (char *)fwh->devname)) {
1463 /* Found a candidate */
1464 if (cur->dead || (ntohs(cur->fwh->version) < ntohs(fwh->version)))
1465 /* The version we have on loaded is older, load this one instead */
1467 /* This version is no newer than what we have. Don't worry about it.
1468 We'll consider it a proper load anyhow though */
1469 munmap(fwh, stbuf.st_size);
1475 if (!cur && ((cur = ast_calloc(1, sizeof(*cur))))) {
1477 AST_LIST_INSERT_TAIL(&firmwares, cur, list);
1482 munmap(cur->fwh, cur->mmaplen);
1487 cur->mmaplen = stbuf.st_size;
1494 static int iax_check_version(char *dev)
1497 struct iax_firmware *cur = NULL;
1499 if (ast_strlen_zero(dev))
1502 AST_LIST_LOCK(&firmwares);
1503 AST_LIST_TRAVERSE(&firmwares, cur, list) {
1504 if (!strcmp(dev, (char *)cur->fwh->devname)) {
1505 res = ntohs(cur->fwh->version);
1509 AST_LIST_UNLOCK(&firmwares);
1514 static int iax_firmware_append(struct iax_ie_data *ied, const unsigned char *dev, unsigned int desc)
1517 unsigned int bs = desc & 0xff;
1518 unsigned int start = (desc >> 8) & 0xffffff;
1520 struct iax_firmware *cur;
1522 if (ast_strlen_zero((char *)dev) || !bs)
1527 AST_LIST_LOCK(&firmwares);
1528 AST_LIST_TRAVERSE(&firmwares, cur, list) {
1529 if (strcmp((char *)dev, (char *)cur->fwh->devname))
1531 iax_ie_append_int(ied, IAX_IE_FWBLOCKDESC, desc);
1532 if (start < ntohl(cur->fwh->datalen)) {
1533 bytes = ntohl(cur->fwh->datalen) - start;
1536 iax_ie_append_raw(ied, IAX_IE_FWBLOCKDATA, cur->fwh->data + start, bytes);
1539 iax_ie_append(ied, IAX_IE_FWBLOCKDATA);
1547 AST_LIST_UNLOCK(&firmwares);
1553 static void reload_firmware(void)
1555 struct iax_firmware *cur = NULL;
1558 char dir[256], fn[256];
1560 AST_LIST_LOCK(&firmwares);
1562 /* Mark all as dead */
1563 AST_LIST_TRAVERSE(&firmwares, cur, list)
1566 /* Now that we have marked them dead... load new ones */
1567 snprintf(dir, sizeof(dir), "%s/firmware/iax", (char *)ast_config_AST_DATA_DIR);
1570 while((de = readdir(fwd))) {
1571 if (de->d_name[0] != '.') {
1572 snprintf(fn, sizeof(fn), "%s/%s", dir, de->d_name);
1573 if (!try_firmware(fn)) {
1574 if (option_verbose > 1)
1575 ast_verbose(VERBOSE_PREFIX_2 "Loaded firmware '%s'\n", de->d_name);
1581 ast_log(LOG_WARNING, "Error opening firmware directory '%s': %s\n", dir, strerror(errno));
1583 /* Clean up leftovers */
1584 AST_LIST_TRAVERSE_SAFE_BEGIN(&firmwares, cur, list) {
1587 AST_LIST_REMOVE_CURRENT(&firmwares, list);
1588 destroy_firmware(cur);
1590 AST_LIST_TRAVERSE_SAFE_END
1592 AST_LIST_UNLOCK(&firmwares);
1595 static int __do_deliver(void *data)
1597 /* Just deliver the packet by using queueing. This is called by
1598 the IAX thread with the iaxsl lock held. */
1599 struct iax_frame *fr = data;
1601 fr->af.has_timing_info = 0;
1602 if (iaxs[fr->callno] && !ast_test_flag(iaxs[fr->callno], IAX_ALREADYGONE))
1603 iax2_queue_frame(fr->callno, &fr->af);
1604 /* Free our iax frame */
1605 iax2_frame_free(fr);
1606 /* And don't run again */
1610 static int handle_error(void)
1612 /* XXX Ideally we should figure out why an error occurred and then abort those
1613 rather than continuing to try. Unfortunately, the published interface does
1614 not seem to work XXX */
1616 struct sockaddr_in *sin;
1619 struct sock_extended_err e;
1624 m.msg_controllen = sizeof(e);
1626 res = recvmsg(netsocket, &m, MSG_ERRQUEUE);
1628 ast_log(LOG_WARNING, "Error detected, but unable to read error: %s\n", strerror(errno));
1630 if (m.msg_controllen) {
1631 sin = (struct sockaddr_in *)SO_EE_OFFENDER(&e);
1633 ast_log(LOG_WARNING, "Receive error from %s\n", ast_inet_ntoa(sin->sin_addr));
1635 ast_log(LOG_WARNING, "No address detected??\n");
1637 ast_log(LOG_WARNING, "Local error: %s\n", strerror(e.ee_errno));
1644 static int transmit_trunk(struct iax_frame *f, struct sockaddr_in *sin, int sockfd)
1647 res = sendto(sockfd, f->data, f->datalen, 0,(struct sockaddr *)sin,
1651 ast_log(LOG_DEBUG, "Received error: %s\n", strerror(errno));
1658 static int send_packet(struct iax_frame *f)
1661 int callno = f->callno;
1663 /* Don't send if there was an error, but return error instead */
1664 if (!callno || !iaxs[callno] || iaxs[callno]->error)
1667 /* Called with iaxsl held */
1668 if (option_debug > 2 && iaxdebug)
1669 ast_log(LOG_DEBUG, "Sending %d on %d/%d to %s:%d\n", f->ts, callno, iaxs[callno]->peercallno, ast_inet_ntoa(iaxs[callno]->addr.sin_addr), ntohs(iaxs[callno]->addr.sin_port));
1672 iax_showframe(f, NULL, 0, &iaxs[callno]->transfer, f->datalen - sizeof(struct ast_iax2_full_hdr));
1673 res = sendto(iaxs[callno]->sockfd, f->data, f->datalen, 0,(struct sockaddr *)&iaxs[callno]->transfer,
1674 sizeof(iaxs[callno]->transfer));
1677 iax_showframe(f, NULL, 0, &iaxs[callno]->addr, f->datalen - sizeof(struct ast_iax2_full_hdr));
1678 res = sendto(iaxs[callno]->sockfd, f->data, f->datalen, 0,(struct sockaddr *)&iaxs[callno]->addr,
1679 sizeof(iaxs[callno]->addr));
1682 if (option_debug && iaxdebug)
1683 ast_log(LOG_DEBUG, "Received error: %s\n", strerror(errno));
1690 static void iax2_destroy_helper(struct chan_iax2_pvt *pvt)
1692 struct iax2_user *user = NULL;
1694 /* Decrement AUTHREQ count if needed */
1695 if (ast_test_flag(pvt, IAX_MAXAUTHREQ)) {
1696 AST_LIST_LOCK(&users);
1697 AST_LIST_TRAVERSE(&users, user, entry) {
1698 if (!strcmp(user->name, pvt->username)) {
1703 AST_LIST_UNLOCK(&users);
1704 ast_clear_flag(pvt, IAX_MAXAUTHREQ);
1706 /* No more pings or lagrq's */
1707 if (pvt->pingid > -1)
1708 ast_sched_del(sched, pvt->pingid);
1710 if (pvt->lagid > -1)
1711 ast_sched_del(sched, pvt->lagid);
1713 if (pvt->autoid > -1)
1714 ast_sched_del(sched, pvt->autoid);
1716 if (pvt->authid > -1)
1717 ast_sched_del(sched, pvt->authid);
1719 if (pvt->initid > -1)
1720 ast_sched_del(sched, pvt->initid);
1723 ast_sched_del(sched, pvt->jbid);
1727 static int iax2_predestroy(int callno)
1729 struct ast_channel *c = NULL;
1730 struct chan_iax2_pvt *pvt = iaxs[callno];
1735 if (!ast_test_flag(pvt, IAX_ALREADYGONE)) {
1736 iax2_destroy_helper(pvt);
1737 ast_set_flag(pvt, IAX_ALREADYGONE);
1740 if ((c = pvt->owner)) {
1741 c->_softhangup |= AST_SOFTHANGUP_DEV;
1743 ast_queue_hangup(c);
1750 static void iax2_destroy(int callno)
1752 struct chan_iax2_pvt *pvt = NULL;
1753 struct iax_frame *cur = NULL;
1754 struct ast_channel *owner = NULL;
1758 gettimeofday(&lastused[callno], NULL);
1760 owner = pvt ? pvt->owner : NULL;
1763 if (ast_mutex_trylock(&owner->lock)) {
1764 ast_log(LOG_NOTICE, "Avoiding IAX destroy deadlock\n");
1765 ast_mutex_unlock(&iaxsl[callno]);
1767 ast_mutex_lock(&iaxsl[callno]);
1772 iaxs[callno] = NULL;
1776 iax2_destroy_helper(pvt);
1779 ast_set_flag(pvt, IAX_ALREADYGONE);
1782 /* If there's an owner, prod it to give up */
1783 owner->_softhangup |= AST_SOFTHANGUP_DEV;
1784 ast_queue_hangup(owner);
1787 AST_LIST_TRAVERSE(&iaxq.queue, cur, list) {
1788 /* Cancel any pending transmissions */
1789 if (cur->callno == pvt->callno)
1793 pvt->reg->callno = 0;
1797 ast_variables_destroy(pvt->vars);
1801 while (jb_getall(pvt->jb, &frame) == JB_OK)
1802 iax2_frame_free(frame.data);
1803 jb_destroy(pvt->jb);
1804 /* gotta free up the stringfields */
1805 ast_string_field_free_pools(pvt);
1810 ast_mutex_unlock(&owner->lock);
1812 if (callno & 0x4000)
1816 static int update_packet(struct iax_frame *f)
1818 /* Called with iaxsl lock held, and iaxs[callno] non-NULL */
1819 struct ast_iax2_full_hdr *fh = f->data;
1820 /* Mark this as a retransmission */
1821 fh->dcallno = ntohs(IAX_FLAG_RETRANS | f->dcallno);
1823 f->iseqno = iaxs[f->callno]->iseqno;
1824 fh->iseqno = f->iseqno;
1828 static int attempt_transmit(void *data);
1829 static void __attempt_transmit(void *data)
1831 /* Attempt to transmit the frame to the remote peer...
1832 Called without iaxsl held. */
1833 struct iax_frame *f = data;
1835 int callno = f->callno;
1836 /* Make sure this call is still active */
1838 ast_mutex_lock(&iaxsl[callno]);
1839 if (callno && iaxs[callno]) {
1840 if ((f->retries < 0) /* Already ACK'd */ ||
1841 (f->retries >= max_retries) /* Too many attempts */) {
1842 /* Record an error if we've transmitted too many times */
1843 if (f->retries >= max_retries) {
1845 /* Transfer timeout */
1846 send_command(iaxs[callno], AST_FRAME_IAX, IAX_COMMAND_TXREJ, 0, NULL, 0, -1);
1847 } else if (f->final) {
1849 iax2_destroy(callno);
1851 if (iaxs[callno]->owner)
1852 ast_log(LOG_WARNING, "Max retries exceeded to host %s on %s (type = %d, subclass = %d, ts=%d, seqno=%d)\n", ast_inet_ntoa(iaxs[f->callno]->addr.sin_addr),iaxs[f->callno]->owner->name , f->af.frametype, f->af.subclass, f->ts, f->oseqno);
1853 iaxs[callno]->error = ETIMEDOUT;
1854 if (iaxs[callno]->owner) {
1855 struct ast_frame fr = { 0, };
1857 fr.frametype = AST_FRAME_CONTROL;
1858 fr.subclass = AST_CONTROL_HANGUP;
1859 iax2_queue_frame(callno, &fr);
1860 /* Remember, owner could disappear */
1861 if (iaxs[callno]->owner)
1862 iaxs[callno]->owner->hangupcause = AST_CAUSE_DESTINATION_OUT_OF_ORDER;
1864 if (iaxs[callno]->reg) {
1865 memset(&iaxs[callno]->reg->us, 0, sizeof(iaxs[callno]->reg->us));
1866 iaxs[callno]->reg->regstate = REG_STATE_TIMEOUT;
1867 iaxs[callno]->reg->refresh = IAX_DEFAULT_REG_EXPIRE;
1869 iax2_destroy(callno);
1876 /* Update it if it needs it */
1878 /* Attempt transmission */
1881 /* Try again later after 10 times as long */
1883 if (f->retrytime > MAX_RETRY_TIME)
1884 f->retrytime = MAX_RETRY_TIME;
1885 /* Transfer messages max out at one second */
1886 if (f->transfer && (f->retrytime > 1000))
1887 f->retrytime = 1000;
1888 f->retrans = ast_sched_add(sched, f->retrytime, attempt_transmit, f);
1891 /* Make sure it gets freed */
1896 ast_mutex_unlock(&iaxsl[callno]);
1897 /* Do not try again */
1899 /* Don't attempt delivery, just remove it from the queue */
1900 AST_LIST_LOCK(&iaxq.queue);
1901 AST_LIST_REMOVE(&iaxq.queue, f, list);
1903 AST_LIST_UNLOCK(&iaxq.queue);
1905 /* Free the IAX frame */
1910 static int attempt_transmit(void *data)
1912 #ifdef SCHED_MULTITHREADED
1913 if (schedule_action(__attempt_transmit, data))
1915 __attempt_transmit(data);
1919 static int iax2_prune_realtime(int fd, int argc, char *argv[])
1921 struct iax2_peer *peer;
1924 return RESULT_SHOWUSAGE;
1925 if (!strcmp(argv[3],"all")) {
1927 ast_cli(fd, "OK cache is flushed.\n");
1928 } else if ((peer = find_peer(argv[3], 0))) {
1929 if(ast_test_flag(peer, IAX_RTCACHEFRIENDS)) {
1930 ast_set_flag(peer, IAX_RTAUTOCLEAR);
1931 expire_registry((void*)peer->name);
1932 ast_cli(fd, "OK peer %s was removed from the cache.\n", argv[3]);
1934 ast_cli(fd, "SORRY peer %s is not eligible for this operation.\n", argv[3]);
1937 ast_cli(fd, "SORRY peer %s was not found in the cache.\n", argv[3]);
1940 return RESULT_SUCCESS;
1943 static int iax2_test_losspct(int fd, int argc, char *argv[])
1946 return RESULT_SHOWUSAGE;
1948 test_losspct = atoi(argv[3]);
1950 return RESULT_SUCCESS;
1954 static int iax2_test_late(int fd, int argc, char *argv[])
1957 return RESULT_SHOWUSAGE;
1959 test_late = atoi(argv[3]);
1961 return RESULT_SUCCESS;
1964 static int iax2_test_resync(int fd, int argc, char *argv[])
1967 return RESULT_SHOWUSAGE;
1969 test_resync = atoi(argv[3]);
1971 return RESULT_SUCCESS;
1974 static int iax2_test_jitter(int fd, int argc, char *argv[])
1976 if (argc < 4 || argc > 5)
1977 return RESULT_SHOWUSAGE;
1979 test_jit = atoi(argv[3]);
1981 test_jitpct = atoi(argv[4]);
1983 return RESULT_SUCCESS;
1985 #endif /* IAXTESTS */
1987 /*! \brief peer_status: Report Peer status in character string */
1988 /* returns 1 if peer is online, -1 if unmonitored */
1989 static int peer_status(struct iax2_peer *peer, char *status, int statuslen)
1993 if (peer->lastms < 0) {
1994 ast_copy_string(status, "UNREACHABLE", statuslen);
1995 } else if (peer->lastms > peer->maxms) {
1996 snprintf(status, statuslen, "LAGGED (%d ms)", peer->lastms);
1998 } else if (peer->lastms) {
1999 snprintf(status, statuslen, "OK (%d ms)", peer->lastms);
2002 ast_copy_string(status, "UNKNOWN", statuslen);
2005 ast_copy_string(status, "Unmonitored", statuslen);
2011 /*! \brief Show one peer in detail */
2012 static int iax2_show_peer(int fd, int argc, char *argv[])
2016 struct iax2_peer *peer;
2017 char codec_buf[512];
2018 int x = 0, codec = 0, load_realtime = 0;
2021 return RESULT_SHOWUSAGE;
2023 load_realtime = (argc == 5 && !strcmp(argv[4], "load")) ? 1 : 0;
2025 peer = find_peer(argv[3], load_realtime);
2028 ast_cli(fd, " * Name : %s\n", peer->name);
2029 ast_cli(fd, " Secret : %s\n", ast_strlen_zero(peer->secret)?"<Not set>":"<Set>");
2030 ast_cli(fd, " Context : %s\n", peer->context);
2031 ast_cli(fd, " Mailbox : %s\n", peer->mailbox);
2032 ast_cli(fd, " Dynamic : %s\n", ast_test_flag(peer, IAX_DYNAMIC) ? "Yes":"No");
2033 ast_cli(fd, " Callerid : %s\n", ast_callerid_merge(cbuf, sizeof(cbuf), peer->cid_name, peer->cid_num, "<unspecified>"));
2034 ast_cli(fd, " Expire : %d\n", peer->expire);
2035 ast_cli(fd, " ACL : %s\n", (peer->ha?"Yes":"No"));
2036 ast_cli(fd, " Addr->IP : %s Port %d\n", peer->addr.sin_addr.s_addr ? ast_inet_ntoa(peer->addr.sin_addr) : "(Unspecified)", ntohs(peer->addr.sin_port));
2037 ast_cli(fd, " Defaddr->IP : %s Port %d\n", ast_inet_ntoa(peer->defaddr.sin_addr), ntohs(peer->defaddr.sin_port));
2038 ast_cli(fd, " Username : %s\n", peer->username);
2039 ast_cli(fd, " Codecs : ");
2040 ast_getformatname_multiple(codec_buf, sizeof(codec_buf) -1, peer->capability);
2041 ast_cli(fd, "%s\n", codec_buf);
2043 ast_cli(fd, " Codec Order : (");
2044 for(x = 0; x < 32 ; x++) {
2045 codec = ast_codec_pref_index(&peer->prefs,x);
2048 ast_cli(fd, "%s", ast_getformatname(codec));
2049 if(x < 31 && ast_codec_pref_index(&peer->prefs,x+1))
2054 ast_cli(fd, "none");
2057 ast_cli(fd, " Status : ");
2058 peer_status(peer, status, sizeof(status));
2059 ast_cli(fd, "%s\n",status);
2060 ast_cli(fd, " Qualify : every %dms when OK, every %dms when UNREACHABLE (sample smoothing %s)\n", peer->pokefreqok, peer->pokefreqnotok, peer->smoothing ? "On" : "Off");
2062 if (ast_test_flag(peer, IAX_TEMPONLY))
2065 ast_cli(fd,"Peer %s not found.\n", argv[3]);
2069 return RESULT_SUCCESS;
2072 static char *complete_iax2_show_peer(const char *line, const char *word, int pos, int state)
2075 struct iax2_peer *p = NULL;
2077 int wordlen = strlen(word);
2079 /* 0 - iax2; 1 - show; 2 - peer; 3 - <peername> */
2081 AST_LIST_LOCK(&peers);
2082 AST_LIST_TRAVERSE(&peers, p, entry) {
2083 if (!strncasecmp(p->name, word, wordlen) && ++which > state) {
2084 res = ast_strdup(p->name);
2088 AST_LIST_UNLOCK(&peers);
2094 static int iax2_show_stats(int fd, int argc, char *argv[])
2096 struct iax_frame *cur;
2097 int cnt = 0, dead=0, final=0;
2099 return RESULT_SHOWUSAGE;
2100 AST_LIST_TRAVERSE(&iaxq.queue, cur, list) {
2101 if (cur->retries < 0)
2107 ast_cli(fd, " IAX Statistics\n");
2108 ast_cli(fd, "---------------------\n");
2109 ast_cli(fd, "Outstanding frames: %d (%d ingress, %d egress)\n", iax_get_frames(), iax_get_iframes(), iax_get_oframes());
2110 ast_cli(fd, "%d timed and %d untimed transmits; MTU %d/%d/%d\n", trunk_timed, trunk_untimed,
2111 trunk_maxmtu, trunk_nmaxmtu, global_max_trunk_mtu);
2113 ast_cli(fd, "Packets in transmit queue: %d dead, %d final, %d total\n\n", dead, final, cnt);
2115 trunk_timed = trunk_untimed = 0;
2116 if (trunk_maxmtu > trunk_nmaxmtu)
2117 trunk_nmaxmtu = trunk_maxmtu;
2119 return RESULT_SUCCESS;
2122 /*! \brief Set trunk MTU from CLI */
2123 static int iax2_set_mtu(int fd, int argc, char *argv[])
2128 return RESULT_SHOWUSAGE;
2129 if (strncasecmp(argv[3], "default", strlen(argv[3])) == 0)
2130 mtuv = MAX_TRUNK_MTU;
2132 mtuv = atoi(argv[3]);
2135 ast_cli(fd, "Trunk MTU control disabled (mtu was %d)\n", global_max_trunk_mtu);
2136 global_max_trunk_mtu = 0;
2137 return RESULT_SUCCESS;
2139 if (mtuv < 172 || mtuv > 4000) {
2140 ast_cli(fd, "Trunk MTU must be between 172 and 4000\n");
2141 return RESULT_SHOWUSAGE;
2143 ast_cli(fd, "Trunk MTU changed from %d to %d\n", global_max_trunk_mtu, mtuv);
2144 global_max_trunk_mtu = mtuv;
2145 return RESULT_SUCCESS;
2148 static int iax2_show_cache(int fd, int argc, char *argv[])
2150 struct iax2_dpcache *dp = NULL;
2151 char tmp[1024], *pc = NULL;
2155 gettimeofday(&tv, NULL);
2157 AST_LIST_LOCK(&dpcache);
2159 ast_cli(fd, "%-20.20s %-12.12s %-9.9s %-8.8s %s\n", "Peer/Context", "Exten", "Exp.", "Wait.", "Flags");
2161 AST_LIST_TRAVERSE(&dpcache, dp, cache_list) {
2162 s = dp->expiry.tv_sec - tv.tv_sec;
2164 if (dp->flags & CACHE_FLAG_EXISTS)
2165 strncat(tmp, "EXISTS|", sizeof(tmp) - strlen(tmp) - 1);
2166 if (dp->flags & CACHE_FLAG_NONEXISTENT)
2167 strncat(tmp, "NONEXISTENT|", sizeof(tmp) - strlen(tmp) - 1);
2168 if (dp->flags & CACHE_FLAG_CANEXIST)
2169 strncat(tmp, "CANEXIST|", sizeof(tmp) - strlen(tmp) - 1);
2170 if (dp->flags & CACHE_FLAG_PENDING)
2171 strncat(tmp, "PENDING|", sizeof(tmp) - strlen(tmp) - 1);
2172 if (dp->flags & CACHE_FLAG_TIMEOUT)
2173 strncat(tmp, "TIMEOUT|", sizeof(tmp) - strlen(tmp) - 1);
2174 if (dp->flags & CACHE_FLAG_TRANSMITTED)
2175 strncat(tmp, "TRANSMITTED|", sizeof(tmp) - strlen(tmp) - 1);
2176 if (dp->flags & CACHE_FLAG_MATCHMORE)
2177 strncat(tmp, "MATCHMORE|", sizeof(tmp) - strlen(tmp) - 1);
2178 if (dp->flags & CACHE_FLAG_UNKNOWN)
2179 strncat(tmp, "UNKNOWN|", sizeof(tmp) - strlen(tmp) - 1);
2180 /* Trim trailing pipe */
2181 if (!ast_strlen_zero(tmp))
2182 tmp[strlen(tmp) - 1] = '\0';
2184 ast_copy_string(tmp, "(none)", sizeof(tmp));
2186 pc = strchr(dp->peercontext, '@');
2188 pc = dp->peercontext;
2191 for (x=0;x<sizeof(dp->waiters) / sizeof(dp->waiters[0]); x++)
2192 if (dp->waiters[x] > -1)
2195 ast_cli(fd, "%-20.20s %-12.12s %-9d %-8d %s\n", pc, dp->exten, s, y, tmp);
2197 ast_cli(fd, "%-20.20s %-12.12s %-9.9s %-8d %s\n", pc, dp->exten, "(expired)", y, tmp);
2200 AST_LIST_LOCK(&dpcache);
2202 return RESULT_SUCCESS;
2205 static unsigned int calc_rxstamp(struct chan_iax2_pvt *p, unsigned int offset);
2207 static void unwrap_timestamp(struct iax_frame *fr)
2211 if ( (fr->ts & 0xFFFF0000) == (iaxs[fr->callno]->last & 0xFFFF0000) ) {
2212 x = fr->ts - iaxs[fr->callno]->last;
2214 /* Sudden big jump backwards in timestamp:
2215 What likely happened here is that miniframe timestamp has circled but we haven't
2216 gotten the update from the main packet. We'll just pretend that we did, and
2217 update the timestamp appropriately. */
2218 fr->ts = ( (iaxs[fr->callno]->last & 0xFFFF0000) + 0x10000) | (fr->ts & 0xFFFF);
2219 if (option_debug && iaxdebug)
2220 ast_log(LOG_DEBUG, "schedule_delivery: pushed forward timestamp\n");
2223 /* Sudden apparent big jump forwards in timestamp:
2224 What's likely happened is this is an old miniframe belonging to the previous
2225 top-16-bit timestamp that has turned up out of order.
2226 Adjust the timestamp appropriately. */
2227 fr->ts = ( (iaxs[fr->callno]->last & 0xFFFF0000) - 0x10000) | (fr->ts & 0xFFFF);
2228 if (option_debug && iaxdebug)
2229 ast_log(LOG_DEBUG, "schedule_delivery: pushed back timestamp\n");
2234 static int get_from_jb(void *p);
2236 static void update_jbsched(struct chan_iax2_pvt *pvt)
2240 when = ast_tvdiff_ms(ast_tvnow(), pvt->rxcore);
2242 when = jb_next(pvt->jb) - when;
2244 if(pvt->jbid > -1) ast_sched_del(sched, pvt->jbid);
2247 /* XXX should really just empty until when > 0.. */
2251 pvt->jbid = ast_sched_add(sched, when, get_from_jb, CALLNO_TO_PTR(pvt->callno));
2253 /* Signal scheduler thread */
2254 signal_condition(&sched_lock, &sched_cond);
2257 static void __get_from_jb(void *p)
2259 int callno = PTR_TO_CALLNO(p);
2260 struct chan_iax2_pvt *pvt = NULL;
2261 struct iax_frame *fr;
2268 /* Make sure we have a valid private structure before going on */
2269 ast_mutex_lock(&iaxsl[callno]);
2273 ast_mutex_unlock(&iaxsl[callno]);
2279 gettimeofday(&tv,NULL);
2280 /* round up a millisecond since ast_sched_runq does; */
2281 /* prevents us from spinning while waiting for our now */
2282 /* to catch up with runq's now */
2285 now = ast_tvdiff_ms(tv, pvt->rxcore);
2287 if(now >= (next = jb_next(pvt->jb))) {
2288 ret = jb_get(pvt->jb,&frame,now,ast_codec_interp_len(pvt->voiceformat));
2296 struct ast_frame af;
2298 /* create an interpolation frame */
2299 af.frametype = AST_FRAME_VOICE;
2300 af.subclass = pvt->voiceformat;
2302 af.samples = frame.ms * 8;
2304 af.src = "IAX2 JB interpolation";
2306 af.delivery = ast_tvadd(pvt->rxcore, ast_samp2tv(next, 1000));
2307 af.offset=AST_FRIENDLY_OFFSET;
2309 /* queue the frame: For consistency, we would call __do_deliver here, but __do_deliver wants an iax_frame,
2310 * which we'd need to malloc, and then it would free it. That seems like a drag */
2311 if (!ast_test_flag(iaxs[callno], IAX_ALREADYGONE))
2312 iax2_queue_frame(callno, &af);
2316 iax2_frame_free(frame.data);
2323 /* shouldn't happen */
2327 update_jbsched(pvt);
2328 ast_mutex_unlock(&iaxsl[callno]);
2331 static int get_from_jb(void *data)
2333 #ifdef SCHED_MULTITHREADED
2334 if (schedule_action(__get_from_jb, data))
2336 __get_from_jb(data);
2340 static int schedule_delivery(struct iax_frame *fr, int updatehistory, int fromtrunk, unsigned int *tsout)
2346 /* Attempt to recover wrapped timestamps */
2347 unwrap_timestamp(fr);
2350 /* delivery time is sender's sent timestamp converted back into absolute time according to our clock */
2351 if ( !fromtrunk && !ast_tvzero(iaxs[fr->callno]->rxcore))
2352 fr->af.delivery = ast_tvadd(iaxs[fr->callno]->rxcore, ast_samp2tv(fr->ts, 1000));
2356 ast_log(LOG_DEBUG, "schedule_delivery: set delivery to 0 as we don't have an rxcore yet, or frame is from trunk.\n");
2358 fr->af.delivery = ast_tv(0,0);
2361 type = JB_TYPE_CONTROL;
2364 if(fr->af.frametype == AST_FRAME_VOICE) {
2365 type = JB_TYPE_VOICE;
2366 len = ast_codec_get_samples(&fr->af) / 8;
2367 } else if(fr->af.frametype == AST_FRAME_CNG) {
2368 type = JB_TYPE_SILENCE;
2371 if ( (!ast_test_flag(iaxs[fr->callno], IAX_USEJITTERBUF)) ) {
2378 /* if the user hasn't requested we force the use of the jitterbuffer, and we're bridged to
2379 * a channel that can accept jitter, then flush and suspend the jb, and send this frame straight through */
2380 if( (!ast_test_flag(iaxs[fr->callno], IAX_FORCEJITTERBUF)) &&
2381 iaxs[fr->callno]->owner && ast_bridged_channel(iaxs[fr->callno]->owner) &&
2382 (ast_bridged_channel(iaxs[fr->callno]->owner)->tech->properties & AST_CHAN_TP_WANTSJITTER)) {
2385 /* deliver any frames in the jb */
2386 while(jb_getall(iaxs[fr->callno]->jb,&frame) == JB_OK)
2387 __do_deliver(frame.data);
2389 jb_reset(iaxs[fr->callno]->jb);
2391 if (iaxs[fr->callno]->jbid > -1)
2392 ast_sched_del(sched, iaxs[fr->callno]->jbid);
2394 iaxs[fr->callno]->jbid = -1;
2396 /* deliver this frame now */
2403 /* insert into jitterbuffer */
2404 /* TODO: Perhaps we could act immediately if it's not droppable and late */
2405 ret = jb_put(iaxs[fr->callno]->jb, fr, type, len, fr->ts,
2406 calc_rxstamp(iaxs[fr->callno],fr->ts));
2407 if (ret == JB_DROP) {
2409 } else if (ret == JB_SCHED) {
2410 update_jbsched(iaxs[fr->callno]);
2415 /* Free our iax frame */
2416 iax2_frame_free(fr);
2422 static int iax2_transmit(struct iax_frame *fr)
2424 /* Lock the queue and place this packet at the end */
2425 /* By setting this to 0, the network thread will send it for us, and
2426 queue retransmission if necessary */
2428 AST_LIST_LOCK(&iaxq.queue);
2429 AST_LIST_INSERT_TAIL(&iaxq.queue, fr, list);
2431 AST_LIST_UNLOCK(&iaxq.queue);
2432 /* Wake up the network and scheduler thread */
2433 pthread_kill(netthreadid, SIGURG);
2434 signal_condition(&sched_lock, &sched_cond);
2440 static int iax2_digit_begin(struct ast_channel *c, char digit)
2442 return send_command_locked(PTR_TO_CALLNO(c->tech_pvt), AST_FRAME_DTMF_BEGIN, digit, 0, NULL, 0, -1);
2445 static int iax2_digit_end(struct ast_channel *c, char digit)
2447 return send_command_locked(PTR_TO_CALLNO(c->tech_pvt), AST_FRAME_DTMF_END, digit, 0, NULL, 0, -1);
2450 static int iax2_sendtext(struct ast_channel *c, const char *text)
2453 return send_command_locked(PTR_TO_CALLNO(c->tech_pvt), AST_FRAME_TEXT,
2454 0, 0, (unsigned char *)text, strlen(text) + 1, -1);
2457 static int iax2_sendimage(struct ast_channel *c, struct ast_frame *img)
2459 return send_command_locked(PTR_TO_CALLNO(c->tech_pvt), AST_FRAME_IMAGE, img->subclass, 0, img->data, img->datalen, -1);
2462 static int iax2_sendhtml(struct ast_channel *c, int subclass, const char *data, int datalen)
2464 return send_command_locked(PTR_TO_CALLNO(c->tech_pvt), AST_FRAME_HTML, subclass, 0, (unsigned char *)data, datalen, -1);
2467 static int iax2_fixup(struct ast_channel *oldchannel, struct ast_channel *newchan)
2469 unsigned short callno = PTR_TO_CALLNO(newchan->tech_pvt);
2470 ast_mutex_lock(&iaxsl[callno]);
2472 iaxs[callno]->owner = newchan;
2474 ast_log(LOG_WARNING, "Uh, this isn't a good sign...\n");
2475 ast_mutex_unlock(&iaxsl[callno]);
2479 static struct iax2_peer *realtime_peer(const char *peername, struct sockaddr_in *sin)
2481 struct ast_variable *var;
2482 struct ast_variable *tmp;
2483 struct iax2_peer *peer=NULL;
2484 time_t regseconds = 0, nowtime;
2488 var = ast_load_realtime("iaxpeers", "name", peername, NULL);
2491 sprintf(porta, "%d", ntohs(sin->sin_port));
2492 var = ast_load_realtime("iaxpeers", "ipaddr", ast_inet_ntoa(sin->sin_addr), "port", porta, NULL);
2494 /* We'll need the peer name in order to build the structure! */
2495 for (tmp = var; tmp; tmp = tmp->next) {
2496 if (!strcasecmp(tmp->name, "name"))
2497 peername = tmp->value;
2504 peer = build_peer(peername, var, NULL, ast_test_flag((&globalflags), IAX_RTCACHEFRIENDS) ? 0 : 1);
2509 for (tmp = var; tmp; tmp = tmp->next) {
2510 /* Make sure it's not a user only... */
2511 if (!strcasecmp(tmp->name, "type")) {
2512 if (strcasecmp(tmp->value, "friend") &&
2513 strcasecmp(tmp->value, "peer")) {
2514 /* Whoops, we weren't supposed to exist! */
2519 } else if (!strcasecmp(tmp->name, "regseconds")) {
2520 ast_get_time_t(tmp->value, ®seconds, 0, NULL);
2521 } else if (!strcasecmp(tmp->name, "ipaddr")) {
2522 inet_aton(tmp->value, &(peer->addr.sin_addr));
2523 } else if (!strcasecmp(tmp->name, "port")) {
2524 peer->addr.sin_port = htons(atoi(tmp->value));
2525 } else if (!strcasecmp(tmp->name, "host")) {
2526 if (!strcasecmp(tmp->value, "dynamic"))
2533 ast_variables_destroy(var);
2535 if (ast_test_flag((&globalflags), IAX_RTCACHEFRIENDS)) {
2536 ast_copy_flags(peer, &globalflags, IAX_RTAUTOCLEAR|IAX_RTCACHEFRIENDS);
2537 if (ast_test_flag(peer, IAX_RTAUTOCLEAR)) {
2538 if (peer->expire > -1)
2539 ast_sched_del(sched, peer->expire);
2540 peer->expire = ast_sched_add(sched, (global_rtautoclear) * 1000, expire_registry, (void*)peer->name);
2542 AST_LIST_LOCK(&peers);
2543 AST_LIST_INSERT_HEAD(&peers, peer, entry);
2544 AST_LIST_UNLOCK(&peers);
2545 if (ast_test_flag(peer, IAX_DYNAMIC))
2546 reg_source_db(peer);
2548 ast_set_flag(peer, IAX_TEMPONLY);
2551 if (!ast_test_flag(&globalflags, IAX_RTIGNOREREGEXPIRE) && dynamic) {
2553 if ((nowtime - regseconds) > IAX_DEFAULT_REG_EXPIRE) {
2554 memset(&peer->addr, 0, sizeof(peer->addr));
2555 realtime_update_peer(peer->name, &peer->addr, 0);
2557 ast_log(LOG_DEBUG, "realtime_peer: Bah, '%s' is expired (%d/%d/%d)!\n",
2558 peername, (int)(nowtime - regseconds), (int)regseconds, (int)nowtime);
2562 ast_log(LOG_DEBUG, "realtime_peer: Registration for '%s' still active (%d/%d/%d)!\n",
2563 peername, (int)(nowtime - regseconds), (int)regseconds, (int)nowtime);
2570 static struct iax2_user *realtime_user(const char *username)
2572 struct ast_variable *var;
2573 struct ast_variable *tmp;
2574 struct iax2_user *user=NULL;
2576 var = ast_load_realtime("iaxusers", "name", username, NULL);
2582 /* Make sure it's not a peer only... */
2583 if (!strcasecmp(tmp->name, "type")) {
2584 if (strcasecmp(tmp->value, "friend") &&
2585 strcasecmp(tmp->value, "user")) {
2592 user = build_user(username, var, NULL, !ast_test_flag((&globalflags), IAX_RTCACHEFRIENDS));
2596 ast_variables_destroy(var);
2598 if (ast_test_flag((&globalflags), IAX_RTCACHEFRIENDS)) {
2599 ast_set_flag(user, IAX_RTCACHEFRIENDS);
2600 AST_LIST_LOCK(&users);
2601 AST_LIST_INSERT_HEAD(&users, user, entry);
2602 AST_LIST_UNLOCK(&users);
2604 ast_set_flag(user, IAX_TEMPONLY);
2610 static void realtime_update_peer(const char *peername, struct sockaddr_in *sin, time_t regtime)
2613 char regseconds[20];
2615 snprintf(regseconds, sizeof(regseconds), "%d", (int)regtime);
2616 snprintf(port, sizeof(port), "%d", ntohs(sin->sin_port));
2617 ast_update_realtime("iaxpeers", "name", peername,
2618 "ipaddr", ast_inet_ntoa(sin->sin_addr), "port", port,
2619 "regseconds", regseconds, NULL);
2622 struct create_addr_info {
2635 char context[AST_MAX_CONTEXT];
2636 char peercontext[AST_MAX_CONTEXT];
2637 char mohinterpret[MAX_MUSICCLASS];
2638 char mohsuggest[MAX_MUSICCLASS];
2641 static int create_addr(const char *peername, struct sockaddr_in *sin, struct create_addr_info *cai)
2643 struct ast_hostent ahp;
2645 struct iax2_peer *peer;
2647 ast_clear_flag(cai, IAX_SENDANI | IAX_TRUNK);
2648 cai->sockfd = defaultsockfd;
2650 sin->sin_family = AF_INET;
2652 if (!(peer = find_peer(peername, 1))) {
2655 hp = ast_gethostbyname(peername, &ahp);
2657 memcpy(&sin->sin_addr, hp->h_addr, sizeof(sin->sin_addr));
2658 sin->sin_port = htons(IAX_DEFAULT_PORTNO);
2659 /* use global iax prefs for unknown peer/user */
2660 ast_codec_pref_convert(&prefs, cai->prefs, sizeof(cai->prefs), 1);
2663 ast_log(LOG_WARNING, "No such host: %s\n", peername);
2670 /* if the peer has no address (current or default), return failure */
2671 if (!(peer->addr.sin_addr.s_addr || peer->defaddr.sin_addr.s_addr)) {
2672 if (ast_test_flag(peer, IAX_TEMPONLY))
2677 /* if the peer is being monitored and is currently unreachable, return failure */
2678 if (peer->maxms && ((peer->lastms > peer->maxms) || (peer->lastms < 0))) {
2679 if (ast_test_flag(peer, IAX_TEMPONLY))
2684 ast_copy_flags(cai, peer, IAX_SENDANI | IAX_TRUNK | IAX_NOTRANSFER | IAX_TRANSFERMEDIA | IAX_USEJITTERBUF | IAX_FORCEJITTERBUF);
2685 cai->maxtime = peer->maxms;
2686 cai->capability = peer->capability;
2687 cai->encmethods = peer->encmethods;
2688 cai->sockfd = peer->sockfd;
2689 cai->adsi = peer->adsi;
2690 ast_codec_pref_convert(&peer->prefs, cai->prefs, sizeof(cai->prefs), 1);
2691 ast_copy_string(cai->context, peer->context, sizeof(cai->context));
2692 ast_copy_string(cai->peercontext, peer->peercontext, sizeof(cai->peercontext));
2693 ast_copy_string(cai->username, peer->username, sizeof(cai->username));
2694 ast_copy_string(cai->timezone, peer->zonetag, sizeof(cai->timezone));
2695 ast_copy_string(cai->outkey, peer->outkey, sizeof(cai->outkey));
2696 ast_copy_string(cai->mohinterpret, peer->mohinterpret, sizeof(cai->mohinterpret));
2697 ast_copy_string(cai->mohsuggest, peer->mohsuggest, sizeof(cai->mohsuggest));
2698 if (ast_strlen_zero(peer->dbsecret)) {
2699 ast_copy_string(cai->secret, peer->secret, sizeof(cai->secret));
2704 family = ast_strdupa(peer->dbsecret);
2705 key = strchr(family, '/');
2708 if (!key || ast_db_get(family, key, cai->secret, sizeof(cai->secret))) {
2709 ast_log(LOG_WARNING, "Unable to retrieve database password for family/key '%s'!\n", peer->dbsecret);
2710 if (ast_test_flag(peer, IAX_TEMPONLY))
2716 if (peer->addr.sin_addr.s_addr) {
2717 sin->sin_addr = peer->addr.sin_addr;
2718 sin->sin_port = peer->addr.sin_port;
2720 sin->sin_addr = peer->defaddr.sin_addr;
2721 sin->sin_port = peer->defaddr.sin_port;
2724 if (ast_test_flag(peer, IAX_TEMPONLY))
2730 static void __auto_congest(void *nothing)
2732 int callno = PTR_TO_CALLNO(nothing);
2733 struct ast_frame f = { AST_FRAME_CONTROL, AST_CONTROL_CONGESTION };
2734 ast_mutex_lock(&iaxsl[callno]);
2736 iaxs[callno]->initid = -1;
2737 iax2_queue_frame(callno, &f);
2738 ast_log(LOG_NOTICE, "Auto-congesting call due to slow response\n");
2740 ast_mutex_unlock(&iaxsl[callno]);
2743 static int auto_congest(void *data)
2745 #ifdef SCHED_MULTITHREADED
2746 if (schedule_action(__auto_congest, data))
2748 __auto_congest(data);
2752 static unsigned int iax2_datetime(const char *tz)
2758 localtime_r(&t, &tm);
2759 if (!ast_strlen_zero(tz))
2760 ast_localtime(&t, &tm, tz);
2761 tmp = (tm.tm_sec >> 1) & 0x1f; /* 5 bits of seconds */
2762 tmp |= (tm.tm_min & 0x3f) << 5; /* 6 bits of minutes */
2763 tmp |= (tm.tm_hour & 0x1f) << 11; /* 5 bits of hours */
2764 tmp |= (tm.tm_mday & 0x1f) << 16; /* 5 bits of day of month */
2765 tmp |= ((tm.tm_mon + 1) & 0xf) << 21; /* 4 bits of month */
2766 tmp |= ((tm.tm_year - 100) & 0x7f) << 25; /* 7 bits of year */
2770 struct parsed_dial_string {
2782 * \brief Parses an IAX dial string into its component parts.
2783 * \param data the string to be parsed
2784 * \param pds pointer to a \c struct \c parsed_dial_string to be filled in
2787 * This function parses the string and fills the structure
2788 * with pointers to its component parts. The input string
2791 * \note This function supports both plaintext passwords and RSA
2792 * key names; if the password string is formatted as '[keyname]',
2793 * then the keyname will be placed into the key field, and the
2794 * password field will be set to NULL.
2796 * \note The dial string format is:
2797 * [username[:password]@]peer[:port][/exten[@@context]][/options]
2799 static void parse_dial_string(char *data, struct parsed_dial_string *pds)
2801 if (ast_strlen_zero(data))
2804 pds->peer = strsep(&data, "/");
2805 pds->exten = strsep(&data, "/");
2806 pds->options = data;
2810 pds->exten = strsep(&data, "@");
2811 pds->context = data;
2814 if (strchr(pds->peer, '@')) {
2816 pds->username = strsep(&data, "@");
2820 if (pds->username) {
2821 data = pds->username;
2822 pds->username = strsep(&data, ":");
2823 pds->password = data;
2827 pds->peer = strsep(&data, ":");
2830 /* check for a key name wrapped in [] in the secret position, if found,
2831 move it to the key field instead
2833 if (pds->password && (pds->password[0] == '[')) {
2834 pds->key = ast_strip_quoted(pds->password, "[", "]");
2835 pds->password = NULL;
2839 static int iax2_call(struct ast_channel *c, char *dest, int timeout)
2841 struct sockaddr_in sin;
2842 char *l=NULL, *n=NULL, *tmpstr;
2843 struct iax_ie_data ied;
2844 char *defaultrdest = "s";
2845 unsigned short callno = PTR_TO_CALLNO(c->tech_pvt);
2846 struct parsed_dial_string pds;
2847 struct create_addr_info cai;
2849 if ((c->_state != AST_STATE_DOWN) && (c->_state != AST_STATE_RESERVED)) {
2850 ast_log(LOG_WARNING, "Channel is already in use (%s)?\n", c->name);
2854 memset(&cai, 0, sizeof(cai));
2855 cai.encmethods = iax2_encryption;
2857 memset(&pds, 0, sizeof(pds));
2858 tmpstr = ast_strdupa(dest);
2859 parse_dial_string(tmpstr, &pds);
2862 pds.exten = defaultrdest;
2864 if (create_addr(pds.peer, &sin, &cai)) {
2865 ast_log(LOG_WARNING, "No address associated with '%s'\n", pds.peer);
2869 if (!pds.username && !ast_strlen_zero(cai.username))
2870 pds.username = cai.username;
2871 if (!pds.password && !ast_strlen_zero(cai.secret))
2872 pds.password = cai.secret;
2873 if (!pds.key && !ast_strlen_zero(cai.outkey))
2874 pds.key = cai.outkey;
2875 if (!pds.context && !ast_strlen_zero(cai.peercontext))
2876 pds.context = cai.peercontext;
2878 /* Keep track of the context for outgoing calls too */
2879 ast_copy_string(c->context, cai.context, sizeof(c->context));
2882 sin.sin_port = htons(atoi(pds.port));
2885 n = c->cid.cid_name;
2887 /* Now build request */
2888 memset(&ied, 0, sizeof(ied));
2890 /* On new call, first IE MUST be IAX version of caller */
2891 iax_ie_append_short(&ied, IAX_IE_VERSION, IAX_PROTO_VERSION);
2892 iax_ie_append_str(&ied, IAX_IE_CALLED_NUMBER, pds.exten);
2893 if (pds.options && strchr(pds.options, 'a')) {
2894 /* Request auto answer */
2895 iax_ie_append(&ied, IAX_IE_AUTOANSWER);
2898 iax_ie_append_str(&ied, IAX_IE_CODEC_PREFS, cai.prefs);
2901 iax_ie_append_str(&ied, IAX_IE_CALLING_NUMBER, l);
2902 iax_ie_append_byte(&ied, IAX_IE_CALLINGPRES, c->cid.cid_pres);
2905 iax_ie_append_byte(&ied, IAX_IE_CALLINGPRES, c->cid.cid_pres);
2907 iax_ie_append_byte(&ied, IAX_IE_CALLINGPRES, AST_PRES_NUMBER_NOT_AVAILABLE);
2910 iax_ie_append_byte(&ied, IAX_IE_CALLINGTON, c->cid.cid_ton);
2911 iax_ie_append_short(&ied, IAX_IE_CALLINGTNS, c->cid.cid_tns);
2914 iax_ie_append_str(&ied, IAX_IE_CALLING_NAME, n);
2915 if (ast_test_flag(iaxs[callno], IAX_SENDANI) && c->cid.cid_ani)
2916 iax_ie_append_str(&ied, IAX_IE_CALLING_ANI, c->cid.cid_ani);
2918 if (!ast_strlen_zero(c->language))
2919 iax_ie_append_str(&ied, IAX_IE_LANGUAGE, c->language);
2920 if (!ast_strlen_zero(c->cid.cid_dnid))
2921 iax_ie_append_str(&ied, IAX_IE_DNID, c->cid.cid_dnid);
2922 if (!ast_strlen_zero(c->cid.cid_rdnis))
2923 iax_ie_append_str(&ied, IAX_IE_RDNIS, c->cid.cid_rdnis);
2926 iax_ie_append_str(&ied, IAX_IE_CALLED_CONTEXT, pds.context);
2929 iax_ie_append_str(&ied, IAX_IE_USERNAME, pds.username);
2932 iax_ie_append_short(&ied, IAX_IE_ENCRYPTION, cai.encmethods);
2934 ast_mutex_lock(&iaxsl[callno]);
2936 if (!ast_strlen_zero(c->context))
2937 ast_string_field_set(iaxs[callno], context, c->context);
2940 ast_string_field_set(iaxs[callno], username, pds.username);
2942 iaxs[callno]->encmethods = cai.encmethods;
2944 iaxs[callno]->adsi = cai.adsi;
2946 ast_string_field_set(iaxs[callno], mohinterpret, cai.mohinterpret);
2947 ast_string_field_set(iaxs[callno], mohsuggest, cai.mohsuggest);
2950 ast_string_field_set(iaxs[callno], outkey, pds.key);
2952 ast_string_field_set(iaxs[callno], secret, pds.password);
2954 iax_ie_append_int(&ied, IAX_IE_FORMAT, c->nativeformats);
2955 iax_ie_append_int(&ied, IAX_IE_CAPABILITY, iaxs[callno]->capability);
2956 iax_ie_append_short(&ied, IAX_IE_ADSICPE, c->adsicpe);
2957 iax_ie_append_int(&ied, IAX_IE_DATETIME, iax2_datetime(cai.timezone));
2959 if (iaxs[callno]->maxtime) {
2960 /* Initialize pingtime and auto-congest time */
2961 iaxs[callno]->pingtime = iaxs[callno]->maxtime / 2;
2962 iaxs[callno]->initid = ast_sched_add(sched, iaxs[callno]->maxtime * 2, auto_congest, CALLNO_TO_PTR(callno));
2963 } else if (autokill) {
2964 iaxs[callno]->pingtime = autokill / 2;
2965 iaxs[callno]->initid = ast_sched_add(sched, autokill * 2, auto_congest, CALLNO_TO_PTR(callno));
2968 /* send the command using the appropriate socket for this peer */
2969 iaxs[callno]->sockfd = cai.sockfd;
2971 /* Transmit the string in a "NEW" request */
2972 send_command(iaxs[callno], AST_FRAME_IAX, IAX_COMMAND_NEW, 0, ied.buf, ied.pos, -1);
2974 ast_mutex_unlock(&iaxsl[callno]);
2975 ast_setstate(c, AST_STATE_RINGING);
2980 static int iax2_hangup(struct ast_channel *c)
2982 unsigned short callno = PTR_TO_CALLNO(c->tech_pvt);
2984 struct iax_ie_data ied;
2985 memset(&ied, 0, sizeof(ied));
2986 ast_mutex_lock(&iaxsl[callno]);
2987 if (callno && iaxs[callno]) {
2989 ast_log(LOG_DEBUG, "We're hanging up %s now...\n", c->name);
2990 alreadygone = ast_test_flag(iaxs[callno], IAX_ALREADYGONE);
2991 /* Send the hangup unless we have had a transmission error or are already gone */
2992 iax_ie_append_byte(&ied, IAX_IE_CAUSECODE, (unsigned char)c->hangupcause);
2993 if (!iaxs[callno]->error && !alreadygone)
2994 send_command_final(iaxs[callno], AST_FRAME_IAX, IAX_COMMAND_HANGUP, 0, ied.buf, ied.pos, -1);
2995 /* Explicitly predestroy it */
2996 iax2_predestroy(callno);
2997 /* If we were already gone to begin with, destroy us now */
3000 ast_log(LOG_DEBUG, "Really destroying %s now...\n", c->name);
3001 iax2_destroy(callno);
3004 ast_mutex_unlock(&iaxsl[callno]);
3005 if (option_verbose > 2)
3006 ast_verbose(VERBOSE_PREFIX_3 "Hungup '%s'\n", c->name);
3010 static int iax2_setoption(struct ast_channel *c, int option, void *data, int datalen)
3012 struct ast_option_header *h;
3016 case AST_OPTION_TXGAIN:
3017 case AST_OPTION_RXGAIN:
3018 /* these two cannot be sent, because they require a result */
3022 if (!(h = ast_malloc(datalen + sizeof(*h))))
3025 h->flag = AST_OPTION_FLAG_REQUEST;
3026 h->option = htons(option);
3027 memcpy(h->data, data, datalen);
3028 res = send_command_locked(PTR_TO_CALLNO(c->tech_pvt), AST_FRAME_CONTROL,
3029 AST_CONTROL_OPTION, 0, (unsigned char *) h,
3030 datalen + sizeof(*h), -1);
3036 static struct ast_frame *iax2_read(struct ast_channel *c)
3038 ast_log(LOG_NOTICE, "I should never be called!\n");
3039 return &ast_null_frame;
3042 static int iax2_start_transfer(unsigned short callno0, unsigned short callno1, int mediaonly)
3045 struct iax_ie_data ied0;
3046 struct iax_ie_data ied1;
3047 unsigned int transferid = (unsigned int)ast_random();
3048 memset(&ied0, 0, sizeof(ied0));
3049 iax_ie_append_addr(&ied0, IAX_IE_APPARENT_ADDR, &iaxs[callno1]->addr);
3050 iax_ie_append_short(&ied0, IAX_IE_CALLNO, iaxs[callno1]->peercallno);
3051 iax_ie_append_int(&ied0, IAX_IE_TRANSFERID, transferid);
3053 memset(&ied1, 0, sizeof(ied1));
3054 iax_ie_append_addr(&ied1, IAX_IE_APPARENT_ADDR, &iaxs[callno0]->addr);
3055 iax_ie_append_short(&ied1, IAX_IE_CALLNO, iaxs[callno0]->peercallno);
3056 iax_ie_append_int(&ied1, IAX_IE_TRANSFERID, transferid);
3058 res = send_command(iaxs[callno0], AST_FRAME_IAX, IAX_COMMAND_TXREQ, 0, ied0.buf, ied0.pos, -1);
3061 res = send_command(iaxs[callno1], AST_FRAME_IAX, IAX_COMMAND_TXREQ, 0, ied1.buf, ied1.pos, -1);
3064 iaxs[callno0]->transferring = mediaonly ? TRANSFER_MBEGIN : TRANSFER_BEGIN;
3065 iaxs[callno1]->transferring = mediaonly ? TRANSFER_MBEGIN : TRANSFER_BEGIN;
3069 static void lock_both(unsigned short callno0, unsigned short callno1)
3071 ast_mutex_lock(&iaxsl[callno0]);
3072 while (ast_mutex_trylock(&iaxsl[callno1])) {
3073 ast_mutex_unlock(&iaxsl[callno0]);
3075 ast_mutex_lock(&iaxsl[callno0]);
3079 static void unlock_both(unsigned short callno0, unsigned short callno1)
3081 ast_mutex_unlock(&iaxsl[callno1]);
3082 ast_mutex_unlock(&iaxsl[callno0]);
3085 static enum ast_bridge_result iax2_bridge(struct ast_channel *c0, struct ast_channel *c1, int flags, struct ast_frame **fo, struct ast_channel **rc, int timeoutms)
3087 struct ast_channel *cs[3];
3088 struct ast_channel *who, *other;
3091 int transferstarted=0;
3092 struct ast_frame *f;
3093 unsigned short callno0 = PTR_TO_CALLNO(c0->tech_pvt);
3094 unsigned short callno1 = PTR_TO_CALLNO(c1->tech_pvt);
3095 struct timeval waittimer = {0, 0}, tv;
3097 lock_both(callno0, callno1);
3098 /* Put them in native bridge mode */
3099 if (!flags & (AST_BRIDGE_DTMF_CHANNEL_0 | AST_BRIDGE_DTMF_CHANNEL_1)) {
3100 iaxs[callno0]->bridgecallno = callno1;
3101 iaxs[callno1]->bridgecallno = callno0;
3103 unlock_both(callno0, callno1);
3105 /* If not, try to bridge until we can execute a transfer, if we can */
3108 for (/* ever */;;) {
3109 /* Check in case we got masqueraded into */
3110 if ((c0->tech != &iax2_tech) || (c1->tech != &iax2_tech)) {
3111 if (option_verbose > 2)
3112 ast_verbose(VERBOSE_PREFIX_3 "Can't masquerade, we're different...\n");
3113 /* Remove from native mode */
3114 if (c0->tech == &iax2_tech) {
3115 ast_mutex_lock(&iaxsl[callno0]);
3116 iaxs[callno0]->bridgecallno = 0;
3117 ast_mutex_unlock(&iaxsl[callno0]);
3119 if (c1->tech == &iax2_tech) {
3120 ast_mutex_lock(&iaxsl[callno1]);
3121 iaxs[callno1]->bridgecallno = 0;
3122 ast_mutex_unlock(&iaxsl[callno1]);
3124 return AST_BRIDGE_FAILED_NOWARN;
3126 if (c0->nativeformats != c1->nativeformats) {
3127 if (option_verbose > 2) {
3130 ast_getformatname_multiple(buf0, sizeof(buf0) -1, c0->nativeformats);
3131 ast_getformatname_multiple(buf1, sizeof(buf1) -1, c1->nativeformats);
3132 ast_verbose(VERBOSE_PREFIX_3 "Operating with different codecs %d[%s] %d[%s] , can't native bridge...\n", c0->nativeformats, buf0, c1->nativeformats, buf1);
3134 /* Remove from native mode */
3135 lock_both(callno0, callno1);
3136 iaxs[callno0]->bridgecallno = 0;
3137 iaxs[callno1]->bridgecallno = 0;
3138 unlock_both(callno0, callno1);
3139 return AST_BRIDGE_FAILED_NOWARN;
3141 /* check if transfered and if we really want native bridging */
3142 if (!transferstarted && !ast_test_flag(iaxs[callno0], IAX_NOTRANSFER) && !ast_test_flag(iaxs[callno1], IAX_NOTRANSFER)) {
3143 /* Try the transfer */
3144 if (iax2_start_transfer(callno0, callno1, (flags & (AST_BRIDGE_DTMF_CHANNEL_0 | AST_BRIDGE_DTMF_CHANNEL_1)) ||
3145 ast_test_flag(iaxs[callno0], IAX_TRANSFERMEDIA) | ast_test_flag(iaxs[callno1], IAX_TRANSFERMEDIA)))
3146 ast_log(LOG_WARNING, "Unable to start the transfer\n");
3147 transferstarted = 1;
3149 if ((iaxs[callno0]->transferring == TRANSFER_RELEASED) && (iaxs[callno1]->transferring == TRANSFER_RELEASED)) {
3150 /* Call has been transferred. We're no longer involved */
3151 gettimeofday(&tv, NULL);
3152 if (ast_tvzero(waittimer)) {
3154 } else if (tv.tv_sec - waittimer.tv_sec > IAX_LINGER_TIMEOUT) {
3155 c0->_softhangup |= AST_SOFTHANGUP_DEV;
3156 c1->_softhangup |= AST_SOFTHANGUP_DEV;
3159 res = AST_BRIDGE_COMPLETE;
3164 who = ast_waitfor_n(cs, 2, &to);
3165 if (timeoutms > -1) {
3166 timeoutms -= (1000 - to);
3172 res = AST_BRIDGE_RETRY;
3175 if (ast_check_hangup(c0) || ast_check_hangup(c1)) {
3176 res = AST_BRIDGE_FAILED;
3185 res = AST_BRIDGE_COMPLETE;
3188 if ((f->frametype == AST_FRAME_CONTROL) && !(flags & AST_BRIDGE_IGNORE_SIGS)) {
3191 res = AST_BRIDGE_COMPLETE;
3194 other = (who == c0) ? c1 : c0; /* the 'other' channel */
3195 if ((f->frametype == AST_FRAME_VOICE) ||
3196 (f->frametype == AST_FRAME_TEXT) ||
3197 (f->frametype == AST_FRAME_VIDEO) ||
3198 (f->frametype == AST_FRAME_IMAGE) ||
3199 (f->frametype == AST_FRAME_DTMF)) {
3200 /* monitored dtmf take out of the bridge.
3201 * check if we monitor the specific source.
3203 int monitored_source = (who == c0) ? AST_BRIDGE_DTMF_CHANNEL_0 : AST_BRIDGE_DTMF_CHANNEL_1;
3204 if (f->frametype == AST_FRAME_DTMF && (flags & monitored_source)) {
3207 res = AST_BRIDGE_COMPLETE;
3208 /* Remove from native mode */
3211 /* everything else goes to the other side */
3212 ast_write(other, f);
3215 /* Swap who gets priority */
3220 lock_both(callno0, callno1);
3222 iaxs[callno0]->bridgecallno = 0;
3224 iaxs[callno1]->bridgecallno = 0;
3225 unlock_both(callno0, callno1);
3229 static int iax2_answer(struct ast_channel *c)
3231 unsigned short callno = PTR_TO_CALLNO(c->tech_pvt);
3233 ast_log(LOG_DEBUG, "Answering IAX2 call\n");
3234 return send_command_locked(callno, AST_FRAME_CONTROL, AST_CONTROL_ANSWER, 0, NULL, 0, -1);
3237 static int iax2_indicate(struct ast_channel *c, int condition, const void *data, size_t datalen)
3239 unsigned short callno = PTR_TO_CALLNO(c->tech_pvt);
3241 if (option_debug && iaxdebug)
3242 ast_log(LOG_DEBUG, "Indicating condition %d\n", condition);
3244 if (!strcasecmp(iaxs[callno]->mohinterpret, "passthrough"))
3245 return send_command_locked(callno, AST_FRAME_CONTROL, condition, 0, data, datalen, -1);
3247 switch (condition) {
3248 case AST_CONTROL_HOLD:
3249 ast_moh_start(c, data, iaxs[callno]->mohinterpret);
3251 case AST_CONTROL_UNHOLD:
3255 return send_command_locked(callno, AST_FRAME_CONTROL, condition, 0, data, datalen, -1);
3259 static int iax2_transfer(struct ast_channel *c, const char *dest)
3261 unsigned short callno = PTR_TO_CALLNO(c->tech_pvt);
3262 struct iax_ie_data ied;
3263 char tmp[256], *context;
3264 ast_copy_string(tmp, dest, sizeof(tmp));
3265 context = strchr(tmp, '@');
3270 memset(&ied, 0, sizeof(ied));
3271 iax_ie_append_str(&ied, IAX_IE_CALLED_NUMBER, tmp);
3273 iax_ie_append_str(&ied, IAX_IE_CALLED_CONTEXT, context);
3275 ast_log(LOG_DEBUG, "Transferring '%s' to '%s'\n", c->name, dest);
3276 return send_command_locked(callno, AST_FRAME_IAX, IAX_COMMAND_TRANSFER, 0, ied.buf, ied.pos, -1);
3279 static int iax2_getpeertrunk(struct sockaddr_in sin)
3281 struct iax2_peer *peer = NULL;
3284 AST_LIST_LOCK(&peers);
3285 AST_LIST_TRAVERSE(&peers, peer, entry) {
3286 if ((peer->addr.sin_addr.s_addr == sin.sin_addr.s_addr) &&
3287 (peer->addr.sin_port == sin.sin_port)) {
3288 res = ast_test_flag(peer, IAX_TRUNK);
3292 AST_LIST_UNLOCK(&peers);
3297 /*! \brief Create new call, interface with the PBX core */
3298 static struct ast_channel *ast_iax2_new(int callno, int state, int capability)
3300 struct ast_channel *tmp;
3301 struct chan_iax2_pvt *i;
3302 struct ast_variable *v = NULL;
3304 if (!(i = iaxs[callno])) {
3305 ast_log(LOG_WARNING, "No IAX2 pvt found for callno '%d' !\n", callno);
3309 /* Don't hold call lock */
3310 ast_mutex_unlock(&iaxsl[callno]);
3311 tmp = ast_channel_alloc(1, state, i->cid_num, i->cid_name, "IAX2/%s-%d", i->host, i->callno);
3312 ast_mutex_lock(&iaxsl[callno]);
3315 tmp->tech = &iax2_tech;
3316 /* We can support any format by default, until we get restricted */
3317 tmp->nativeformats = capability;
3318 tmp->readformat = ast_best_codec(capability);
3319 tmp->writeformat = ast_best_codec(capability);
3320 tmp->tech_pvt = CALLNO_TO_PTR(i->callno);
3322 /* Don't use ast_set_callerid() here because it will
3323 * generate a NewCallerID event before the NewChannel event */
3324 tmp->cid.cid_num = ast_strdup(i->cid_num);
3325 tmp->cid.cid_name = ast_strdup(i->cid_name);
3326 if (!ast_strlen_zero(i->ani))
3327 tmp->cid.cid_ani = ast_strdup(i->ani);
3329 tmp->cid.cid_ani = ast_strdup(i->cid_num);
3330 tmp->cid.cid_dnid = ast_strdup(i->dnid);
3331 tmp->cid.cid_rdnis = ast_strdup(i->rdnis);
3332 tmp->cid.cid_pres = i->calling_pres;
3333 tmp->cid.cid_ton = i->calling_ton;
3334 tmp->cid.cid_tns = i->calling_tns;
3335 if (!ast_strlen_zero(i->language))
3336 ast_string_field_set(tmp, language, i->language);
3337 if (!ast_strlen_zero(i->accountcode))
3338 ast_string_field_set(tmp, accountcode, i->accountcode);
3340 tmp->amaflags = i->amaflags;
3341 ast_copy_string(tmp->context, i->context, sizeof(tmp->context));
3342 ast_copy_string(tmp->exten, i->exten, sizeof(tmp->exten));
3344 tmp->adsicpe = i->peeradsicpe;
3346 tmp->adsicpe = AST_ADSI_UNAVAILABLE;
3348 i->capability = capability;
3349 if (state != AST_STATE_DOWN) {
3350 if (ast_pbx_start(tmp)) {
3351 ast_log(LOG_WARNING, "Unable to start PBX on %s\n", tmp->name);
3358 for (v = i->vars ; v ; v = v->next)
3359 pbx_builtin_setvar_helper(tmp, v->name, v->value);
3364 static unsigned int calc_txpeerstamp(struct iax2_trunk_peer *tpeer, int sampms, struct timeval *tv)
3366 unsigned long int mssincetx; /* unsigned to handle overflows */
3369 tpeer->trunkact = *tv;
3370 mssincetx = ast_tvdiff_ms(*tv, tpeer->lasttxtime);
3371 if (mssincetx > 5000 || ast_tvzero(tpeer->txtrunktime)) {
3372 /* If it's been at least 5 seconds since the last time we transmitted on this trunk, reset our timers */
3373 tpeer->txtrunktime = *tv;
3374 tpeer->lastsent = 999999;
3376 /* Update last transmit time now */
3377 tpeer->lasttxtime = *tv;
3379 /* Calculate ms offset */
3380 ms = ast_tvdiff_ms(*tv, tpeer->txtrunktime);
3381 /* Predict from last value */
3382 pred = tpeer->lastsent + sampms;
3383 if (abs(ms - pred) < MAX_TIMESTAMP_SKEW)
3386 /* We never send the same timestamp twice, so fudge a little if we must */
3387 if (ms == tpeer->lastsent)
3388 ms = tpeer->lastsent + 1;
3389 tpeer->lastsent = ms;
3393 static unsigned int fix_peerts(struct timeval *tv, int callno, unsigned int ts)
3395 long ms; /* NOT unsigned */
3396 if (ast_tvzero(iaxs[callno]->rxcore)) {
3397 /* Initialize rxcore time if appropriate */
3398 gettimeofday(&iaxs[callno]->rxcore, NULL);
3399 /* Round to nearest 20ms so traces look pretty */
3400 iaxs[callno]->rxcore.tv_usec -= iaxs[callno]->rxcore.tv_usec % 20000;
3402 /* Calculate difference between trunk and channel */
3403 ms = ast_tvdiff_ms(*tv, iaxs[callno]->rxcore);
3404 /* Return as the sum of trunk time and the difference between trunk and real time */
3408 static unsigned int calc_timestamp(struct chan_iax2_pvt *p, unsigned int ts, struct ast_frame *f)
3414 struct timeval *delivery = NULL;
3417 /* What sort of frame do we have?: voice is self-explanatory
3418 "genuine" means an IAX frame - things like LAGRQ/RP, PING/PONG, ACK
3419 non-genuine frames are CONTROL frames [ringing etc], DTMF
3420 The "genuine" distinction is needed because genuine frames must get a clock-based timestamp,
3421 the others need a timestamp slaved to the voice frames so that they go in sequence
3424 if (f->frametype == AST_FRAME_VOICE) {
3426 delivery = &f->delivery;
3427 } else if (f->frametype == AST_FRAME_IAX) {
3429 } else if (f->frametype == AST_FRAME_CNG) {
3433 if (ast_tvzero(p->offset)) {
3434 gettimeofday(&p->offset, NULL);
3435 /* Round to nearest 20ms for nice looking traces */
3436 p->offset.tv_usec -= p->offset.tv_usec % 20000;
3438 /* If the timestamp is specified, just send it as is */
3441 /* If we have a time that the frame arrived, always use it to make our timestamp */
3442 if (delivery && !ast_tvzero(*delivery)) {
3443 ms = ast_tvdiff_ms(*delivery, p->offset);
3444 if (option_debug > 2 && iaxdebug)
3445 ast_log(LOG_DEBUG, "calc_timestamp: call %d/%d: Timestamp slaved to delivery time\n", p->callno, iaxs[p->callno]->peercallno);
3447 ms = ast_tvdiff_ms(ast_tvnow(), p->offset);
3451 /* On a voice frame, use predicted values if appropriate */
3452 if (p->notsilenttx && abs(ms - p->nextpred) <= MAX_TIMESTAMP_SKEW) {
3453 /* Adjust our txcore, keeping voice and non-voice synchronized */
3455 When we send voice, we usually send "calculated" timestamps worked out
3456 on the basis of the number of samples sent. When we send other frames,
3457 we usually send timestamps worked out from the real clock.
3458 The problem is that they can tend to drift out of step because the
3459 source channel's clock and our clock may not be exactly at the same rate.
3460 We fix this by continuously "tweaking" p->offset. p->offset is "time zero"
3461 for this call. Moving it adjusts timestamps for non-voice frames.
3462 We make the adjustment in the style of a moving average. Each time we
3463 adjust p->offset by 10% of the difference between our clock-derived
3464 timestamp and the predicted timestamp. That's why you see "10000"
3465 below even though IAX2 timestamps are in milliseconds.
3466 The use of a moving average avoids offset moving too radically.
3467 Generally, "adjust" roams back and forth around 0, with offset hardly
3468 changing at all. But if a consistent different starts to develop it
3469 will be eliminated over the course of 10 frames (200-300msecs)
3471 adjust = (ms - p->nextpred);
3473 p->offset = ast_tvsub(p->offset, ast_samp2tv(abs(adjust), 10000));
3474 else if (adjust > 0)
3475 p->offset = ast_tvadd(p->offset, ast_samp2tv(adjust, 10000));
3478 p->nextpred = ms; /*f->samples / 8;*/
3479 if (p->nextpred <= p->lastsent)
3480 p->nextpred = p->lastsent + 3;
3484 /* in this case, just use the actual
3485 * time, since we're either way off
3486 * (shouldn't happen), or we're ending a
3487 * silent period -- and seed the next
3488 * predicted time. Also, round ms to the
3489 * next multiple of frame size (so our
3490 * silent periods are multiples of
3491 * frame size too) */
3493 if (iaxdebug && abs(ms - p->nextpred) > MAX_TIMESTAMP_SKEW )
3494 ast_log(LOG_DEBUG, "predicted timestamp skew (%u) > max (%u), using real ts instead.\n",
3495 abs(ms - p->nextpred), MAX_TIMESTAMP_SKEW);
3497 if (f->samples >= 8) /* check to make sure we dont core dump */
3499 int diff = ms % (f->samples / 8);
3501 ms += f->samples/8 - diff;
3508 /* On a dataframe, use last value + 3 (to accomodate jitter buffer shrinking) if appropriate unless
3509 it's a genuine frame */
3511 /* genuine (IAX LAGRQ etc) must keep their clock-based stamps */
3512 if (ms <= p->lastsent)
3513 ms = p->lastsent + 3;
3514 } else if (abs(ms - p->lastsent) <= MAX_TIMESTAMP_SKEW) {
3515 /* non-genuine frames (!?) (DTMF, CONTROL) should be pulled into the predicted stream stamps */
3516 ms = p->lastsent + 3;
3522 p->nextpred = p->nextpred + f->samples / 8;
3526 static unsigned int calc_rxstamp(struct chan_iax2_pvt *p, unsigned int offset)
3528 /* Returns where in "receive time" we are. That is, how many ms
3529 since we received (or would have received) the frame with timestamp 0 */
3533 #endif /* IAXTESTS */
3534 /* Setup rxcore if necessary */
3535 if (ast_tvzero(p->rxcore)) {
3536 p->rxcore = ast_tvnow();
3537 if (option_debug && iaxdebug)
3538 ast_log(LOG_DEBUG, "calc_rxstamp: call=%d: rxcore set to %d.%6.6d - %dms\n",
3539 p->callno, (int)(p->rxcore.tv_sec), (int)(p->rxcore.tv_usec), offset);
3540 p->rxcore = ast_tvsub(p->rxcore, ast_samp2tv(offset, 1000));
3542 if (option_debug && iaxdebug)
3543 ast_log(LOG_DEBUG, "calc_rxstamp: call=%d: works out as %d.%6.6d\n",
3544 p->callno, (int)(p->rxcore.tv_sec),(int)( p->rxcore.tv_usec));
3548 ms = ast_tvdiff_ms(ast_tvnow(), p->rxcore);
3551 if (!test_jitpct || ((100.0 * ast_random() / (RAND_MAX + 1.0)) < test_jitpct)) {
3552 jit = (int)((float)test_jit * ast_random() / (RAND_MAX + 1.0));
3553 if ((int)(2.0 * ast_random() / (RAND_MAX + 1.0)))
3562 #endif /* IAXTESTS */
3566 static struct iax2_trunk_peer *find_tpeer(struct sockaddr_in *sin, int fd)
3568 struct iax2_trunk_peer *tpeer = NULL;
3570 /* Finds and locks trunk peer */
3571 AST_LIST_LOCK(&tpeers);
3573 AST_LIST_TRAVERSE(&tpeers, tpeer, list) {
3574 if (!inaddrcmp(&tpeer->addr, sin)) {
3575 ast_mutex_lock(&tpeer->lock);
3581 if ((tpeer = ast_calloc(1, sizeof(*tpeer)))) {
3582 ast_mutex_init(&tpeer->lock);
3583 tpeer->lastsent = 9999;
3584 memcpy(&tpeer->addr, sin, sizeof(tpeer->addr));
3585 tpeer->trunkact = ast_tvnow();
3586 ast_mutex_lock(&tpeer->lock);
3589 setsockopt(tpeer->sockfd, SOL_SOCKET, SO_NO_CHECK, &nochecksums, sizeof(nochecksums));
3592 ast_log(LOG_DEBUG, "Created trunk peer for '%s:%d'\n", ast_inet_ntoa(tpeer->addr.sin_addr), ntohs(tpeer->addr.sin_port));
3593 AST_LIST_INSERT_TAIL(&tpeers, tpeer, list);
3597 AST_LIST_UNLOCK(&tpeers);
3602 static int iax2_trunk_queue(struct chan_iax2_pvt *pvt, struct iax_frame *fr)
3604 struct ast_frame *f;
3605 struct iax2_trunk_peer *tpeer;
3609 struct ast_iax2_meta_trunk_entry *met;
3610 struct ast_iax2_meta_trunk_mini *mtm;
3613 tpeer = find_tpeer(&pvt->addr, pvt->sockfd);
3615 if (tpeer->trunkdatalen + f->datalen + 4 >= tpeer->trunkdataalloc) {
3616 /* Need to reallocate space */
3617 if (tpeer->trunkdataalloc < MAX_TRUNKDATA) {
3618 if (!(tmp = ast_realloc(tpeer->trunkdata, tpeer->trunkdataalloc + DEFAULT_TRUNKDATA + IAX2_TRUNK_PREFACE))) {