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>
61 #include "asterisk/zapata.h"
63 #include "asterisk/lock.h"
64 #include "asterisk/frame.h"
65 #include "asterisk/channel.h"
66 #include "asterisk/logger.h"
67 #include "asterisk/module.h"
68 #include "asterisk/pbx.h"
69 #include "asterisk/sched.h"
70 #include "asterisk/io.h"
71 #include "asterisk/config.h"
72 #include "asterisk/options.h"
73 #include "asterisk/cli.h"
74 #include "asterisk/translate.h"
75 #include "asterisk/md5.h"
76 #include "asterisk/cdr.h"
77 #include "asterisk/crypto.h"
78 #include "asterisk/acl.h"
79 #include "asterisk/manager.h"
80 #include "asterisk/callerid.h"
81 #include "asterisk/app.h"
82 #include "asterisk/astdb.h"
83 #include "asterisk/musiconhold.h"
84 #include "asterisk/features.h"
85 #include "asterisk/utils.h"
86 #include "asterisk/causes.h"
87 #include "asterisk/localtime.h"
88 #include "asterisk/aes.h"
89 #include "asterisk/dnsmgr.h"
90 #include "asterisk/devicestate.h"
91 #include "asterisk/netsock.h"
92 #include "asterisk/stringfields.h"
93 #include "asterisk/linkedlists.h"
96 #include "iax2-parser.h"
97 #include "iax2-provision.h"
98 #include "jitterbuf.h"
100 /* Define SCHED_MULTITHREADED to run the scheduler in a special
101 multithreaded mode. */
102 #define SCHED_MULTITHREADED
104 /* Define DEBUG_SCHED_MULTITHREADED to keep track of where each
105 thread is actually doing. */
106 #define DEBUG_SCHED_MULTITHREAD
108 #ifndef IPTOS_MINCOST
109 #define IPTOS_MINCOST 0x02
113 static int nochecksums = 0;
117 #define PTR_TO_CALLNO(a) ((unsigned short)(unsigned long)(a))
118 #define CALLNO_TO_PTR(a) ((void *)(unsigned long)(a))
120 #define DEFAULT_THREAD_COUNT 10
121 #define DEFAULT_MAX_THREAD_COUNT 100
122 #define DEFAULT_RETRY_TIME 1000
123 #define MEMORY_SIZE 100
124 #define DEFAULT_DROP 3
125 /* Flag to use with trunk calls, keeping these calls high up. It halves our effective use
126 but keeps the division between trunked and non-trunked better. */
127 #define TRUNK_CALL_START 0x4000
129 #define DEBUG_SUPPORT
131 #define MIN_REUSE_TIME 60 /* Don't reuse a call number within 60 seconds */
133 /* Sample over last 100 units to determine historic jitter */
136 static struct ast_codec_pref prefs;
138 static const char tdesc[] = "Inter Asterisk eXchange Driver (Ver 2)";
141 /*! \brief Maximum transmission unit for the UDP packet in the trunk not to be
142 fragmented. This is based on 1516 - ethernet - ip - udp - iax minus one g711 frame = 1240 */
143 #define MAX_TRUNK_MTU 1240
145 static int global_max_trunk_mtu; /*!< Maximum MTU, 0 if not used */
146 static int trunk_timed, trunk_untimed, trunk_maxmtu, trunk_nmaxmtu ; /*!< Trunk MTU statistics */
149 static char context[80] = "default";
151 static char language[MAX_LANGUAGE] = "";
152 static char regcontext[AST_MAX_CONTEXT] = "";
154 static int maxauthreq = 3;
155 static int max_retries = 4;
156 static int ping_time = 20;
157 static int lagrq_time = 10;
158 static int maxtrunkcall = TRUNK_CALL_START;
159 static int maxnontrunkcall = 1;
160 static int maxjitterbuffer=1000;
161 static int resyncthreshold=1000;
162 static int maxjitterinterps=10;
163 static int jittertargetextra = 40; /* number of milliseconds the new jitter buffer adds on to its size */
165 #define MAX_TRUNKDATA 640 * 200 /*!< 40ms, uncompressed linear * 200 channels */
167 static int trunkfreq = 20;
168 static int trunkmaxsize = MAX_TRUNKDATA;
170 static int authdebug = 1;
171 static int autokill = 0;
172 static int iaxcompat = 0;
174 static int iaxdefaultdpcache=10 * 60; /* Cache dialplan entries for 10 minutes by default */
176 static int iaxdefaulttimeout = 5; /* Default to wait no more than 5 seconds for a reply to come back */
178 static unsigned int tos = 0;
180 static int min_reg_expire;
181 static int max_reg_expire;
183 static int srvlookup = 0;
185 static int timingfd = -1; /* Timing file descriptor */
187 static struct ast_netsock_list *netsock;
188 static int defaultsockfd = -1;
190 int (*iax2_regfunk)(const char *username, int onoff) = NULL;
193 #define IAX_CAPABILITY_FULLBANDWIDTH 0xFFFF
195 #define IAX_CAPABILITY_MEDBANDWIDTH (IAX_CAPABILITY_FULLBANDWIDTH & \
196 ~AST_FORMAT_SLINEAR & \
201 #define IAX_CAPABILITY_LOWBANDWIDTH (IAX_CAPABILITY_MEDBANDWIDTH & \
203 ~AST_FORMAT_G726_AAL2 & \
206 #define IAX_CAPABILITY_LOWFREE (IAX_CAPABILITY_LOWBANDWIDTH & \
210 #define DEFAULT_MAXMS 2000 /* Must be faster than 2 seconds by default */
211 #define DEFAULT_FREQ_OK 60 * 1000 /* How often to check for the host to be up */
212 #define DEFAULT_FREQ_NOTOK 10 * 1000 /* How often to check, if the host is down... */
214 static struct io_context *io;
215 static struct sched_context *sched;
217 static int iax2_capability = IAX_CAPABILITY_FULLBANDWIDTH;
219 static int iaxdebug = 0;
221 static int iaxtrunkdebug = 0;
223 static int test_losspct = 0;
225 static int test_late = 0;
226 static int test_resync = 0;
227 static int test_jit = 0;
228 static int test_jitpct = 0;
229 #endif /* IAXTESTS */
231 static char accountcode[AST_MAX_ACCOUNT_CODE];
232 static char mohinterpret[MAX_MUSICCLASS];
233 static char mohsuggest[MAX_MUSICCLASS];
234 static int amaflags = 0;
236 static int delayreject = 0;
237 static int iax2_encryption = 0;
239 static struct ast_flags globalflags = { 0 };
241 static pthread_t netthreadid = AST_PTHREADT_NULL;
242 static pthread_t schedthreadid = AST_PTHREADT_NULL;
243 AST_MUTEX_DEFINE_STATIC(sched_lock);
244 static ast_cond_t sched_cond;
247 IAX_STATE_STARTED = (1 << 0),
248 IAX_STATE_AUTHENTICATED = (1 << 1),
249 IAX_STATE_TBD = (1 << 2),
250 IAX_STATE_UNCHANGED = (1 << 3),
253 struct iax2_context {
254 char context[AST_MAX_CONTEXT];
255 struct iax2_context *next;
259 IAX_HASCALLERID = (1 << 0), /*!< CallerID has been specified */
260 IAX_DELME = (1 << 1), /*!< Needs to be deleted */
261 IAX_TEMPONLY = (1 << 2), /*!< Temporary (realtime) */
262 IAX_TRUNK = (1 << 3), /*!< Treat as a trunk */
263 IAX_NOTRANSFER = (1 << 4), /*!< Don't native bridge */
264 IAX_USEJITTERBUF = (1 << 5), /*!< Use jitter buffer */
265 IAX_DYNAMIC = (1 << 6), /*!< dynamic peer */
266 IAX_SENDANI = (1 << 7), /*!< Send ANI along with CallerID */
267 /* (1 << 8) is currently unused due to the deprecation of an old option. Go ahead, take it! */
268 IAX_ALREADYGONE = (1 << 9), /*!< Already disconnected */
269 IAX_PROVISION = (1 << 10), /*!< This is a provisioning request */
270 IAX_QUELCH = (1 << 11), /*!< Whether or not we quelch audio */
271 IAX_ENCRYPTED = (1 << 12), /*!< Whether we should assume encrypted tx/rx */
272 IAX_KEYPOPULATED = (1 << 13), /*!< Whether we have a key populated */
273 IAX_CODEC_USER_FIRST = (1 << 14), /*!< are we willing to let the other guy choose the codec? */
274 IAX_CODEC_NOPREFS = (1 << 15), /*!< Force old behaviour by turning off prefs */
275 IAX_CODEC_NOCAP = (1 << 16), /*!< only consider requested format and ignore capabilities*/
276 IAX_RTCACHEFRIENDS = (1 << 17), /*!< let realtime stay till your reload */
277 IAX_RTUPDATE = (1 << 18), /*!< Send a realtime update */
278 IAX_RTAUTOCLEAR = (1 << 19), /*!< erase me on expire */
279 IAX_FORCEJITTERBUF = (1 << 20), /*!< Force jitterbuffer, even when bridged to a channel that can take jitter */
280 IAX_RTIGNOREREGEXPIRE = (1 << 21), /*!< When using realtime, ignore registration expiration */
281 IAX_TRUNKTIMESTAMPS = (1 << 22), /*!< Send trunk timestamps */
282 IAX_TRANSFERMEDIA = (1 << 23), /*!< When doing IAX2 transfers, transfer media only */
283 IAX_MAXAUTHREQ = (1 << 24), /*!< Maximum outstanding AUTHREQ restriction is in place */
286 static int global_rtautoclear = 120;
288 static int reload_config(void);
289 static int iax2_reload(int fd, int argc, char *argv[]);
293 AST_DECLARE_STRING_FIELDS(
294 AST_STRING_FIELD(name);
295 AST_STRING_FIELD(secret);
296 AST_STRING_FIELD(dbsecret);
297 AST_STRING_FIELD(accountcode);
298 AST_STRING_FIELD(mohinterpret);
299 AST_STRING_FIELD(mohsuggest);
300 AST_STRING_FIELD(inkeys); /*!< Key(s) this user can use to authenticate to us */
301 AST_STRING_FIELD(language);
302 AST_STRING_FIELD(cid_num);
303 AST_STRING_FIELD(cid_name);
312 int maxauthreq; /*!< Maximum allowed outstanding AUTHREQs */
313 int curauthreq; /*!< Current number of outstanding AUTHREQs */
314 struct ast_codec_pref prefs;
316 struct iax2_context *contexts;
317 struct ast_variable *vars;
318 AST_LIST_ENTRY(iax2_user) entry;
322 AST_DECLARE_STRING_FIELDS(
323 AST_STRING_FIELD(name);
324 AST_STRING_FIELD(username);
325 AST_STRING_FIELD(secret);
326 AST_STRING_FIELD(dbsecret);
327 AST_STRING_FIELD(outkey); /*!< What key we use to talk to this peer */
329 AST_STRING_FIELD(regexten); /*!< Extension to register (if regcontext is used) */
330 AST_STRING_FIELD(context); /*!< For transfers only */
331 AST_STRING_FIELD(peercontext); /*!< Context to pass to peer */
332 AST_STRING_FIELD(mailbox); /*!< Mailbox */
333 AST_STRING_FIELD(mohinterpret);
334 AST_STRING_FIELD(mohsuggest);
335 AST_STRING_FIELD(inkeys); /*!< Key(s) this peer can use to authenticate to us */
336 /* Suggested caller id if registering */
337 AST_STRING_FIELD(cid_num); /*!< Default context (for transfer really) */
338 AST_STRING_FIELD(cid_name); /*!< Default context (for transfer really) */
339 AST_STRING_FIELD(zonetag); /*!< Time Zone */
341 struct ast_codec_pref prefs;
342 struct ast_dnsmgr_entry *dnsmgr; /*!< DNS refresh manager */
343 struct sockaddr_in addr;
345 int sockfd; /*!< Socket to use for transmission */
350 /* Dynamic Registration fields */
351 struct sockaddr_in defaddr; /*!< Default address if there is one */
352 int authmethods; /*!< Authentication methods (IAX_AUTH_*) */
353 int encmethods; /*!< Encryption methods (IAX_ENCRYPT_*) */
355 int expire; /*!< Schedule entry for expiry */
356 int expiry; /*!< How soon to expire */
357 int capability; /*!< Capability */
360 int callno; /*!< Call number of POKE request */
361 int pokeexpire; /*!< Scheduled qualification-related task (ie iax2_poke_peer_s or iax2_poke_noanswer) */
362 int lastms; /*!< How long last response took (in ms), or -1 for no response */
363 int maxms; /*!< Max ms we will accept for the host to be up, 0 to not monitor */
365 int pokefreqok; /*!< How often to check if the host is up */
366 int pokefreqnotok; /*!< How often to check when the host has been determined to be down */
367 int historicms; /*!< How long recent average responses took */
368 int smoothing; /*!< Sample over how many units to determine historic ms */
371 AST_LIST_ENTRY(iax2_peer) entry;
374 #define IAX2_TRUNK_PREFACE (sizeof(struct iax_frame) + sizeof(struct ast_iax2_meta_hdr) + sizeof(struct ast_iax2_meta_trunk_hdr))
376 struct iax2_trunk_peer {
379 struct sockaddr_in addr;
380 struct timeval txtrunktime; /*!< Transmit trunktime */
381 struct timeval rxtrunktime; /*!< Receive trunktime */
382 struct timeval lasttxtime; /*!< Last transmitted trunktime */
383 struct timeval trunkact; /*!< Last trunk activity */
384 unsigned int lastsent; /*!< Last sent time */
385 /* Trunk data and length */
386 unsigned char *trunkdata;
387 unsigned int trunkdatalen;
388 unsigned int trunkdataalloc;
392 AST_LIST_ENTRY(iax2_trunk_peer) list;
395 static AST_LIST_HEAD_STATIC(tpeers, iax2_trunk_peer);
397 struct iax_firmware {
398 AST_LIST_ENTRY(iax_firmware) list;
402 struct ast_iax2_firmware_header *fwh;
407 REG_STATE_UNREGISTERED = 0,
410 REG_STATE_REGISTERED,
416 enum iax_transfer_state {
421 TRANSFER_PASSTHROUGH,
425 TRANSFER_MPASSTHROUGH,
430 struct iax2_registry {
431 struct sockaddr_in addr; /*!< Who we connect to for registration purposes */
433 char secret[80]; /*!< Password or key name in []'s */
435 int expire; /*!< Sched ID of expiration */
436 int refresh; /*!< How often to refresh */
437 enum iax_reg_state regstate;
438 int messages; /*!< Message count, low 8 bits = new, high 8 bits = old */
439 int callno; /*!< Associated call number if applicable */
440 struct sockaddr_in us; /*!< Who the server thinks we are */
441 struct ast_dnsmgr_entry *dnsmgr; /*!< DNS refresh manager */
442 AST_LIST_ENTRY(iax2_registry) entry;
445 static AST_LIST_HEAD_STATIC(registrations, iax2_registry);
447 /* Don't retry more frequently than every 10 ms, or less frequently than every 5 seconds */
448 #define MIN_RETRY_TIME 100
449 #define MAX_RETRY_TIME 10000
451 #define MAX_JITTER_BUFFER 50
452 #define MIN_JITTER_BUFFER 10
454 #define DEFAULT_TRUNKDATA 640 * 10 /*!< 40ms, uncompressed linear * 10 channels */
456 #define MAX_TIMESTAMP_SKEW 160 /*!< maximum difference between actual and predicted ts for sending */
458 /* If consecutive voice frame timestamps jump by more than this many milliseconds, then jitter buffer will resync */
459 #define TS_GAP_FOR_JB_RESYNC 5000
461 static int iaxthreadcount = DEFAULT_THREAD_COUNT;
462 static int iaxmaxthreadcount = DEFAULT_MAX_THREAD_COUNT;
463 static int iaxdynamicthreadcount = 0;
464 static int iaxactivethreadcount = 0;
476 struct chan_iax2_pvt {
477 /*! Socket to send/receive on for this call */
479 /*! Last received voice format */
481 /*! Last received video format */
483 /*! Last sent voice format */
485 /*! Last sent video format */
487 /*! What we are capable of sending */
489 /*! Last received timestamp */
491 /*! Last sent timestamp - never send the same timestamp twice in a single call */
492 unsigned int lastsent;
493 /*! Next outgoing timestamp if everything is good */
494 unsigned int nextpred;
495 /*! True if the last voice we transmitted was not silence/CNG */
496 unsigned int notsilenttx:1;
498 unsigned int pingtime;
499 /*! Max time for initial response */
502 struct sockaddr_in addr;
503 /*! Actual used codec preferences */
504 struct ast_codec_pref prefs;
505 /*! Requested codec preferences */
506 struct ast_codec_pref rprefs;
507 /*! Our call number */
508 unsigned short callno;
510 unsigned short peercallno;
511 /*! Peer selected format */
513 /*! Peer capability */
515 /*! timeval that we base our transmission on */
516 struct timeval offset;
517 /*! timeval that we base our delivery on */
518 struct timeval rxcore;
519 /*! The jitterbuffer */
521 /*! active jb read scheduler id */
525 /*! Error, as discovered by the manager */
527 /*! Owner if we have one */
528 struct ast_channel *owner;
529 /*! What's our state? */
530 struct ast_flags state;
531 /*! Expiry (optional) */
533 /*! Next outgoing sequence number */
534 unsigned char oseqno;
535 /*! Next sequence number they have not yet acknowledged */
536 unsigned char rseqno;
537 /*! Next incoming sequence number */
538 unsigned char iseqno;
539 /*! Last incoming sequence number we have acknowledged */
540 unsigned char aseqno;
542 AST_DECLARE_STRING_FIELDS(
544 AST_STRING_FIELD(peer);
545 /*! Default Context */
546 AST_STRING_FIELD(context);
547 /*! Caller ID if available */
548 AST_STRING_FIELD(cid_num);
549 AST_STRING_FIELD(cid_name);
550 /*! Hidden Caller ID (i.e. ANI) if appropriate */
551 AST_STRING_FIELD(ani);
553 AST_STRING_FIELD(dnid);
555 AST_STRING_FIELD(rdnis);
556 /*! Requested Extension */
557 AST_STRING_FIELD(exten);
558 /*! Expected Username */
559 AST_STRING_FIELD(username);
560 /*! Expected Secret */
561 AST_STRING_FIELD(secret);
563 AST_STRING_FIELD(challenge);
564 /*! Public keys permitted keys for incoming authentication */
565 AST_STRING_FIELD(inkeys);
566 /*! Private key for outgoing authentication */
567 AST_STRING_FIELD(outkey);
568 /*! Preferred language */
569 AST_STRING_FIELD(language);
570 /*! Hostname/peername for naming purposes */
571 AST_STRING_FIELD(host);
573 AST_STRING_FIELD(dproot);
574 AST_STRING_FIELD(accountcode);
575 AST_STRING_FIELD(mohinterpret);
576 AST_STRING_FIELD(mohsuggest);
579 /*! permitted authentication methods */
581 /*! permitted encryption methods */
583 /*! Encryption AES-128 Key */
585 /*! Decryption AES-128 Key */
587 /*! 32 bytes of semi-random data */
588 unsigned char semirand[32];
589 /*! Associated registry */
590 struct iax2_registry *reg;
591 /*! Associated peer for poking */
592 struct iax2_peer *peerpoke;
597 /*! Transferring status */
598 enum iax_transfer_state transferring;
599 /*! Transfer identifier */
601 /*! Who we are IAX transferring to */
602 struct sockaddr_in transfer;
603 /*! What's the new call number for the transfer */
604 unsigned short transfercallno;
605 /*! Transfer decrypt AES-128 Key */
606 aes_encrypt_ctx tdcx;
608 /*! Status of knowledge of peer ADSI capability */
611 /*! Who we are bridged to */
612 unsigned short bridgecallno;
614 int pingid; /*!< Transmit PING request */
615 int lagid; /*!< Retransmit lag request */
616 int autoid; /*!< Auto hangup for Dialplan requestor */
617 int authid; /*!< Authentication rejection ID */
618 int authfail; /*!< Reason to report failure */
619 int initid; /*!< Initial peer auto-congest ID (based on qualified peers) */
624 AST_LIST_HEAD_NOLOCK(, iax2_dpcache) dpentries;
625 struct ast_variable *vars;
626 /*! last received remote rr */
627 struct iax_rr remote_rr;
628 /*! Current base time: (just for stats) */
630 /*! Dropped frame count: (just for stats) */
632 /*! received frame count: (just for stats) */
635 AST_LIST_ENTRY(chan_iax2_pvt) entry;
639 /* Somewhat arbitrary prime number */
640 #define PVT_HASH_SIZE 563
641 static AST_RWLIST_HEAD(pvt_list, chan_iax2_pvt) pvt_hash_tbl[PVT_HASH_SIZE];
643 static AST_LIST_HEAD_STATIC(queue, iax_frame);
645 static AST_LIST_HEAD_STATIC(users, iax2_user);
647 static AST_LIST_HEAD_STATIC(peers, iax2_peer);
649 static AST_LIST_HEAD_STATIC(firmwares, iax_firmware);
652 /*! Extension exists */
653 CACHE_FLAG_EXISTS = (1 << 0),
654 /*! Extension is nonexistent */
655 CACHE_FLAG_NONEXISTENT = (1 << 1),
656 /*! Extension can exist */
657 CACHE_FLAG_CANEXIST = (1 << 2),
658 /*! Waiting to hear back response */
659 CACHE_FLAG_PENDING = (1 << 3),
661 CACHE_FLAG_TIMEOUT = (1 << 4),
662 /*! Request transmitted */
663 CACHE_FLAG_TRANSMITTED = (1 << 5),
665 CACHE_FLAG_UNKNOWN = (1 << 6),
667 CACHE_FLAG_MATCHMORE = (1 << 7),
670 struct iax2_dpcache {
671 char peercontext[AST_MAX_CONTEXT];
672 char exten[AST_MAX_EXTENSION];
674 struct timeval expiry;
676 unsigned short callno;
678 AST_LIST_ENTRY(iax2_dpcache) cache_list;
679 AST_LIST_ENTRY(iax2_dpcache) peer_list;
682 static AST_LIST_HEAD_STATIC(dpcache, iax2_dpcache);
684 static void reg_source_db(struct iax2_peer *p);
685 static struct iax2_peer *realtime_peer(const char *peername, struct sockaddr_in *sin);
687 static void destroy_peer(struct iax2_peer *peer);
688 static int ast_cli_netstats(struct mansession *s, int fd, int limit_fmt);
690 enum iax2_thread_iostate {
693 IAX_IOSTATE_PROCESSING,
694 IAX_IOSTATE_SCHEDREADY,
697 enum iax2_thread_type {
698 IAX_THREAD_TYPE_POOL,
699 IAX_THREAD_TYPE_DYNAMIC,
703 AST_LIST_ENTRY(iax2_thread) list;
704 enum iax2_thread_type type;
705 enum iax2_thread_iostate iostate;
706 #ifdef SCHED_MULTITHREADED
707 void (*schedfunc)(void *);
710 #ifdef DEBUG_SCHED_MULTITHREAD
716 struct sockaddr_in iosin;
717 unsigned char buf[4096];
726 static AST_LIST_HEAD_STATIC(idle_list, iax2_thread);
727 static AST_LIST_HEAD_STATIC(active_list, iax2_thread);
728 static AST_LIST_HEAD_STATIC(dynamic_list, iax2_thread);
730 static void *iax2_process_thread(void *data);
732 static void signal_condition(ast_mutex_t *lock, ast_cond_t *cond)
734 ast_mutex_lock(lock);
735 ast_cond_signal(cond);
736 ast_mutex_unlock(lock);
739 static void iax_debug_output(const char *data)
742 ast_verbose("%s", data);
745 static void iax_error_output(const char *data)
747 ast_log(LOG_WARNING, "%s", data);
750 static void jb_error_output(const char *fmt, ...)
756 vsnprintf(buf, sizeof(buf), fmt, args);
759 ast_log(LOG_ERROR, buf);
762 static void jb_warning_output(const char *fmt, ...)
768 vsnprintf(buf, sizeof(buf), fmt, args);
771 ast_log(LOG_WARNING, buf);
774 static void jb_debug_output(const char *fmt, ...)
780 vsnprintf(buf, sizeof(buf), fmt, args);
787 * \brief an array of iax2 pvt structures
789 * The container for active chan_iax2_pvt structures is implemented as an
790 * array for extremely quick direct access to the correct pvt structure
791 * based on the local call number. The local call number is used as the
792 * index into the array where the associated pvt structure is stored.
794 static struct chan_iax2_pvt *iaxs[IAX_MAX_CALLS];
796 * \brief chan_iax2_pvt structure locks
798 * These locks are used when accessing a pvt structure in the iaxs array.
799 * The index used here is the same as used in the iaxs array. It is the
800 * local call number for the associated pvt struct.
802 static ast_mutex_t iaxsl[IAX_MAX_CALLS];
804 * \brief The last time a call number was used
806 * It is important to know the last time that a call number was used locally so
807 * that it is not used again too soon. The reason for this is the same as the
808 * reason that the TCP protocol state machine requires a "TIME WAIT" state.
810 * For example, say that a call is up. Then, the remote side sends a HANGUP,
811 * which we respond to with an ACK. However, there is no way to know whether
812 * the ACK made it there successfully. If it were to get lost, the remote
813 * side may retransmit the HANGUP. If in the meantime, this call number has
814 * been reused locally, given the right set of circumstances, this retransmitted
815 * HANGUP could potentially improperly hang up the new session. So, to avoid
816 * this potential issue, we must wait a specified timeout period before reusing
817 * a local call number.
819 * The specified time that we must wait before reusing a local call number is
820 * defined as MIN_REUSE_TIME, with a default of 60 seconds.
822 static struct timeval lastused[IAX_MAX_CALLS];
824 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);
825 static int expire_registry(void *data);
826 static int iax2_answer(struct ast_channel *c);
827 static int iax2_call(struct ast_channel *c, char *dest, int timeout);
828 static int iax2_devicestate(void *data);
829 static int iax2_digit_begin(struct ast_channel *c, char digit);
830 static int iax2_digit_end(struct ast_channel *c, char digit, unsigned int duration);
831 static int iax2_do_register(struct iax2_registry *reg);
832 static int iax2_fixup(struct ast_channel *oldchannel, struct ast_channel *newchan);
833 static int iax2_hangup(struct ast_channel *c);
834 static int iax2_indicate(struct ast_channel *c, int condition, const void *data, size_t datalen);
835 static int iax2_poke_peer(struct iax2_peer *peer, int heldcall);
836 static int iax2_provision(struct sockaddr_in *end, int sockfd, char *dest, const char *template, int force);
837 static int iax2_send(struct chan_iax2_pvt *pvt, struct ast_frame *f, unsigned int ts, int seqno, int now, int transfer, int final);
838 static int iax2_sendhtml(struct ast_channel *c, int subclass, const char *data, int datalen);
839 static int iax2_sendimage(struct ast_channel *c, struct ast_frame *img);
840 static int iax2_sendtext(struct ast_channel *c, const char *text);
841 static int iax2_setoption(struct ast_channel *c, int option, void *data, int datalen);
842 static int iax2_transfer(struct ast_channel *c, const char *dest);
843 static int iax2_write(struct ast_channel *c, struct ast_frame *f);
844 static int send_trunk(struct iax2_trunk_peer *tpeer, struct timeval *now);
845 static int send_command(struct chan_iax2_pvt *, char, int, unsigned int, const unsigned char *, int, int);
846 static int send_command_final(struct chan_iax2_pvt *, char, int, unsigned int, const unsigned char *, int, int);
847 static int send_command_immediate(struct chan_iax2_pvt *, char, int, unsigned int, const unsigned char *, int, int);
848 static int send_command_locked(unsigned short callno, char, int, unsigned int, const unsigned char *, int, int);
849 static int send_command_transfer(struct chan_iax2_pvt *, char, int, unsigned int, const unsigned char *, int);
850 static struct ast_channel *iax2_request(const char *type, int format, void *data, int *cause);
851 static struct ast_frame *iax2_read(struct ast_channel *c);
852 static struct iax2_peer *build_peer(const char *name, struct ast_variable *v, struct ast_variable *alt, int temponly);
853 static struct iax2_user *build_user(const char *name, struct ast_variable *v, struct ast_variable *alt, int temponly);
854 static void realtime_update_peer(const char *peername, struct sockaddr_in *sin, time_t regtime);
855 static void destroy_user(struct iax2_user *user);
856 static void prune_peers(void);
858 static const struct ast_channel_tech iax2_tech = {
860 .description = tdesc,
861 .capabilities = IAX_CAPABILITY_FULLBANDWIDTH,
862 .properties = AST_CHAN_TP_WANTSJITTER,
863 .requester = iax2_request,
864 .devicestate = iax2_devicestate,
865 .send_digit_begin = iax2_digit_begin,
866 .send_digit_end = iax2_digit_end,
867 .send_text = iax2_sendtext,
868 .send_image = iax2_sendimage,
869 .send_html = iax2_sendhtml,
871 .hangup = iax2_hangup,
872 .answer = iax2_answer,
875 .write_video = iax2_write,
876 .indicate = iax2_indicate,
877 .setoption = iax2_setoption,
878 .bridge = iax2_bridge,
879 .transfer = iax2_transfer,
883 static void insert_idle_thread(struct iax2_thread *thread)
885 if (thread->type == IAX_THREAD_TYPE_DYNAMIC) {
886 AST_LIST_LOCK(&dynamic_list);
887 AST_LIST_INSERT_TAIL(&dynamic_list, thread, list);
888 AST_LIST_UNLOCK(&dynamic_list);
890 AST_LIST_LOCK(&idle_list);
891 AST_LIST_INSERT_TAIL(&idle_list, thread, list);
892 AST_LIST_UNLOCK(&idle_list);
898 static struct iax2_thread *find_idle_thread(void)
901 struct iax2_thread *thread = NULL;
903 /* Pop the head of the idle list off */
904 AST_LIST_LOCK(&idle_list);
905 thread = AST_LIST_REMOVE_HEAD(&idle_list, list);
906 AST_LIST_UNLOCK(&idle_list);
908 /* If we popped a thread off the idle list, just return it */
912 /* Pop the head of the dynamic list off */
913 AST_LIST_LOCK(&dynamic_list);
914 thread = AST_LIST_REMOVE_HEAD(&dynamic_list, list);
915 AST_LIST_UNLOCK(&dynamic_list);
917 /* If we popped a thread off the dynamic list, just return it */
921 /* If we can't create a new dynamic thread for any reason, return no thread at all */
922 if (iaxdynamicthreadcount >= iaxmaxthreadcount || !(thread = ast_calloc(1, sizeof(*thread))))
925 /* Set default values */
926 thread->threadnum = ast_atomic_fetchadd_int(&iaxdynamicthreadcount, 1);
927 thread->type = IAX_THREAD_TYPE_DYNAMIC;
929 /* Initialize lock and condition */
930 ast_mutex_init(&thread->lock);
931 ast_cond_init(&thread->cond, NULL);
933 /* Create thread and send it on it's way */
934 pthread_attr_init(&attr);
935 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
936 if (ast_pthread_create_background(&thread->threadid, &attr, iax2_process_thread, thread)) {
937 ast_cond_destroy(&thread->cond);
938 ast_mutex_destroy(&thread->lock);
946 #ifdef SCHED_MULTITHREADED
947 static int __schedule_action(void (*func)(void *data), void *data, const char *funcname)
949 struct iax2_thread *thread = NULL;
950 static time_t lasterror;
953 thread = find_idle_thread();
955 if (thread != NULL) {
956 thread->schedfunc = func;
957 thread->scheddata = data;
958 thread->iostate = IAX_IOSTATE_SCHEDREADY;
959 #ifdef DEBUG_SCHED_MULTITHREAD
960 ast_copy_string(thread->curfunc, funcname, sizeof(thread->curfunc));
962 signal_condition(&thread->lock, &thread->cond);
967 ast_log(LOG_NOTICE, "Out of idle IAX2 threads for scheduling!\n");
972 #define schedule_action(func, data) __schedule_action(func, data, __PRETTY_FUNCTION__)
975 static int send_ping(void *data);
977 static void __send_ping(void *data)
979 int callno = (long)data;
980 ast_mutex_lock(&iaxsl[callno]);
981 if (iaxs[callno] && iaxs[callno]->pingid != -1) {
982 send_command(iaxs[callno], AST_FRAME_IAX, IAX_COMMAND_PING, 0, NULL, 0, -1);
983 iaxs[callno]->pingid = ast_sched_add(sched, ping_time * 1000, send_ping, data);
985 ast_mutex_unlock(&iaxsl[callno]);
988 static int send_ping(void *data)
990 #ifdef SCHED_MULTITHREADED
991 if (schedule_action(__send_ping, data))
997 static int get_encrypt_methods(const char *s)
1000 if (!strcasecmp(s, "aes128"))
1001 e = IAX_ENCRYPT_AES128;
1002 else if (ast_true(s))
1003 e = IAX_ENCRYPT_AES128;
1009 static int send_lagrq(void *data);
1011 static void __send_lagrq(void *data)
1013 int callno = (long)data;
1014 /* Ping only if it's real not if it's bridged */
1015 ast_mutex_lock(&iaxsl[callno]);
1016 if (iaxs[callno] && iaxs[callno]->lagid != -1) {
1017 send_command(iaxs[callno], AST_FRAME_IAX, IAX_COMMAND_LAGRQ, 0, NULL, 0, -1);
1018 iaxs[callno]->lagid = ast_sched_add(sched, lagrq_time * 1000, send_lagrq, data);
1020 ast_mutex_unlock(&iaxsl[callno]);
1023 static int send_lagrq(void *data)
1025 #ifdef SCHED_MULTITHREADED
1026 if (schedule_action(__send_lagrq, data))
1032 static unsigned char compress_subclass(int subclass)
1036 /* If it's 128 or smaller, just return it */
1037 if (subclass < IAX_FLAG_SC_LOG)
1039 /* Otherwise find its power */
1040 for (x = 0; x < IAX_MAX_SHIFT; x++) {
1041 if (subclass & (1 << x)) {
1043 ast_log(LOG_WARNING, "Can't compress subclass %d\n", subclass);
1049 return power | IAX_FLAG_SC_LOG;
1052 static int uncompress_subclass(unsigned char csub)
1054 /* If the SC_LOG flag is set, return 2^csub otherwise csub */
1055 if (csub & IAX_FLAG_SC_LOG) {
1056 /* special case for 'compressed' -1 */
1060 return 1 << (csub & ~IAX_FLAG_SC_LOG & IAX_MAX_SHIFT);
1066 static struct iax2_peer *find_peer(const char *name, int realtime)
1068 struct iax2_peer *peer = NULL;
1070 /* Grab peer from linked list */
1071 AST_LIST_LOCK(&peers);
1072 AST_LIST_TRAVERSE(&peers, peer, entry) {
1073 if (!strcasecmp(peer->name, name)) {
1077 AST_LIST_UNLOCK(&peers);
1079 /* Now go for realtime if applicable */
1080 if(!peer && realtime)
1081 peer = realtime_peer(name, NULL);
1085 static int iax2_getpeername(struct sockaddr_in sin, char *host, int len, int lockpeer)
1087 struct iax2_peer *peer = NULL;
1091 AST_LIST_LOCK(&peers);
1092 AST_LIST_TRAVERSE(&peers, peer, entry) {
1093 if ((peer->addr.sin_addr.s_addr == sin.sin_addr.s_addr) &&
1094 (peer->addr.sin_port == sin.sin_port)) {
1095 ast_copy_string(host, peer->name, len);
1101 AST_LIST_UNLOCK(&peers);
1103 peer = realtime_peer(NULL, &sin);
1105 ast_copy_string(host, peer->name, len);
1106 if (ast_test_flag(peer, IAX_TEMPONLY))
1115 static struct chan_iax2_pvt *new_iax(struct sockaddr_in *sin, int lockpeer, const char *host)
1117 struct chan_iax2_pvt *tmp;
1120 if (!(tmp = ast_calloc(1, sizeof(*tmp))))
1123 if (ast_string_field_init(tmp, 32)) {
1136 ast_string_field_set(tmp,exten, "s");
1137 ast_string_field_set(tmp,host, host);
1141 jbconf.max_jitterbuf = maxjitterbuffer;
1142 jbconf.resync_threshold = resyncthreshold;
1143 jbconf.max_contig_interp = maxjitterinterps;
1144 jbconf.target_extra = jittertargetextra;
1145 jb_setconf(tmp->jb,&jbconf);
1147 AST_LIST_HEAD_INIT_NOLOCK(&tmp->dpentries);
1152 static struct iax_frame *iaxfrdup2(struct iax_frame *fr)
1154 struct iax_frame *new = iax_frame_new(DIRECTION_INGRESS, fr->af.datalen, fr->cacheable);
1156 size_t mallocd_datalen = new->mallocd_datalen;
1157 memcpy(new, fr, sizeof(*new));
1158 iax_frame_wrap(new, &fr->af);
1159 new->mallocd_datalen = mallocd_datalen;
1162 new->direction = DIRECTION_INGRESS;
1168 #define NEW_PREVENT 0
1172 static int match(struct sockaddr_in *sin, unsigned short callno, unsigned short dcallno, const struct chan_iax2_pvt *cur)
1174 if ((cur->addr.sin_addr.s_addr == sin->sin_addr.s_addr) &&
1175 (cur->addr.sin_port == sin->sin_port)) {
1176 /* This is the main host */
1177 if ((cur->peercallno == callno) ||
1178 ((dcallno == cur->callno) && !cur->peercallno)) {
1179 /* That's us. Be sure we keep track of the peer call number */
1183 if ((cur->transfer.sin_addr.s_addr == sin->sin_addr.s_addr) &&
1184 (cur->transfer.sin_port == sin->sin_port) && (cur->transferring)) {
1185 /* We're transferring */
1186 if (dcallno == cur->callno)
1192 static void update_max_trunk(void)
1194 int max = TRUNK_CALL_START;
1196 /* XXX Prolly don't need locks here XXX */
1197 for (x=TRUNK_CALL_START;x<IAX_MAX_CALLS - 1; x++) {
1202 if (option_debug && iaxdebug)
1203 ast_log(LOG_DEBUG, "New max trunk callno is %d\n", max);
1206 static void update_max_nontrunk(void)
1210 /* XXX Prolly don't need locks here XXX */
1211 for (x=1;x<TRUNK_CALL_START - 1; x++) {
1215 maxnontrunkcall = max;
1216 if (option_debug && iaxdebug)
1217 ast_log(LOG_DEBUG, "New max nontrunk callno is %d\n", max);
1220 static int make_trunk(unsigned short callno, int locked)
1225 if (iaxs[callno]->oseqno) {
1226 ast_log(LOG_WARNING, "Can't make trunk once a call has started!\n");
1229 if (callno & TRUNK_CALL_START) {
1230 ast_log(LOG_WARNING, "Call %d is already a trunk\n", callno);
1233 gettimeofday(&now, NULL);
1234 for (x=TRUNK_CALL_START;x<IAX_MAX_CALLS - 1; x++) {
1235 ast_mutex_lock(&iaxsl[x]);
1236 if (!iaxs[x] && ((now.tv_sec - lastused[x].tv_sec) > MIN_REUSE_TIME)) {
1237 iaxs[x] = iaxs[callno];
1238 iaxs[x]->callno = x;
1239 iaxs[callno] = NULL;
1240 /* Update the two timers that should have been started */
1241 if (iaxs[x]->pingid > -1)
1242 ast_sched_del(sched, iaxs[x]->pingid);
1243 if (iaxs[x]->lagid > -1)
1244 ast_sched_del(sched, iaxs[x]->lagid);
1245 iaxs[x]->pingid = ast_sched_add(sched, ping_time * 1000, send_ping, (void *)(long)x);
1246 iaxs[x]->lagid = ast_sched_add(sched, lagrq_time * 1000, send_lagrq, (void *)(long)x);
1248 ast_mutex_unlock(&iaxsl[callno]);
1251 ast_mutex_unlock(&iaxsl[x]);
1254 ast_mutex_unlock(&iaxsl[x]);
1256 if (x >= IAX_MAX_CALLS - 1) {
1257 ast_log(LOG_WARNING, "Unable to trunk call: Insufficient space\n");
1261 ast_log(LOG_DEBUG, "Made call %d into trunk call %d\n", callno, x);
1262 /* We move this call from a non-trunked to a trunked call */
1264 update_max_nontrunk();
1268 static inline unsigned short peer_hash_val(const struct sockaddr_in *sin, unsigned short callno)
1270 return ( (sin->sin_addr.s_addr >> 16) ^ sin->sin_addr.s_addr ^
1271 sin->sin_port ^ callno ) % PVT_HASH_SIZE;
1274 static inline void hash_on_peer(struct chan_iax2_pvt *pvt)
1277 AST_RWLIST_WRLOCK(&pvt_hash_tbl[pvt->hash]);
1278 AST_RWLIST_REMOVE(&pvt_hash_tbl[pvt->hash], pvt, entry);
1279 AST_RWLIST_UNLOCK(&pvt_hash_tbl[pvt->hash]);
1282 pvt->hash = peer_hash_val(&pvt->addr, pvt->peercallno);
1284 AST_RWLIST_WRLOCK(&pvt_hash_tbl[pvt->hash]);
1285 AST_RWLIST_INSERT_HEAD(&pvt_hash_tbl[pvt->hash], pvt, entry);
1286 AST_RWLIST_UNLOCK(&pvt_hash_tbl[pvt->hash]);
1289 static int find_callno(unsigned short callno, unsigned short dcallno, struct sockaddr_in *sin, int new, int lockpeer, int sockfd)
1295 if (new <= NEW_ALLOW) {
1296 unsigned short hash = peer_hash_val(sin, callno);
1297 const struct chan_iax2_pvt *pvt;
1298 AST_RWLIST_RDLOCK(&pvt_hash_tbl[hash]);
1299 AST_RWLIST_TRAVERSE(&pvt_hash_tbl[hash], pvt, entry) {
1300 ast_mutex_lock(&iaxsl[pvt->callno]);
1301 if (match(sin, callno, dcallno, pvt))
1303 ast_mutex_unlock(&iaxsl[pvt->callno]);
1307 AST_RWLIST_UNLOCK(&pvt_hash_tbl[hash]);
1308 /* Not hashed yet, Look for an existing connection */
1309 for (x=1;(res < 1) && (x<maxnontrunkcall);x++) {
1310 ast_mutex_lock(&iaxsl[x]);
1312 /* Look for an exact match */
1313 if (match(sin, callno, dcallno, iaxs[x])) {
1317 ast_mutex_unlock(&iaxsl[x]);
1319 for (x=TRUNK_CALL_START;(res < 1) && (x<maxtrunkcall);x++) {
1320 ast_mutex_lock(&iaxsl[x]);
1322 /* Look for an exact match */
1323 if (match(sin, callno, dcallno, iaxs[x])) {
1327 ast_mutex_unlock(&iaxsl[x]);
1330 if ((res < 1) && (new >= NEW_ALLOW)) {
1331 if (!iax2_getpeername(*sin, host, sizeof(host), lockpeer))
1332 snprintf(host, sizeof(host), "%s:%d", ast_inet_ntoa(sin->sin_addr), ntohs(sin->sin_port));
1333 gettimeofday(&now, NULL);
1334 for (x=1;x<TRUNK_CALL_START;x++) {
1335 /* Find first unused call number that hasn't been used in a while */
1336 ast_mutex_lock(&iaxsl[x]);
1337 if (!iaxs[x] && ((now.tv_sec - lastused[x].tv_sec) > MIN_REUSE_TIME)) break;
1338 ast_mutex_unlock(&iaxsl[x]);
1340 /* We've still got lock held if we found a spot */
1341 if (x >= TRUNK_CALL_START) {
1342 ast_log(LOG_WARNING, "No more space\n");
1345 iaxs[x] = new_iax(sin, lockpeer, host);
1346 update_max_nontrunk();
1348 if (option_debug && iaxdebug)
1349 ast_log(LOG_DEBUG, "Creating new call structure %d\n", x);
1350 iaxs[x]->sockfd = sockfd;
1351 iaxs[x]->addr.sin_port = sin->sin_port;
1352 iaxs[x]->addr.sin_family = sin->sin_family;
1353 iaxs[x]->addr.sin_addr.s_addr = sin->sin_addr.s_addr;
1354 iaxs[x]->peercallno = callno;
1355 hash_on_peer(iaxs[x]);
1356 iaxs[x]->callno = x;
1357 iaxs[x]->pingtime = DEFAULT_RETRY_TIME;
1358 iaxs[x]->expiry = min_reg_expire;
1359 iaxs[x]->pingid = ast_sched_add(sched, ping_time * 1000, send_ping, (void *)(long)x);
1360 iaxs[x]->lagid = ast_sched_add(sched, lagrq_time * 1000, send_lagrq, (void *)(long)x);
1361 iaxs[x]->amaflags = amaflags;
1362 ast_copy_flags(iaxs[x], (&globalflags), IAX_NOTRANSFER | IAX_TRANSFERMEDIA | IAX_USEJITTERBUF | IAX_FORCEJITTERBUF);
1364 ast_string_field_set(iaxs[x], accountcode, accountcode);
1365 ast_string_field_set(iaxs[x], mohinterpret, mohinterpret);
1366 ast_string_field_set(iaxs[x], mohsuggest, mohsuggest);
1368 ast_log(LOG_WARNING, "Out of resources\n");
1369 ast_mutex_unlock(&iaxsl[x]);
1372 ast_mutex_unlock(&iaxsl[x]);
1378 static void iax2_frame_free(struct iax_frame *fr)
1380 if (fr->retrans > -1)
1381 ast_sched_del(sched, fr->retrans);
1385 static int iax2_queue_frame(int callno, struct ast_frame *f)
1387 /* Assumes lock for callno is already held... */
1389 if (iaxs[callno] && iaxs[callno]->owner) {
1390 if (ast_mutex_trylock(&iaxs[callno]->owner->lock)) {
1391 /* Avoid deadlock by pausing and trying again */
1392 ast_mutex_unlock(&iaxsl[callno]);
1394 ast_mutex_lock(&iaxsl[callno]);
1396 ast_queue_frame(iaxs[callno]->owner, f);
1397 ast_mutex_unlock(&iaxs[callno]->owner->lock);
1406 static void destroy_firmware(struct iax_firmware *cur)
1408 /* Close firmware */
1410 munmap(cur->fwh, ntohl(cur->fwh->datalen) + sizeof(*(cur->fwh)));
1416 static int try_firmware(char *s)
1419 struct iax_firmware *cur = NULL;
1420 int ifd, fd, res, len, chunk;
1421 struct ast_iax2_firmware_header *fwh, fwh2;
1422 struct MD5Context md5;
1423 unsigned char sum[16], buf[1024];
1426 if (!(s2 = alloca(strlen(s) + 100))) {
1427 ast_log(LOG_WARNING, "Alloca failed!\n");
1431 last = strrchr(s, '/');
1437 snprintf(s2, strlen(s) + 100, "/var/tmp/%s-%ld", last, (unsigned long)ast_random());
1439 if ((res = stat(s, &stbuf) < 0)) {
1440 ast_log(LOG_WARNING, "Failed to stat '%s': %s\n", s, strerror(errno));
1444 /* Make sure it's not a directory */
1445 if (S_ISDIR(stbuf.st_mode))
1447 ifd = open(s, O_RDONLY);
1449 ast_log(LOG_WARNING, "Cannot open '%s': %s\n", s, strerror(errno));
1452 fd = open(s2, O_RDWR | O_CREAT | O_EXCL, AST_FILE_MODE);
1454 ast_log(LOG_WARNING, "Cannot open '%s' for writing: %s\n", s2, strerror(errno));
1458 /* Unlink our newly created file */
1461 /* Now copy the firmware into it */
1462 len = stbuf.st_size;
1465 if (chunk > sizeof(buf))
1466 chunk = sizeof(buf);
1467 res = read(ifd, buf, chunk);
1469 ast_log(LOG_WARNING, "Only read %d of %d bytes of data :(: %s\n", res, chunk, strerror(errno));
1474 res = write(fd, buf, chunk);
1476 ast_log(LOG_WARNING, "Only write %d of %d bytes of data :(: %s\n", res, chunk, strerror(errno));
1484 /* Return to the beginning */
1485 lseek(fd, 0, SEEK_SET);
1486 if ((res = read(fd, &fwh2, sizeof(fwh2))) != sizeof(fwh2)) {
1487 ast_log(LOG_WARNING, "Unable to read firmware header in '%s'\n", s);
1491 if (ntohl(fwh2.magic) != IAX_FIRMWARE_MAGIC) {
1492 ast_log(LOG_WARNING, "'%s' is not a valid firmware file\n", s);
1496 if (ntohl(fwh2.datalen) != (stbuf.st_size - sizeof(fwh2))) {
1497 ast_log(LOG_WARNING, "Invalid data length in firmware '%s'\n", s);
1501 if (fwh2.devname[sizeof(fwh2.devname) - 1] || ast_strlen_zero((char *)fwh2.devname)) {
1502 ast_log(LOG_WARNING, "No or invalid device type specified for '%s'\n", s);
1506 fwh = mmap(NULL, stbuf.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
1507 if (fwh == (void *) -1) {
1508 ast_log(LOG_WARNING, "mmap failed: %s\n", strerror(errno));
1513 MD5Update(&md5, fwh->data, ntohl(fwh->datalen));
1514 MD5Final(sum, &md5);
1515 if (memcmp(sum, fwh->chksum, sizeof(sum))) {
1516 ast_log(LOG_WARNING, "Firmware file '%s' fails checksum\n", s);
1517 munmap(fwh, stbuf.st_size);
1522 AST_LIST_TRAVERSE(&firmwares, cur, list) {
1523 if (!strcmp((char *)cur->fwh->devname, (char *)fwh->devname)) {
1524 /* Found a candidate */
1525 if (cur->dead || (ntohs(cur->fwh->version) < ntohs(fwh->version)))
1526 /* The version we have on loaded is older, load this one instead */
1528 /* This version is no newer than what we have. Don't worry about it.
1529 We'll consider it a proper load anyhow though */
1530 munmap(fwh, stbuf.st_size);
1536 if (!cur && ((cur = ast_calloc(1, sizeof(*cur))))) {
1538 AST_LIST_INSERT_TAIL(&firmwares, cur, list);
1543 munmap(cur->fwh, cur->mmaplen);
1548 cur->mmaplen = stbuf.st_size;
1555 static int iax_check_version(char *dev)
1558 struct iax_firmware *cur = NULL;
1560 if (ast_strlen_zero(dev))
1563 AST_LIST_LOCK(&firmwares);
1564 AST_LIST_TRAVERSE(&firmwares, cur, list) {
1565 if (!strcmp(dev, (char *)cur->fwh->devname)) {
1566 res = ntohs(cur->fwh->version);
1570 AST_LIST_UNLOCK(&firmwares);
1575 static int iax_firmware_append(struct iax_ie_data *ied, const unsigned char *dev, unsigned int desc)
1578 unsigned int bs = desc & 0xff;
1579 unsigned int start = (desc >> 8) & 0xffffff;
1581 struct iax_firmware *cur;
1583 if (ast_strlen_zero((char *)dev) || !bs)
1588 AST_LIST_LOCK(&firmwares);
1589 AST_LIST_TRAVERSE(&firmwares, cur, list) {
1590 if (strcmp((char *)dev, (char *)cur->fwh->devname))
1592 iax_ie_append_int(ied, IAX_IE_FWBLOCKDESC, desc);
1593 if (start < ntohl(cur->fwh->datalen)) {
1594 bytes = ntohl(cur->fwh->datalen) - start;
1597 iax_ie_append_raw(ied, IAX_IE_FWBLOCKDATA, cur->fwh->data + start, bytes);
1600 iax_ie_append(ied, IAX_IE_FWBLOCKDATA);
1608 AST_LIST_UNLOCK(&firmwares);
1614 static void reload_firmware(void)
1616 struct iax_firmware *cur = NULL;
1619 char dir[256], fn[256];
1621 AST_LIST_LOCK(&firmwares);
1623 /* Mark all as dead */
1624 AST_LIST_TRAVERSE(&firmwares, cur, list)
1627 /* Now that we have marked them dead... load new ones */
1628 snprintf(dir, sizeof(dir), "%s/firmware/iax", (char *)ast_config_AST_DATA_DIR);
1631 while((de = readdir(fwd))) {
1632 if (de->d_name[0] != '.') {
1633 snprintf(fn, sizeof(fn), "%s/%s", dir, de->d_name);
1634 if (!try_firmware(fn)) {
1635 if (option_verbose > 1)
1636 ast_verbose(VERBOSE_PREFIX_2 "Loaded firmware '%s'\n", de->d_name);
1642 ast_log(LOG_WARNING, "Error opening firmware directory '%s': %s\n", dir, strerror(errno));
1644 /* Clean up leftovers */
1645 AST_LIST_TRAVERSE_SAFE_BEGIN(&firmwares, cur, list) {
1648 AST_LIST_REMOVE_CURRENT(&firmwares, list);
1649 destroy_firmware(cur);
1651 AST_LIST_TRAVERSE_SAFE_END
1653 AST_LIST_UNLOCK(&firmwares);
1656 static int __do_deliver(void *data)
1658 /* Just deliver the packet by using queueing. This is called by
1659 the IAX thread with the iaxsl lock held. */
1660 struct iax_frame *fr = data;
1662 fr->af.has_timing_info = 0;
1663 if (iaxs[fr->callno] && !ast_test_flag(iaxs[fr->callno], IAX_ALREADYGONE))
1664 iax2_queue_frame(fr->callno, &fr->af);
1665 /* Free our iax frame */
1666 iax2_frame_free(fr);
1667 /* And don't run again */
1671 static int handle_error(void)
1673 /* XXX Ideally we should figure out why an error occurred and then abort those
1674 rather than continuing to try. Unfortunately, the published interface does
1675 not seem to work XXX */
1677 struct sockaddr_in *sin;
1680 struct sock_extended_err e;
1685 m.msg_controllen = sizeof(e);
1687 res = recvmsg(netsocket, &m, MSG_ERRQUEUE);
1689 ast_log(LOG_WARNING, "Error detected, but unable to read error: %s\n", strerror(errno));
1691 if (m.msg_controllen) {
1692 sin = (struct sockaddr_in *)SO_EE_OFFENDER(&e);
1694 ast_log(LOG_WARNING, "Receive error from %s\n", ast_inet_ntoa(sin->sin_addr));
1696 ast_log(LOG_WARNING, "No address detected??\n");
1698 ast_log(LOG_WARNING, "Local error: %s\n", strerror(e.ee_errno));
1705 static int transmit_trunk(struct iax_frame *f, struct sockaddr_in *sin, int sockfd)
1708 res = sendto(sockfd, f->data, f->datalen, 0,(struct sockaddr *)sin,
1712 ast_log(LOG_DEBUG, "Received error: %s\n", strerror(errno));
1719 static int send_packet(struct iax_frame *f)
1722 int callno = f->callno;
1724 /* Don't send if there was an error, but return error instead */
1725 if (!callno || !iaxs[callno] || iaxs[callno]->error)
1728 /* Called with iaxsl held */
1729 if (option_debug > 2 && iaxdebug)
1730 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));
1733 iax_showframe(f, NULL, 0, &iaxs[callno]->transfer, f->datalen - sizeof(struct ast_iax2_full_hdr));
1734 res = sendto(iaxs[callno]->sockfd, f->data, f->datalen, 0,(struct sockaddr *)&iaxs[callno]->transfer,
1735 sizeof(iaxs[callno]->transfer));
1738 iax_showframe(f, NULL, 0, &iaxs[callno]->addr, f->datalen - sizeof(struct ast_iax2_full_hdr));
1739 res = sendto(iaxs[callno]->sockfd, f->data, f->datalen, 0,(struct sockaddr *)&iaxs[callno]->addr,
1740 sizeof(iaxs[callno]->addr));
1743 if (option_debug && iaxdebug)
1744 ast_log(LOG_DEBUG, "Received error: %s\n", strerror(errno));
1751 static void iax2_destroy_helper(struct chan_iax2_pvt *pvt)
1753 struct iax2_user *user = NULL;
1755 /* Decrement AUTHREQ count if needed */
1756 if (ast_test_flag(pvt, IAX_MAXAUTHREQ)) {
1757 AST_LIST_LOCK(&users);
1758 AST_LIST_TRAVERSE(&users, user, entry) {
1759 if (!strcmp(user->name, pvt->username)) {
1764 AST_LIST_UNLOCK(&users);
1765 ast_clear_flag(pvt, IAX_MAXAUTHREQ);
1767 /* No more pings or lagrq's */
1768 if (pvt->pingid > -1)
1769 ast_sched_del(sched, pvt->pingid);
1771 if (pvt->lagid > -1)
1772 ast_sched_del(sched, pvt->lagid);
1774 if (pvt->autoid > -1)
1775 ast_sched_del(sched, pvt->autoid);
1777 if (pvt->authid > -1)
1778 ast_sched_del(sched, pvt->authid);
1780 if (pvt->initid > -1)
1781 ast_sched_del(sched, pvt->initid);
1784 ast_sched_del(sched, pvt->jbid);
1788 static int iax2_predestroy(int callno)
1790 struct ast_channel *c = NULL;
1791 struct chan_iax2_pvt *pvt = iaxs[callno];
1796 if (!ast_test_flag(pvt, IAX_ALREADYGONE)) {
1797 iax2_destroy_helper(pvt);
1798 ast_set_flag(pvt, IAX_ALREADYGONE);
1801 if ((c = pvt->owner)) {
1802 c->_softhangup |= AST_SOFTHANGUP_DEV;
1804 ast_queue_hangup(c);
1806 ast_module_unref(ast_module_info->self);
1812 static void iax2_destroy(int callno)
1814 struct chan_iax2_pvt *pvt = NULL;
1815 struct iax_frame *cur = NULL;
1816 struct ast_channel *owner = NULL;
1820 gettimeofday(&lastused[callno], NULL);
1822 owner = pvt ? pvt->owner : NULL;
1825 if (ast_mutex_trylock(&owner->lock)) {
1826 ast_log(LOG_NOTICE, "Avoiding IAX destroy deadlock\n");
1827 ast_mutex_unlock(&iaxsl[callno]);
1829 ast_mutex_lock(&iaxsl[callno]);
1834 iaxs[callno] = NULL;
1838 iax2_destroy_helper(pvt);
1841 AST_RWLIST_WRLOCK(&pvt_hash_tbl[pvt->hash]);
1842 AST_RWLIST_REMOVE(&pvt_hash_tbl[pvt->hash], pvt, entry);
1843 AST_RWLIST_UNLOCK(&pvt_hash_tbl[pvt->hash]);
1847 ast_set_flag(pvt, IAX_ALREADYGONE);
1850 /* If there's an owner, prod it to give up */
1851 owner->_softhangup |= AST_SOFTHANGUP_DEV;
1852 ast_queue_hangup(owner);
1855 AST_LIST_LOCK(&queue);
1856 AST_LIST_TRAVERSE(&queue, cur, list) {
1857 /* Cancel any pending transmissions */
1858 if (cur->callno == pvt->callno)
1861 AST_LIST_UNLOCK(&queue);
1864 pvt->reg->callno = 0;
1868 ast_variables_destroy(pvt->vars);
1872 while (jb_getall(pvt->jb, &frame) == JB_OK)
1873 iax2_frame_free(frame.data);
1874 jb_destroy(pvt->jb);
1875 /* gotta free up the stringfields */
1876 ast_string_field_free_pools(pvt);
1881 ast_mutex_unlock(&owner->lock);
1883 if (callno & 0x4000)
1887 static int update_packet(struct iax_frame *f)
1889 /* Called with iaxsl lock held, and iaxs[callno] non-NULL */
1890 struct ast_iax2_full_hdr *fh = f->data;
1891 /* Mark this as a retransmission */
1892 fh->dcallno = ntohs(IAX_FLAG_RETRANS | f->dcallno);
1894 f->iseqno = iaxs[f->callno]->iseqno;
1895 fh->iseqno = f->iseqno;
1899 static int attempt_transmit(void *data);
1900 static void __attempt_transmit(void *data)
1902 /* Attempt to transmit the frame to the remote peer...
1903 Called without iaxsl held. */
1904 struct iax_frame *f = data;
1906 int callno = f->callno;
1907 /* Make sure this call is still active */
1909 ast_mutex_lock(&iaxsl[callno]);
1910 if (callno && iaxs[callno]) {
1911 if ((f->retries < 0) /* Already ACK'd */ ||
1912 (f->retries >= max_retries) /* Too many attempts */) {
1913 /* Record an error if we've transmitted too many times */
1914 if (f->retries >= max_retries) {
1916 /* Transfer timeout */
1917 send_command(iaxs[callno], AST_FRAME_IAX, IAX_COMMAND_TXREJ, 0, NULL, 0, -1);
1918 } else if (f->final) {
1920 iax2_destroy(callno);
1922 if (iaxs[callno]->owner)
1923 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);
1924 iaxs[callno]->error = ETIMEDOUT;
1925 if (iaxs[callno]->owner) {
1926 struct ast_frame fr = { 0, };
1928 fr.frametype = AST_FRAME_CONTROL;
1929 fr.subclass = AST_CONTROL_HANGUP;
1930 iax2_queue_frame(callno, &fr);
1931 /* Remember, owner could disappear */
1932 if (iaxs[callno]->owner)
1933 iaxs[callno]->owner->hangupcause = AST_CAUSE_DESTINATION_OUT_OF_ORDER;
1935 if (iaxs[callno]->reg) {
1936 memset(&iaxs[callno]->reg->us, 0, sizeof(iaxs[callno]->reg->us));
1937 iaxs[callno]->reg->regstate = REG_STATE_TIMEOUT;
1938 iaxs[callno]->reg->refresh = IAX_DEFAULT_REG_EXPIRE;
1940 iax2_destroy(callno);
1947 /* Update it if it needs it */
1949 /* Attempt transmission */
1952 /* Try again later after 10 times as long */
1954 if (f->retrytime > MAX_RETRY_TIME)
1955 f->retrytime = MAX_RETRY_TIME;
1956 /* Transfer messages max out at one second */
1957 if (f->transfer && (f->retrytime > 1000))
1958 f->retrytime = 1000;
1959 f->retrans = ast_sched_add(sched, f->retrytime, attempt_transmit, f);
1962 /* Make sure it gets freed */
1967 ast_mutex_unlock(&iaxsl[callno]);
1968 /* Do not try again */
1970 /* Don't attempt delivery, just remove it from the queue */
1971 AST_LIST_LOCK(&queue);
1972 AST_LIST_REMOVE(&queue, f, list);
1973 AST_LIST_UNLOCK(&queue);
1975 /* Free the IAX frame */
1980 static int attempt_transmit(void *data)
1982 #ifdef SCHED_MULTITHREADED
1983 if (schedule_action(__attempt_transmit, data))
1985 __attempt_transmit(data);
1989 static int iax2_prune_realtime(int fd, int argc, char *argv[])
1991 struct iax2_peer *peer;
1994 return RESULT_SHOWUSAGE;
1995 if (!strcmp(argv[3],"all")) {
1997 ast_cli(fd, "OK cache is flushed.\n");
1998 } else if ((peer = find_peer(argv[3], 0))) {
1999 if(ast_test_flag(peer, IAX_RTCACHEFRIENDS)) {
2000 ast_set_flag(peer, IAX_RTAUTOCLEAR);
2001 expire_registry((void*)peer->name);
2002 ast_cli(fd, "OK peer %s was removed from the cache.\n", argv[3]);
2004 ast_cli(fd, "SORRY peer %s is not eligible for this operation.\n", argv[3]);
2007 ast_cli(fd, "SORRY peer %s was not found in the cache.\n", argv[3]);
2010 return RESULT_SUCCESS;
2013 static int iax2_test_losspct(int fd, int argc, char *argv[])
2016 return RESULT_SHOWUSAGE;
2018 test_losspct = atoi(argv[3]);
2020 return RESULT_SUCCESS;
2024 static int iax2_test_late(int fd, int argc, char *argv[])
2027 return RESULT_SHOWUSAGE;
2029 test_late = atoi(argv[3]);
2031 return RESULT_SUCCESS;
2034 static int iax2_test_resync(int fd, int argc, char *argv[])
2037 return RESULT_SHOWUSAGE;
2039 test_resync = atoi(argv[3]);
2041 return RESULT_SUCCESS;
2044 static int iax2_test_jitter(int fd, int argc, char *argv[])
2046 if (argc < 4 || argc > 5)
2047 return RESULT_SHOWUSAGE;
2049 test_jit = atoi(argv[3]);
2051 test_jitpct = atoi(argv[4]);
2053 return RESULT_SUCCESS;
2055 #endif /* IAXTESTS */
2057 /*! \brief peer_status: Report Peer status in character string */
2058 /* returns 1 if peer is online, -1 if unmonitored */
2059 static int peer_status(struct iax2_peer *peer, char *status, int statuslen)
2063 if (peer->lastms < 0) {
2064 ast_copy_string(status, "UNREACHABLE", statuslen);
2065 } else if (peer->lastms > peer->maxms) {
2066 snprintf(status, statuslen, "LAGGED (%d ms)", peer->lastms);
2068 } else if (peer->lastms) {
2069 snprintf(status, statuslen, "OK (%d ms)", peer->lastms);
2072 ast_copy_string(status, "UNKNOWN", statuslen);
2075 ast_copy_string(status, "Unmonitored", statuslen);
2081 /*! \brief Show one peer in detail */
2082 static int iax2_show_peer(int fd, int argc, char *argv[])
2086 struct iax2_peer *peer;
2087 char codec_buf[512];
2088 int x = 0, codec = 0, load_realtime = 0;
2091 return RESULT_SHOWUSAGE;
2093 load_realtime = (argc == 5 && !strcmp(argv[4], "load")) ? 1 : 0;
2095 peer = find_peer(argv[3], load_realtime);
2098 ast_cli(fd, " * Name : %s\n", peer->name);
2099 ast_cli(fd, " Secret : %s\n", ast_strlen_zero(peer->secret)?"<Not set>":"<Set>");
2100 ast_cli(fd, " Context : %s\n", peer->context);
2101 ast_cli(fd, " Mailbox : %s\n", peer->mailbox);
2102 ast_cli(fd, " Dynamic : %s\n", ast_test_flag(peer, IAX_DYNAMIC) ? "Yes":"No");
2103 ast_cli(fd, " Callerid : %s\n", ast_callerid_merge(cbuf, sizeof(cbuf), peer->cid_name, peer->cid_num, "<unspecified>"));
2104 ast_cli(fd, " Expire : %d\n", peer->expire);
2105 ast_cli(fd, " ACL : %s\n", (peer->ha?"Yes":"No"));
2106 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));
2107 ast_cli(fd, " Defaddr->IP : %s Port %d\n", ast_inet_ntoa(peer->defaddr.sin_addr), ntohs(peer->defaddr.sin_port));
2108 ast_cli(fd, " Username : %s\n", peer->username);
2109 ast_cli(fd, " Codecs : ");
2110 ast_getformatname_multiple(codec_buf, sizeof(codec_buf) -1, peer->capability);
2111 ast_cli(fd, "%s\n", codec_buf);
2113 ast_cli(fd, " Codec Order : (");
2114 for(x = 0; x < 32 ; x++) {
2115 codec = ast_codec_pref_index(&peer->prefs,x);
2118 ast_cli(fd, "%s", ast_getformatname(codec));
2119 if(x < 31 && ast_codec_pref_index(&peer->prefs,x+1))
2124 ast_cli(fd, "none");
2127 ast_cli(fd, " Status : ");
2128 peer_status(peer, status, sizeof(status));
2129 ast_cli(fd, "%s\n",status);
2130 ast_cli(fd, " Qualify : every %dms when OK, every %dms when UNREACHABLE (sample smoothing %s)\n", peer->pokefreqok, peer->pokefreqnotok, peer->smoothing ? "On" : "Off");
2132 if (ast_test_flag(peer, IAX_TEMPONLY))
2135 ast_cli(fd,"Peer %s not found.\n", argv[3]);
2139 return RESULT_SUCCESS;
2142 static char *complete_iax2_show_peer(const char *line, const char *word, int pos, int state)
2145 struct iax2_peer *p = NULL;
2147 int wordlen = strlen(word);
2149 /* 0 - iax2; 1 - show; 2 - peer; 3 - <peername> */
2151 AST_LIST_LOCK(&peers);
2152 AST_LIST_TRAVERSE(&peers, p, entry) {
2153 if (!strncasecmp(p->name, word, wordlen) && ++which > state) {
2154 res = ast_strdup(p->name);
2158 AST_LIST_UNLOCK(&peers);
2164 static int iax2_show_stats(int fd, int argc, char *argv[])
2166 struct iax_frame *cur;
2167 int cnt = 0, dead=0, final=0;
2170 return RESULT_SHOWUSAGE;
2172 AST_LIST_LOCK(&queue);
2173 AST_LIST_TRAVERSE(&queue, cur, list) {
2174 if (cur->retries < 0)
2180 AST_LIST_UNLOCK(&queue);
2182 ast_cli(fd, " IAX Statistics\n");
2183 ast_cli(fd, "---------------------\n");
2184 ast_cli(fd, "Outstanding frames: %d (%d ingress, %d egress)\n", iax_get_frames(), iax_get_iframes(), iax_get_oframes());
2185 ast_cli(fd, "%d timed and %d untimed transmits; MTU %d/%d/%d\n", trunk_timed, trunk_untimed,
2186 trunk_maxmtu, trunk_nmaxmtu, global_max_trunk_mtu);
2188 ast_cli(fd, "Packets in transmit queue: %d dead, %d final, %d total\n\n", dead, final, cnt);
2190 trunk_timed = trunk_untimed = 0;
2191 if (trunk_maxmtu > trunk_nmaxmtu)
2192 trunk_nmaxmtu = trunk_maxmtu;
2194 return RESULT_SUCCESS;
2197 /*! \brief Set trunk MTU from CLI */
2198 static int iax2_set_mtu(int fd, int argc, char *argv[])
2203 return RESULT_SHOWUSAGE;
2204 if (strncasecmp(argv[3], "default", strlen(argv[3])) == 0)
2205 mtuv = MAX_TRUNK_MTU;
2207 mtuv = atoi(argv[3]);
2210 ast_cli(fd, "Trunk MTU control disabled (mtu was %d)\n", global_max_trunk_mtu);
2211 global_max_trunk_mtu = 0;
2212 return RESULT_SUCCESS;
2214 if (mtuv < 172 || mtuv > 4000) {
2215 ast_cli(fd, "Trunk MTU must be between 172 and 4000\n");
2216 return RESULT_SHOWUSAGE;
2218 ast_cli(fd, "Trunk MTU changed from %d to %d\n", global_max_trunk_mtu, mtuv);
2219 global_max_trunk_mtu = mtuv;
2220 return RESULT_SUCCESS;
2223 static int iax2_show_cache(int fd, int argc, char *argv[])
2225 struct iax2_dpcache *dp = NULL;
2226 char tmp[1024], *pc = NULL;
2230 gettimeofday(&tv, NULL);
2232 AST_LIST_LOCK(&dpcache);
2234 ast_cli(fd, "%-20.20s %-12.12s %-9.9s %-8.8s %s\n", "Peer/Context", "Exten", "Exp.", "Wait.", "Flags");
2236 AST_LIST_TRAVERSE(&dpcache, dp, cache_list) {
2237 s = dp->expiry.tv_sec - tv.tv_sec;
2239 if (dp->flags & CACHE_FLAG_EXISTS)
2240 strncat(tmp, "EXISTS|", sizeof(tmp) - strlen(tmp) - 1);
2241 if (dp->flags & CACHE_FLAG_NONEXISTENT)
2242 strncat(tmp, "NONEXISTENT|", sizeof(tmp) - strlen(tmp) - 1);
2243 if (dp->flags & CACHE_FLAG_CANEXIST)
2244 strncat(tmp, "CANEXIST|", sizeof(tmp) - strlen(tmp) - 1);
2245 if (dp->flags & CACHE_FLAG_PENDING)
2246 strncat(tmp, "PENDING|", sizeof(tmp) - strlen(tmp) - 1);
2247 if (dp->flags & CACHE_FLAG_TIMEOUT)
2248 strncat(tmp, "TIMEOUT|", sizeof(tmp) - strlen(tmp) - 1);
2249 if (dp->flags & CACHE_FLAG_TRANSMITTED)
2250 strncat(tmp, "TRANSMITTED|", sizeof(tmp) - strlen(tmp) - 1);
2251 if (dp->flags & CACHE_FLAG_MATCHMORE)
2252 strncat(tmp, "MATCHMORE|", sizeof(tmp) - strlen(tmp) - 1);
2253 if (dp->flags & CACHE_FLAG_UNKNOWN)
2254 strncat(tmp, "UNKNOWN|", sizeof(tmp) - strlen(tmp) - 1);
2255 /* Trim trailing pipe */
2256 if (!ast_strlen_zero(tmp))
2257 tmp[strlen(tmp) - 1] = '\0';
2259 ast_copy_string(tmp, "(none)", sizeof(tmp));
2261 pc = strchr(dp->peercontext, '@');
2263 pc = dp->peercontext;
2266 for (x=0;x<sizeof(dp->waiters) / sizeof(dp->waiters[0]); x++)
2267 if (dp->waiters[x] > -1)
2270 ast_cli(fd, "%-20.20s %-12.12s %-9d %-8d %s\n", pc, dp->exten, s, y, tmp);
2272 ast_cli(fd, "%-20.20s %-12.12s %-9.9s %-8d %s\n", pc, dp->exten, "(expired)", y, tmp);
2275 AST_LIST_LOCK(&dpcache);
2277 return RESULT_SUCCESS;
2280 static unsigned int calc_rxstamp(struct chan_iax2_pvt *p, unsigned int offset);
2282 static void unwrap_timestamp(struct iax_frame *fr)
2286 if ( (fr->ts & 0xFFFF0000) == (iaxs[fr->callno]->last & 0xFFFF0000) ) {
2287 x = fr->ts - iaxs[fr->callno]->last;
2289 /* Sudden big jump backwards in timestamp:
2290 What likely happened here is that miniframe timestamp has circled but we haven't
2291 gotten the update from the main packet. We'll just pretend that we did, and
2292 update the timestamp appropriately. */
2293 fr->ts = ( (iaxs[fr->callno]->last & 0xFFFF0000) + 0x10000) | (fr->ts & 0xFFFF);
2294 if (option_debug && iaxdebug)
2295 ast_log(LOG_DEBUG, "schedule_delivery: pushed forward timestamp\n");
2298 /* Sudden apparent big jump forwards in timestamp:
2299 What's likely happened is this is an old miniframe belonging to the previous
2300 top-16-bit timestamp that has turned up out of order.
2301 Adjust the timestamp appropriately. */
2302 fr->ts = ( (iaxs[fr->callno]->last & 0xFFFF0000) - 0x10000) | (fr->ts & 0xFFFF);
2303 if (option_debug && iaxdebug)
2304 ast_log(LOG_DEBUG, "schedule_delivery: pushed back timestamp\n");
2309 static int get_from_jb(void *p);
2311 static void update_jbsched(struct chan_iax2_pvt *pvt)
2315 when = ast_tvdiff_ms(ast_tvnow(), pvt->rxcore);
2317 when = jb_next(pvt->jb) - when;
2319 if(pvt->jbid > -1) ast_sched_del(sched, pvt->jbid);
2322 /* XXX should really just empty until when > 0.. */
2326 pvt->jbid = ast_sched_add(sched, when, get_from_jb, CALLNO_TO_PTR(pvt->callno));
2328 /* Signal scheduler thread */
2329 signal_condition(&sched_lock, &sched_cond);
2332 static void __get_from_jb(void *p)
2334 int callno = PTR_TO_CALLNO(p);
2335 struct chan_iax2_pvt *pvt = NULL;
2336 struct iax_frame *fr;
2343 /* Make sure we have a valid private structure before going on */
2344 ast_mutex_lock(&iaxsl[callno]);
2348 ast_mutex_unlock(&iaxsl[callno]);
2354 gettimeofday(&tv,NULL);
2355 /* round up a millisecond since ast_sched_runq does; */
2356 /* prevents us from spinning while waiting for our now */
2357 /* to catch up with runq's now */
2360 now = ast_tvdiff_ms(tv, pvt->rxcore);
2362 if(now >= (next = jb_next(pvt->jb))) {
2363 ret = jb_get(pvt->jb,&frame,now,ast_codec_interp_len(pvt->voiceformat));
2371 struct ast_frame af;
2373 /* create an interpolation frame */
2374 af.frametype = AST_FRAME_VOICE;
2375 af.subclass = pvt->voiceformat;
2377 af.samples = frame.ms * 8;
2379 af.src = "IAX2 JB interpolation";
2381 af.delivery = ast_tvadd(pvt->rxcore, ast_samp2tv(next, 1000));
2382 af.offset=AST_FRIENDLY_OFFSET;
2384 /* queue the frame: For consistency, we would call __do_deliver here, but __do_deliver wants an iax_frame,
2385 * which we'd need to malloc, and then it would free it. That seems like a drag */
2386 if (!ast_test_flag(iaxs[callno], IAX_ALREADYGONE))
2387 iax2_queue_frame(callno, &af);
2391 iax2_frame_free(frame.data);
2398 /* shouldn't happen */
2402 update_jbsched(pvt);
2403 ast_mutex_unlock(&iaxsl[callno]);
2406 static int get_from_jb(void *data)
2408 #ifdef SCHED_MULTITHREADED
2409 if (schedule_action(__get_from_jb, data))
2411 __get_from_jb(data);
2415 static int schedule_delivery(struct iax_frame *fr, int updatehistory, int fromtrunk, unsigned int *tsout)
2421 /* Attempt to recover wrapped timestamps */
2422 unwrap_timestamp(fr);
2425 /* delivery time is sender's sent timestamp converted back into absolute time according to our clock */
2426 if ( !fromtrunk && !ast_tvzero(iaxs[fr->callno]->rxcore))
2427 fr->af.delivery = ast_tvadd(iaxs[fr->callno]->rxcore, ast_samp2tv(fr->ts, 1000));
2431 ast_log(LOG_DEBUG, "schedule_delivery: set delivery to 0 as we don't have an rxcore yet, or frame is from trunk.\n");
2433 fr->af.delivery = ast_tv(0,0);
2436 type = JB_TYPE_CONTROL;
2439 if(fr->af.frametype == AST_FRAME_VOICE) {
2440 type = JB_TYPE_VOICE;
2441 len = ast_codec_get_samples(&fr->af) / 8;
2442 } else if(fr->af.frametype == AST_FRAME_CNG) {
2443 type = JB_TYPE_SILENCE;
2446 if ( (!ast_test_flag(iaxs[fr->callno], IAX_USEJITTERBUF)) ) {
2453 /* if the user hasn't requested we force the use of the jitterbuffer, and we're bridged to
2454 * a channel that can accept jitter, then flush and suspend the jb, and send this frame straight through */
2455 if( (!ast_test_flag(iaxs[fr->callno], IAX_FORCEJITTERBUF)) &&
2456 iaxs[fr->callno]->owner && ast_bridged_channel(iaxs[fr->callno]->owner) &&
2457 (ast_bridged_channel(iaxs[fr->callno]->owner)->tech->properties & AST_CHAN_TP_WANTSJITTER)) {
2460 /* deliver any frames in the jb */
2461 while(jb_getall(iaxs[fr->callno]->jb,&frame) == JB_OK)
2462 __do_deliver(frame.data);
2464 jb_reset(iaxs[fr->callno]->jb);
2466 if (iaxs[fr->callno]->jbid > -1)
2467 ast_sched_del(sched, iaxs[fr->callno]->jbid);
2469 iaxs[fr->callno]->jbid = -1;
2471 /* deliver this frame now */
2478 /* insert into jitterbuffer */
2479 /* TODO: Perhaps we could act immediately if it's not droppable and late */
2480 ret = jb_put(iaxs[fr->callno]->jb, fr, type, len, fr->ts,
2481 calc_rxstamp(iaxs[fr->callno],fr->ts));
2482 if (ret == JB_DROP) {
2484 } else if (ret == JB_SCHED) {
2485 update_jbsched(iaxs[fr->callno]);
2490 /* Free our iax frame */
2491 iax2_frame_free(fr);
2497 static int iax2_transmit(struct iax_frame *fr)
2499 /* Lock the queue and place this packet at the end */
2500 /* By setting this to 0, the network thread will send it for us, and
2501 queue retransmission if necessary */
2503 AST_LIST_LOCK(&queue);
2504 AST_LIST_INSERT_TAIL(&queue, fr, list);
2505 AST_LIST_UNLOCK(&queue);
2506 /* Wake up the network and scheduler thread */
2507 pthread_kill(netthreadid, SIGURG);
2508 signal_condition(&sched_lock, &sched_cond);
2514 static int iax2_digit_begin(struct ast_channel *c, char digit)
2516 return send_command_locked(PTR_TO_CALLNO(c->tech_pvt), AST_FRAME_DTMF_BEGIN, digit, 0, NULL, 0, -1);
2519 static int iax2_digit_end(struct ast_channel *c, char digit, unsigned int duration)
2521 return send_command_locked(PTR_TO_CALLNO(c->tech_pvt), AST_FRAME_DTMF_END, digit, 0, NULL, 0, -1);
2524 static int iax2_sendtext(struct ast_channel *c, const char *text)
2527 return send_command_locked(PTR_TO_CALLNO(c->tech_pvt), AST_FRAME_TEXT,
2528 0, 0, (unsigned char *)text, strlen(text) + 1, -1);
2531 static int iax2_sendimage(struct ast_channel *c, struct ast_frame *img)
2533 return send_command_locked(PTR_TO_CALLNO(c->tech_pvt), AST_FRAME_IMAGE, img->subclass, 0, img->data, img->datalen, -1);
2536 static int iax2_sendhtml(struct ast_channel *c, int subclass, const char *data, int datalen)
2538 return send_command_locked(PTR_TO_CALLNO(c->tech_pvt), AST_FRAME_HTML, subclass, 0, (unsigned char *)data, datalen, -1);
2541 static int iax2_fixup(struct ast_channel *oldchannel, struct ast_channel *newchan)
2543 unsigned short callno = PTR_TO_CALLNO(newchan->tech_pvt);
2544 ast_mutex_lock(&iaxsl[callno]);
2546 iaxs[callno]->owner = newchan;
2548 ast_log(LOG_WARNING, "Uh, this isn't a good sign...\n");
2549 ast_mutex_unlock(&iaxsl[callno]);
2553 static struct iax2_peer *realtime_peer(const char *peername, struct sockaddr_in *sin)
2555 struct ast_variable *var;
2556 struct ast_variable *tmp;
2557 struct iax2_peer *peer=NULL;
2558 time_t regseconds = 0, nowtime;
2562 var = ast_load_realtime("iaxpeers", "name", peername, NULL);
2565 sprintf(porta, "%d", ntohs(sin->sin_port));
2566 var = ast_load_realtime("iaxpeers", "ipaddr", ast_inet_ntoa(sin->sin_addr), "port", porta, NULL);
2568 /* We'll need the peer name in order to build the structure! */
2569 for (tmp = var; tmp; tmp = tmp->next) {
2570 if (!strcasecmp(tmp->name, "name"))
2571 peername = tmp->value;
2578 peer = build_peer(peername, var, NULL, ast_test_flag((&globalflags), IAX_RTCACHEFRIENDS) ? 0 : 1);
2581 ast_variables_destroy(var);
2585 for (tmp = var; tmp; tmp = tmp->next) {
2586 /* Make sure it's not a user only... */
2587 if (!strcasecmp(tmp->name, "type")) {
2588 if (strcasecmp(tmp->value, "friend") &&
2589 strcasecmp(tmp->value, "peer")) {
2590 /* Whoops, we weren't supposed to exist! */
2595 } else if (!strcasecmp(tmp->name, "regseconds")) {
2596 ast_get_time_t(tmp->value, ®seconds, 0, NULL);
2597 } else if (!strcasecmp(tmp->name, "ipaddr")) {
2598 inet_aton(tmp->value, &(peer->addr.sin_addr));
2599 } else if (!strcasecmp(tmp->name, "port")) {
2600 peer->addr.sin_port = htons(atoi(tmp->value));
2601 } else if (!strcasecmp(tmp->name, "host")) {
2602 if (!strcasecmp(tmp->value, "dynamic"))
2607 ast_variables_destroy(var);
2612 if (ast_test_flag((&globalflags), IAX_RTCACHEFRIENDS)) {
2613 ast_copy_flags(peer, &globalflags, IAX_RTAUTOCLEAR|IAX_RTCACHEFRIENDS);
2614 if (ast_test_flag(peer, IAX_RTAUTOCLEAR)) {
2615 if (peer->expire > -1)
2616 ast_sched_del(sched, peer->expire);
2617 peer->expire = ast_sched_add(sched, (global_rtautoclear) * 1000, expire_registry, (void*)peer->name);
2619 AST_LIST_LOCK(&peers);
2620 AST_LIST_INSERT_HEAD(&peers, peer, entry);
2621 AST_LIST_UNLOCK(&peers);
2622 if (ast_test_flag(peer, IAX_DYNAMIC))
2623 reg_source_db(peer);
2625 ast_set_flag(peer, IAX_TEMPONLY);
2628 if (!ast_test_flag(&globalflags, IAX_RTIGNOREREGEXPIRE) && dynamic) {
2630 if ((nowtime - regseconds) > IAX_DEFAULT_REG_EXPIRE) {
2631 memset(&peer->addr, 0, sizeof(peer->addr));
2632 realtime_update_peer(peer->name, &peer->addr, 0);
2634 ast_log(LOG_DEBUG, "realtime_peer: Bah, '%s' is expired (%d/%d/%d)!\n",
2635 peername, (int)(nowtime - regseconds), (int)regseconds, (int)nowtime);
2639 ast_log(LOG_DEBUG, "realtime_peer: Registration for '%s' still active (%d/%d/%d)!\n",
2640 peername, (int)(nowtime - regseconds), (int)regseconds, (int)nowtime);
2647 static struct iax2_user *realtime_user(const char *username)
2649 struct ast_variable *var;
2650 struct ast_variable *tmp;
2651 struct iax2_user *user=NULL;
2653 var = ast_load_realtime("iaxusers", "name", username, NULL);
2659 /* Make sure it's not a peer only... */
2660 if (!strcasecmp(tmp->name, "type")) {
2661 if (strcasecmp(tmp->value, "friend") &&
2662 strcasecmp(tmp->value, "user")) {
2669 user = build_user(username, var, NULL, !ast_test_flag((&globalflags), IAX_RTCACHEFRIENDS));
2671 ast_variables_destroy(var);
2676 if (ast_test_flag((&globalflags), IAX_RTCACHEFRIENDS)) {
2677 ast_set_flag(user, IAX_RTCACHEFRIENDS);
2678 AST_LIST_LOCK(&users);
2679 AST_LIST_INSERT_HEAD(&users, user, entry);
2680 AST_LIST_UNLOCK(&users);
2682 ast_set_flag(user, IAX_TEMPONLY);
2688 static void realtime_update_peer(const char *peername, struct sockaddr_in *sin, time_t regtime)
2691 char regseconds[20];
2693 snprintf(regseconds, sizeof(regseconds), "%d", (int)regtime);
2694 snprintf(port, sizeof(port), "%d", ntohs(sin->sin_port));
2695 ast_update_realtime("iaxpeers", "name", peername,
2696 "ipaddr", ast_inet_ntoa(sin->sin_addr), "port", port,
2697 "regseconds", regseconds, NULL);
2700 struct create_addr_info {
2713 char context[AST_MAX_CONTEXT];
2714 char peercontext[AST_MAX_CONTEXT];
2715 char mohinterpret[MAX_MUSICCLASS];
2716 char mohsuggest[MAX_MUSICCLASS];
2719 static int create_addr(const char *peername, struct sockaddr_in *sin, struct create_addr_info *cai)
2721 struct iax2_peer *peer;
2723 ast_clear_flag(cai, IAX_SENDANI | IAX_TRUNK);
2724 cai->sockfd = defaultsockfd;
2726 sin->sin_family = AF_INET;
2728 if (!(peer = find_peer(peername, 1))) {
2730 if (ast_get_ip_or_srv(sin, peername, srvlookup ? "_iax._udp" : NULL)) {
2731 ast_log(LOG_WARNING, "No such host: %s\n", peername);
2734 sin->sin_port = htons(IAX_DEFAULT_PORTNO);
2735 /* use global iax prefs for unknown peer/user */
2736 ast_codec_pref_convert(&prefs, cai->prefs, sizeof(cai->prefs), 1);
2742 /* if the peer has no address (current or default), return failure */
2743 if (!(peer->addr.sin_addr.s_addr || peer->defaddr.sin_addr.s_addr)) {
2744 if (ast_test_flag(peer, IAX_TEMPONLY))
2749 /* if the peer is being monitored and is currently unreachable, return failure */
2750 if (peer->maxms && ((peer->lastms > peer->maxms) || (peer->lastms < 0))) {
2751 if (ast_test_flag(peer, IAX_TEMPONLY))
2756 ast_copy_flags(cai, peer, IAX_SENDANI | IAX_TRUNK | IAX_NOTRANSFER | IAX_TRANSFERMEDIA | IAX_USEJITTERBUF | IAX_FORCEJITTERBUF);
2757 cai->maxtime = peer->maxms;
2758 cai->capability = peer->capability;
2759 cai->encmethods = peer->encmethods;
2760 cai->sockfd = peer->sockfd;
2761 cai->adsi = peer->adsi;
2762 ast_codec_pref_convert(&peer->prefs, cai->prefs, sizeof(cai->prefs), 1);
2763 ast_copy_string(cai->context, peer->context, sizeof(cai->context));
2764 ast_copy_string(cai->peercontext, peer->peercontext, sizeof(cai->peercontext));
2765 ast_copy_string(cai->username, peer->username, sizeof(cai->username));
2766 ast_copy_string(cai->timezone, peer->zonetag, sizeof(cai->timezone));
2767 ast_copy_string(cai->outkey, peer->outkey, sizeof(cai->outkey));
2768 ast_copy_string(cai->mohinterpret, peer->mohinterpret, sizeof(cai->mohinterpret));
2769 ast_copy_string(cai->mohsuggest, peer->mohsuggest, sizeof(cai->mohsuggest));
2770 if (ast_strlen_zero(peer->dbsecret)) {
2771 ast_copy_string(cai->secret, peer->secret, sizeof(cai->secret));
2776 family = ast_strdupa(peer->dbsecret);
2777 key = strchr(family, '/');
2780 if (!key || ast_db_get(family, key, cai->secret, sizeof(cai->secret))) {
2781 ast_log(LOG_WARNING, "Unable to retrieve database password for family/key '%s'!\n", peer->dbsecret);
2782 if (ast_test_flag(peer, IAX_TEMPONLY))
2788 if (peer->addr.sin_addr.s_addr) {
2789 sin->sin_addr = peer->addr.sin_addr;
2790 sin->sin_port = peer->addr.sin_port;
2792 sin->sin_addr = peer->defaddr.sin_addr;
2793 sin->sin_port = peer->defaddr.sin_port;
2796 if (ast_test_flag(peer, IAX_TEMPONLY))
2802 static void __auto_congest(void *nothing)
2804 int callno = PTR_TO_CALLNO(nothing);
2805 struct ast_frame f = { AST_FRAME_CONTROL, AST_CONTROL_CONGESTION };
2806 ast_mutex_lock(&iaxsl[callno]);
2808 iaxs[callno]->initid = -1;
2809 iax2_queue_frame(callno, &f);
2810 ast_log(LOG_NOTICE, "Auto-congesting call due to slow response\n");
2812 ast_mutex_unlock(&iaxsl[callno]);
2815 static int auto_congest(void *data)
2817 #ifdef SCHED_MULTITHREADED
2818 if (schedule_action(__auto_congest, data))
2820 __auto_congest(data);
2824 static unsigned int iax2_datetime(const char *tz)
2830 localtime_r(&t, &tm);
2831 if (!ast_strlen_zero(tz))
2832 ast_localtime(&t, &tm, tz);
2833 tmp = (tm.tm_sec >> 1) & 0x1f; /* 5 bits of seconds */
2834 tmp |= (tm.tm_min & 0x3f) << 5; /* 6 bits of minutes */
2835 tmp |= (tm.tm_hour & 0x1f) << 11; /* 5 bits of hours */
2836 tmp |= (tm.tm_mday & 0x1f) << 16; /* 5 bits of day of month */
2837 tmp |= ((tm.tm_mon + 1) & 0xf) << 21; /* 4 bits of month */
2838 tmp |= ((tm.tm_year - 100) & 0x7f) << 25; /* 7 bits of year */
2842 struct parsed_dial_string {
2854 * \brief Parses an IAX dial string into its component parts.
2855 * \param data the string to be parsed
2856 * \param pds pointer to a \c struct \c parsed_dial_string to be filled in
2859 * This function parses the string and fills the structure
2860 * with pointers to its component parts. The input string
2863 * \note This function supports both plaintext passwords and RSA
2864 * key names; if the password string is formatted as '[keyname]',
2865 * then the keyname will be placed into the key field, and the
2866 * password field will be set to NULL.
2868 * \note The dial string format is:
2869 * [username[:password]@]peer[:port][/exten[@@context]][/options]
2871 static void parse_dial_string(char *data, struct parsed_dial_string *pds)
2873 if (ast_strlen_zero(data))
2876 pds->peer = strsep(&data, "/");
2877 pds->exten = strsep(&data, "/");
2878 pds->options = data;
2882 pds->exten = strsep(&data, "@");
2883 pds->context = data;
2886 if (strchr(pds->peer, '@')) {
2888 pds->username = strsep(&data, "@");
2892 if (pds->username) {
2893 data = pds->username;
2894 pds->username = strsep(&data, ":");
2895 pds->password = data;
2899 pds->peer = strsep(&data, ":");
2902 /* check for a key name wrapped in [] in the secret position, if found,
2903 move it to the key field instead
2905 if (pds->password && (pds->password[0] == '[')) {
2906 pds->key = ast_strip_quoted(pds->password, "[", "]");
2907 pds->password = NULL;
2911 static int iax2_call(struct ast_channel *c, char *dest, int timeout)
2913 struct sockaddr_in sin;
2914 char *l=NULL, *n=NULL, *tmpstr;
2915 struct iax_ie_data ied;
2916 char *defaultrdest = "s";
2917 unsigned short callno = PTR_TO_CALLNO(c->tech_pvt);
2918 struct parsed_dial_string pds;
2919 struct create_addr_info cai;
2920 struct ast_var_t *var;
2922 if ((c->_state != AST_STATE_DOWN) && (c->_state != AST_STATE_RESERVED)) {
2923 ast_log(LOG_WARNING, "Channel is already in use (%s)?\n", c->name);
2927 memset(&cai, 0, sizeof(cai));
2928 cai.encmethods = iax2_encryption;
2930 memset(&pds, 0, sizeof(pds));
2931 tmpstr = ast_strdupa(dest);
2932 parse_dial_string(tmpstr, &pds);
2935 pds.exten = defaultrdest;
2937 if (create_addr(pds.peer, &sin, &cai)) {
2938 ast_log(LOG_WARNING, "No address associated with '%s'\n", pds.peer);
2942 if (!pds.username && !ast_strlen_zero(cai.username))
2943 pds.username = cai.username;
2944 if (!pds.password && !ast_strlen_zero(cai.secret))
2945 pds.password = cai.secret;
2946 if (!pds.key && !ast_strlen_zero(cai.outkey))
2947 pds.key = cai.outkey;
2948 if (!pds.context && !ast_strlen_zero(cai.peercontext))
2949 pds.context = cai.peercontext;
2951 /* Keep track of the context for outgoing calls too */
2952 ast_copy_string(c->context, cai.context, sizeof(c->context));
2955 sin.sin_port = htons(atoi(pds.port));
2958 n = c->cid.cid_name;
2960 /* Now build request */
2961 memset(&ied, 0, sizeof(ied));
2963 /* On new call, first IE MUST be IAX version of caller */
2964 iax_ie_append_short(&ied, IAX_IE_VERSION, IAX_PROTO_VERSION);
2965 iax_ie_append_str(&ied, IAX_IE_CALLED_NUMBER, pds.exten);
2966 if (pds.options && strchr(pds.options, 'a')) {
2967 /* Request auto answer */
2968 iax_ie_append(&ied, IAX_IE_AUTOANSWER);
2971 iax_ie_append_str(&ied, IAX_IE_CODEC_PREFS, cai.prefs);
2974 iax_ie_append_str(&ied, IAX_IE_CALLING_NUMBER, l);
2975 iax_ie_append_byte(&ied, IAX_IE_CALLINGPRES, c->cid.cid_pres);
2978 iax_ie_append_byte(&ied, IAX_IE_CALLINGPRES, c->cid.cid_pres);
2980 iax_ie_append_byte(&ied, IAX_IE_CALLINGPRES, AST_PRES_NUMBER_NOT_AVAILABLE);
2983 iax_ie_append_byte(&ied, IAX_IE_CALLINGTON, c->cid.cid_ton);
2984 iax_ie_append_short(&ied, IAX_IE_CALLINGTNS, c->cid.cid_tns);
2987 iax_ie_append_str(&ied, IAX_IE_CALLING_NAME, n);
2988 if (ast_test_flag(iaxs[callno], IAX_SENDANI) && c->cid.cid_ani)
2989 iax_ie_append_str(&ied, IAX_IE_CALLING_ANI, c->cid.cid_ani);
2991 if (!ast_strlen_zero(c->language))
2992 iax_ie_append_str(&ied, IAX_IE_LANGUAGE, c->language);
2993 if (!ast_strlen_zero(c->cid.cid_dnid))
2994 iax_ie_append_str(&ied, IAX_IE_DNID, c->cid.cid_dnid);
2995 if (!ast_strlen_zero(c->cid.cid_rdnis))
2996 iax_ie_append_str(&ied, IAX_IE_RDNIS, c->cid.cid_rdnis);
2999 iax_ie_append_str(&ied, IAX_IE_CALLED_CONTEXT, pds.context);
3002 iax_ie_append_str(&ied, IAX_IE_USERNAME, pds.username);
3005 iax_ie_append_short(&ied, IAX_IE_ENCRYPTION, cai.encmethods);
3007 ast_mutex_lock(&iaxsl[callno]);
3009 if (!ast_strlen_zero(c->context))
3010 ast_string_field_set(iaxs[callno], context, c->context);
3013 ast_string_field_set(iaxs[callno], username, pds.username);
3015 iaxs[callno]->encmethods = cai.encmethods;
3017 iaxs[callno]->adsi = cai.adsi;
3019 ast_string_field_set(iaxs[callno], mohinterpret, cai.mohinterpret);
3020 ast_string_field_set(iaxs[callno], mohsuggest, cai.mohsuggest);
3023 ast_string_field_set(iaxs[callno], outkey, pds.key);
3025 ast_string_field_set(iaxs[callno], secret, pds.password);
3027 iax_ie_append_int(&ied, IAX_IE_FORMAT, c->nativeformats);
3028 iax_ie_append_int(&ied, IAX_IE_CAPABILITY, iaxs[callno]->capability);
3029 iax_ie_append_short(&ied, IAX_IE_ADSICPE, c->adsicpe);
3030 iax_ie_append_int(&ied, IAX_IE_DATETIME, iax2_datetime(cai.timezone));
3032 if (iaxs[callno]->maxtime) {
3033 /* Initialize pingtime and auto-congest time */
3034 iaxs[callno]->pingtime = iaxs[callno]->maxtime / 2;
3035 iaxs[callno]->initid = ast_sched_add(sched, iaxs[callno]->maxtime * 2, auto_congest, CALLNO_TO_PTR(callno));
3036 } else if (autokill) {
3037 iaxs[callno]->pingtime = autokill / 2;
3038 iaxs[callno]->initid = ast_sched_add(sched, autokill * 2, auto_congest, CALLNO_TO_PTR(callno));
3041 /* send the command using the appropriate socket for this peer */
3042 iaxs[callno]->sockfd = cai.sockfd;
3044 /* Add remote vars */
3045 AST_LIST_TRAVERSE(&c->varshead, var, entries) {
3046 if (!strncmp(ast_var_name(var), "~IAX2~", strlen("~IAX2~"))) {
3049 /* Automatically divide the value up into sized chunks */
3050 for (i = 0; i < strlen(ast_var_value(var)); i += 255 - (strlen(ast_var_name(var)) - strlen("~IAX2~") + 1)) {
3051 snprintf(tmp, sizeof(tmp), "%s=%s", ast_var_name(var) + strlen("~IAX2~"), ast_var_value(var) + i);
3052 iax_ie_append_str(&ied, IAX_IE_VARIABLE, tmp);
3057 /* Transmit the string in a "NEW" request */
3058 send_command(iaxs[callno], AST_FRAME_IAX, IAX_COMMAND_NEW, 0, ied.buf, ied.pos, -1);
3060 ast_mutex_unlock(&iaxsl[callno]);
3061 ast_setstate(c, AST_STATE_RINGING);
3066 static int iax2_hangup(struct ast_channel *c)
3068 unsigned short callno = PTR_TO_CALLNO(c->tech_pvt);
3070 struct iax_ie_data ied;
3071 memset(&ied, 0, sizeof(ied));
3072 ast_mutex_lock(&iaxsl[callno]);
3073 if (callno && iaxs[callno]) {
3075 ast_log(LOG_DEBUG, "We're hanging up %s now...\n", c->name);
3076 alreadygone = ast_test_flag(iaxs[callno], IAX_ALREADYGONE);
3077 /* Send the hangup unless we have had a transmission error or are already gone */
3078 iax_ie_append_byte(&ied, IAX_IE_CAUSECODE, (unsigned char)c->hangupcause);
3079 if (!iaxs[callno]->error && !alreadygone)
3080 send_command_final(iaxs[callno], AST_FRAME_IAX, IAX_COMMAND_HANGUP, 0, ied.buf, ied.pos, -1);
3081 /* Explicitly predestroy it */
3082 iax2_predestroy(callno);
3083 /* If we were already gone to begin with, destroy us now */
3086 ast_log(LOG_DEBUG, "Really destroying %s now...\n", c->name);
3087 iax2_destroy(callno);
3090 ast_mutex_unlock(&iaxsl[callno]);
3091 if (option_verbose > 2)
3092 ast_verbose(VERBOSE_PREFIX_3 "Hungup '%s'\n", c->name);
3096 static int iax2_setoption(struct ast_channel *c, int option, void *data, int datalen)
3098 struct ast_option_header *h;
3102 case AST_OPTION_TXGAIN:
3103 case AST_OPTION_RXGAIN:
3104 /* these two cannot be sent, because they require a result */
3108 if (!(h = ast_malloc(datalen + sizeof(*h))))
3111 h->flag = AST_OPTION_FLAG_REQUEST;
3112 h->option = htons(option);
3113 memcpy(h->data, data, datalen);
3114 res = send_command_locked(PTR_TO_CALLNO(c->tech_pvt), AST_FRAME_CONTROL,
3115 AST_CONTROL_OPTION, 0, (unsigned char *) h,
3116 datalen + sizeof(*h), -1);
3122 static struct ast_frame *iax2_read(struct ast_channel *c)
3124 ast_log(LOG_NOTICE, "I should never be called!\n");
3125 return &ast_null_frame;
3128 static int iax2_start_transfer(unsigned short callno0, unsigned short callno1, int mediaonly)
3131 struct iax_ie_data ied0;
3132 struct iax_ie_data ied1;
3133 unsigned int transferid = (unsigned int)ast_random();
3134 memset(&ied0, 0, sizeof(ied0));
3135 iax_ie_append_addr(&ied0, IAX_IE_APPARENT_ADDR, &iaxs[callno1]->addr);
3136 iax_ie_append_short(&ied0, IAX_IE_CALLNO, iaxs[callno1]->peercallno);
3137 iax_ie_append_int(&ied0, IAX_IE_TRANSFERID, transferid);
3139 memset(&ied1, 0, sizeof(ied1));
3140 iax_ie_append_addr(&ied1, IAX_IE_APPARENT_ADDR, &iaxs[callno0]->addr);
3141 iax_ie_append_short(&ied1, IAX_IE_CALLNO, iaxs[callno0]->peercallno);
3142 iax_ie_append_int(&ied1, IAX_IE_TRANSFERID, transferid);
3144 res = send_command(iaxs[callno0], AST_FRAME_IAX, IAX_COMMAND_TXREQ, 0, ied0.buf, ied0.pos, -1);
3147 res = send_command(iaxs[callno1], AST_FRAME_IAX, IAX_COMMAND_TXREQ, 0, ied1.buf, ied1.pos, -1);
3150 iaxs[callno0]->transferring = mediaonly ? TRANSFER_MBEGIN : TRANSFER_BEGIN;
3151 iaxs[callno1]->transferring = mediaonly ? TRANSFER_MBEGIN : TRANSFER_BEGIN;
3155 static void lock_both(unsigned short callno0, unsigned short callno1)
3157 ast_mutex_lock(&iaxsl[callno0]);
3158 while (ast_mutex_trylock(&iaxsl[callno1])) {
3159 ast_mutex_unlock(&iaxsl[callno0]);
3161 ast_mutex_lock(&iaxsl[callno0]);
3165 static void unlock_both(unsigned short callno0, unsigned short callno1)
3167 ast_mutex_unlock(&iaxsl[callno1]);
3168 ast_mutex_unlock(&iaxsl[callno0]);
3171 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)
3173 struct ast_channel *cs[3];
3174 struct ast_channel *who, *other;
3177 int transferstarted=0;
3178 struct ast_frame *f;
3179 unsigned short callno0 = PTR_TO_CALLNO(c0->tech_pvt);
3180 unsigned short callno1 = PTR_TO_CALLNO(c1->tech_pvt);
3181 struct timeval waittimer = {0, 0}, tv;
3183 lock_both(callno0, callno1);
3184 /* Put them in native bridge mode */
3185 if (!flags & (AST_BRIDGE_DTMF_CHANNEL_0 | AST_BRIDGE_DTMF_CHANNEL_1)) {
3186 iaxs[callno0]->bridgecallno = callno1;
3187 iaxs[callno1]->bridgecallno = callno0;
3189 unlock_both(callno0, callno1);
3191 /* If not, try to bridge until we can execute a transfer, if we can */
3194 for (/* ever */;;) {
3195 /* Check in case we got masqueraded into */
3196 if ((c0->tech != &iax2_tech) || (c1->tech != &iax2_tech)) {
3197 if (option_verbose > 2)
3198 ast_verbose(VERBOSE_PREFIX_3 "Can't masquerade, we're different...\n");