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) */
636 static AST_LIST_HEAD_STATIC(queue, iax_frame);
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);
645 /*! Extension exists */
646 CACHE_FLAG_EXISTS = (1 << 0),
647 /*! Extension is nonexistent */
648 CACHE_FLAG_NONEXISTENT = (1 << 1),
649 /*! Extension can exist */
650 CACHE_FLAG_CANEXIST = (1 << 2),
651 /*! Waiting to hear back response */
652 CACHE_FLAG_PENDING = (1 << 3),
654 CACHE_FLAG_TIMEOUT = (1 << 4),
655 /*! Request transmitted */
656 CACHE_FLAG_TRANSMITTED = (1 << 5),
658 CACHE_FLAG_UNKNOWN = (1 << 6),
660 CACHE_FLAG_MATCHMORE = (1 << 7),
663 struct iax2_dpcache {
664 char peercontext[AST_MAX_CONTEXT];
665 char exten[AST_MAX_EXTENSION];
667 struct timeval expiry;
669 unsigned short callno;
671 AST_LIST_ENTRY(iax2_dpcache) cache_list;
672 AST_LIST_ENTRY(iax2_dpcache) peer_list;
675 static AST_LIST_HEAD_STATIC(dpcache, iax2_dpcache);
677 static void reg_source_db(struct iax2_peer *p);
678 static struct iax2_peer *realtime_peer(const char *peername, struct sockaddr_in *sin);
680 static void destroy_peer(struct iax2_peer *peer);
681 static int ast_cli_netstats(struct mansession *s, int fd, int limit_fmt);
683 enum iax2_thread_iostate {
686 IAX_IOSTATE_PROCESSING,
687 IAX_IOSTATE_SCHEDREADY,
690 enum iax2_thread_type {
691 IAX_THREAD_TYPE_POOL,
692 IAX_THREAD_TYPE_DYNAMIC,
696 AST_LIST_ENTRY(iax2_thread) list;
697 enum iax2_thread_type type;
698 enum iax2_thread_iostate iostate;
699 #ifdef SCHED_MULTITHREADED
700 void (*schedfunc)(void *);
703 #ifdef DEBUG_SCHED_MULTITHREAD
709 struct sockaddr_in iosin;
710 unsigned char buf[4096];
719 static AST_LIST_HEAD_STATIC(idle_list, iax2_thread);
720 static AST_LIST_HEAD_STATIC(active_list, iax2_thread);
721 static AST_LIST_HEAD_STATIC(dynamic_list, iax2_thread);
723 static void *iax2_process_thread(void *data);
725 static void signal_condition(ast_mutex_t *lock, ast_cond_t *cond)
727 ast_mutex_lock(lock);
728 ast_cond_signal(cond);
729 ast_mutex_unlock(lock);
732 static void iax_debug_output(const char *data)
735 ast_verbose("%s", data);
738 static void iax_error_output(const char *data)
740 ast_log(LOG_WARNING, "%s", data);
743 static void jb_error_output(const char *fmt, ...)
749 vsnprintf(buf, sizeof(buf), fmt, args);
752 ast_log(LOG_ERROR, buf);
755 static void jb_warning_output(const char *fmt, ...)
761 vsnprintf(buf, sizeof(buf), fmt, args);
764 ast_log(LOG_WARNING, buf);
767 static void jb_debug_output(const char *fmt, ...)
773 vsnprintf(buf, sizeof(buf), fmt, args);
780 * \brief an array of iax2 pvt structures
782 * The container for active chan_iax2_pvt structures is implemented as an
783 * array for extremely quick direct access to the correct pvt structure
784 * based on the local call number. The local call number is used as the
785 * index into the array where the associated pvt structure is stored.
787 static struct chan_iax2_pvt *iaxs[IAX_MAX_CALLS];
789 * \brief chan_iax2_pvt structure locks
791 * These locks are used when accessing a pvt structure in the iaxs array.
792 * The index used here is the same as used in the iaxs array. It is the
793 * local call number for the associated pvt struct.
795 static ast_mutex_t iaxsl[IAX_MAX_CALLS];
797 * \brief The last time a call number was used
799 * It is important to know the last time that a call number was used locally so
800 * that it is not used again too soon. The reason for this is the same as the
801 * reason that the TCP protocol state machine requires a "TIME WAIT" state.
803 * For example, say that a call is up. Then, the remote side sends a HANGUP,
804 * which we respond to with an ACK. However, there is no way to know whether
805 * the ACK made it there successfully. If it were to get lost, the remote
806 * side may retransmit the HANGUP. If in the meantime, this call number has
807 * been reused locally, given the right set of circumstances, this retransmitted
808 * HANGUP could potentially improperly hang up the new session. So, to avoid
809 * this potential issue, we must wait a specified timeout period before reusing
810 * a local call number.
812 * The specified time that we must wait before reusing a local call number is
813 * defined as MIN_REUSE_TIME, with a default of 60 seconds.
815 static struct timeval lastused[IAX_MAX_CALLS];
817 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);
818 static int expire_registry(void *data);
819 static int iax2_answer(struct ast_channel *c);
820 static int iax2_call(struct ast_channel *c, char *dest, int timeout);
821 static int iax2_devicestate(void *data);
822 static int iax2_digit_begin(struct ast_channel *c, char digit);
823 static int iax2_digit_end(struct ast_channel *c, char digit, unsigned int duration);
824 static int iax2_do_register(struct iax2_registry *reg);
825 static int iax2_fixup(struct ast_channel *oldchannel, struct ast_channel *newchan);
826 static int iax2_hangup(struct ast_channel *c);
827 static int iax2_indicate(struct ast_channel *c, int condition, const void *data, size_t datalen);
828 static int iax2_poke_peer(struct iax2_peer *peer, int heldcall);
829 static int iax2_provision(struct sockaddr_in *end, int sockfd, char *dest, const char *template, int force);
830 static int iax2_send(struct chan_iax2_pvt *pvt, struct ast_frame *f, unsigned int ts, int seqno, int now, int transfer, int final);
831 static int iax2_sendhtml(struct ast_channel *c, int subclass, const char *data, int datalen);
832 static int iax2_sendimage(struct ast_channel *c, struct ast_frame *img);
833 static int iax2_sendtext(struct ast_channel *c, const char *text);
834 static int iax2_setoption(struct ast_channel *c, int option, void *data, int datalen);
835 static int iax2_transfer(struct ast_channel *c, const char *dest);
836 static int iax2_write(struct ast_channel *c, struct ast_frame *f);
837 static int send_trunk(struct iax2_trunk_peer *tpeer, struct timeval *now);
838 static int send_command(struct chan_iax2_pvt *, char, int, unsigned int, const unsigned char *, int, int);
839 static int send_command_final(struct chan_iax2_pvt *, char, int, unsigned int, const unsigned char *, int, int);
840 static int send_command_immediate(struct chan_iax2_pvt *, char, int, unsigned int, const unsigned char *, int, int);
841 static int send_command_locked(unsigned short callno, char, int, unsigned int, const unsigned char *, int, int);
842 static int send_command_transfer(struct chan_iax2_pvt *, char, int, unsigned int, const unsigned char *, int);
843 static struct ast_channel *iax2_request(const char *type, int format, void *data, int *cause);
844 static struct ast_frame *iax2_read(struct ast_channel *c);
845 static struct iax2_peer *build_peer(const char *name, struct ast_variable *v, struct ast_variable *alt, int temponly);
846 static struct iax2_user *build_user(const char *name, struct ast_variable *v, struct ast_variable *alt, int temponly);
847 static void realtime_update_peer(const char *peername, struct sockaddr_in *sin, time_t regtime);
848 static void destroy_user(struct iax2_user *user);
849 static void prune_peers(void);
851 static const struct ast_channel_tech iax2_tech = {
853 .description = tdesc,
854 .capabilities = IAX_CAPABILITY_FULLBANDWIDTH,
855 .properties = AST_CHAN_TP_WANTSJITTER,
856 .requester = iax2_request,
857 .devicestate = iax2_devicestate,
858 .send_digit_begin = iax2_digit_begin,
859 .send_digit_end = iax2_digit_end,
860 .send_text = iax2_sendtext,
861 .send_image = iax2_sendimage,
862 .send_html = iax2_sendhtml,
864 .hangup = iax2_hangup,
865 .answer = iax2_answer,
868 .write_video = iax2_write,
869 .indicate = iax2_indicate,
870 .setoption = iax2_setoption,
871 .bridge = iax2_bridge,
872 .transfer = iax2_transfer,
876 static void insert_idle_thread(struct iax2_thread *thread)
878 if (thread->type == IAX_THREAD_TYPE_DYNAMIC) {
879 AST_LIST_LOCK(&dynamic_list);
880 AST_LIST_INSERT_TAIL(&dynamic_list, thread, list);
881 AST_LIST_UNLOCK(&dynamic_list);
883 AST_LIST_LOCK(&idle_list);
884 AST_LIST_INSERT_TAIL(&idle_list, thread, list);
885 AST_LIST_UNLOCK(&idle_list);
891 static struct iax2_thread *find_idle_thread(void)
894 struct iax2_thread *thread = NULL;
896 /* Pop the head of the idle list off */
897 AST_LIST_LOCK(&idle_list);
898 thread = AST_LIST_REMOVE_HEAD(&idle_list, list);
899 AST_LIST_UNLOCK(&idle_list);
901 /* If we popped a thread off the idle list, just return it */
905 /* Pop the head of the dynamic list off */
906 AST_LIST_LOCK(&dynamic_list);
907 thread = AST_LIST_REMOVE_HEAD(&dynamic_list, list);
908 AST_LIST_UNLOCK(&dynamic_list);
910 /* If we popped a thread off the dynamic list, just return it */
914 /* If we can't create a new dynamic thread for any reason, return no thread at all */
915 if (iaxdynamicthreadcount >= iaxmaxthreadcount || !(thread = ast_calloc(1, sizeof(*thread))))
918 /* Set default values */
919 thread->threadnum = ast_atomic_fetchadd_int(&iaxdynamicthreadcount, 1);
920 thread->type = IAX_THREAD_TYPE_DYNAMIC;
922 /* Initialize lock and condition */
923 ast_mutex_init(&thread->lock);
924 ast_cond_init(&thread->cond, NULL);
926 /* Create thread and send it on it's way */
927 pthread_attr_init(&attr);
928 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
929 if (ast_pthread_create_background(&thread->threadid, &attr, iax2_process_thread, thread)) {
930 ast_cond_destroy(&thread->cond);
931 ast_mutex_destroy(&thread->lock);
939 #ifdef SCHED_MULTITHREADED
940 static int __schedule_action(void (*func)(void *data), void *data, const char *funcname)
942 struct iax2_thread *thread = NULL;
943 static time_t lasterror;
946 thread = find_idle_thread();
948 if (thread != NULL) {
949 thread->schedfunc = func;
950 thread->scheddata = data;
951 thread->iostate = IAX_IOSTATE_SCHEDREADY;
952 #ifdef DEBUG_SCHED_MULTITHREAD
953 ast_copy_string(thread->curfunc, funcname, sizeof(thread->curfunc));
955 signal_condition(&thread->lock, &thread->cond);
960 ast_log(LOG_NOTICE, "Out of idle IAX2 threads for scheduling!\n");
965 #define schedule_action(func, data) __schedule_action(func, data, __PRETTY_FUNCTION__)
968 static int send_ping(void *data);
970 static void __send_ping(void *data)
972 int callno = (long)data;
973 ast_mutex_lock(&iaxsl[callno]);
974 if (iaxs[callno] && iaxs[callno]->pingid != -1) {
975 send_command(iaxs[callno], AST_FRAME_IAX, IAX_COMMAND_PING, 0, NULL, 0, -1);
976 iaxs[callno]->pingid = ast_sched_add(sched, ping_time * 1000, send_ping, data);
978 ast_mutex_unlock(&iaxsl[callno]);
981 static int send_ping(void *data)
983 #ifdef SCHED_MULTITHREADED
984 if (schedule_action(__send_ping, data))
990 static int get_encrypt_methods(const char *s)
993 if (!strcasecmp(s, "aes128"))
994 e = IAX_ENCRYPT_AES128;
995 else if (ast_true(s))
996 e = IAX_ENCRYPT_AES128;
1002 static int send_lagrq(void *data);
1004 static void __send_lagrq(void *data)
1006 int callno = (long)data;
1007 /* Ping only if it's real not if it's bridged */
1008 ast_mutex_lock(&iaxsl[callno]);
1009 if (iaxs[callno] && iaxs[callno]->lagid != -1) {
1010 send_command(iaxs[callno], AST_FRAME_IAX, IAX_COMMAND_LAGRQ, 0, NULL, 0, -1);
1011 iaxs[callno]->lagid = ast_sched_add(sched, lagrq_time * 1000, send_lagrq, data);
1013 ast_mutex_unlock(&iaxsl[callno]);
1016 static int send_lagrq(void *data)
1018 #ifdef SCHED_MULTITHREADED
1019 if (schedule_action(__send_lagrq, data))
1025 static unsigned char compress_subclass(int subclass)
1029 /* If it's 128 or smaller, just return it */
1030 if (subclass < IAX_FLAG_SC_LOG)
1032 /* Otherwise find its power */
1033 for (x = 0; x < IAX_MAX_SHIFT; x++) {
1034 if (subclass & (1 << x)) {
1036 ast_log(LOG_WARNING, "Can't compress subclass %d\n", subclass);
1042 return power | IAX_FLAG_SC_LOG;
1045 static int uncompress_subclass(unsigned char csub)
1047 /* If the SC_LOG flag is set, return 2^csub otherwise csub */
1048 if (csub & IAX_FLAG_SC_LOG) {
1049 /* special case for 'compressed' -1 */
1053 return 1 << (csub & ~IAX_FLAG_SC_LOG & IAX_MAX_SHIFT);
1059 static struct iax2_peer *find_peer(const char *name, int realtime)
1061 struct iax2_peer *peer = NULL;
1063 /* Grab peer from linked list */
1064 AST_LIST_LOCK(&peers);
1065 AST_LIST_TRAVERSE(&peers, peer, entry) {
1066 if (!strcasecmp(peer->name, name)) {
1070 AST_LIST_UNLOCK(&peers);
1072 /* Now go for realtime if applicable */
1073 if(!peer && realtime)
1074 peer = realtime_peer(name, NULL);
1078 static int iax2_getpeername(struct sockaddr_in sin, char *host, int len, int lockpeer)
1080 struct iax2_peer *peer = NULL;
1084 AST_LIST_LOCK(&peers);
1085 AST_LIST_TRAVERSE(&peers, peer, entry) {
1086 if ((peer->addr.sin_addr.s_addr == sin.sin_addr.s_addr) &&
1087 (peer->addr.sin_port == sin.sin_port)) {
1088 ast_copy_string(host, peer->name, len);
1094 AST_LIST_UNLOCK(&peers);
1096 peer = realtime_peer(NULL, &sin);
1098 ast_copy_string(host, peer->name, len);
1099 if (ast_test_flag(peer, IAX_TEMPONLY))
1108 static struct chan_iax2_pvt *new_iax(struct sockaddr_in *sin, int lockpeer, const char *host)
1110 struct chan_iax2_pvt *tmp;
1113 if (!(tmp = ast_calloc(1, sizeof(*tmp))))
1116 if (ast_string_field_init(tmp, 32)) {
1129 ast_string_field_set(tmp,exten, "s");
1130 ast_string_field_set(tmp,host, host);
1134 jbconf.max_jitterbuf = maxjitterbuffer;
1135 jbconf.resync_threshold = resyncthreshold;
1136 jbconf.max_contig_interp = maxjitterinterps;
1137 jbconf.target_extra = jittertargetextra;
1138 jb_setconf(tmp->jb,&jbconf);
1140 AST_LIST_HEAD_INIT_NOLOCK(&tmp->dpentries);
1145 static struct iax_frame *iaxfrdup2(struct iax_frame *fr)
1147 struct iax_frame *new = iax_frame_new(DIRECTION_INGRESS, fr->af.datalen, fr->cacheable);
1149 size_t mallocd_datalen = new->mallocd_datalen;
1150 memcpy(new, fr, sizeof(*new));
1151 iax_frame_wrap(new, &fr->af);
1152 new->mallocd_datalen = mallocd_datalen;
1155 new->direction = DIRECTION_INGRESS;
1161 #define NEW_PREVENT 0
1165 static int match(struct sockaddr_in *sin, unsigned short callno, unsigned short dcallno, struct chan_iax2_pvt *cur)
1167 if ((cur->addr.sin_addr.s_addr == sin->sin_addr.s_addr) &&
1168 (cur->addr.sin_port == sin->sin_port)) {
1169 /* This is the main host */
1170 if ((cur->peercallno == callno) ||
1171 ((dcallno == cur->callno) && !cur->peercallno)) {
1172 /* That's us. Be sure we keep track of the peer call number */
1176 if ((cur->transfer.sin_addr.s_addr == sin->sin_addr.s_addr) &&
1177 (cur->transfer.sin_port == sin->sin_port) && (cur->transferring)) {
1178 /* We're transferring */
1179 if (dcallno == cur->callno)
1185 static void update_max_trunk(void)
1187 int max = TRUNK_CALL_START;
1189 /* XXX Prolly don't need locks here XXX */
1190 for (x=TRUNK_CALL_START;x<IAX_MAX_CALLS - 1; x++) {
1195 if (option_debug && iaxdebug)
1196 ast_log(LOG_DEBUG, "New max trunk callno is %d\n", max);
1199 static void update_max_nontrunk(void)
1203 /* XXX Prolly don't need locks here XXX */
1204 for (x=1;x<TRUNK_CALL_START - 1; x++) {
1208 maxnontrunkcall = max;
1209 if (option_debug && iaxdebug)
1210 ast_log(LOG_DEBUG, "New max nontrunk callno is %d\n", max);
1213 static int make_trunk(unsigned short callno, int locked)
1218 if (iaxs[callno]->oseqno) {
1219 ast_log(LOG_WARNING, "Can't make trunk once a call has started!\n");
1222 if (callno & TRUNK_CALL_START) {
1223 ast_log(LOG_WARNING, "Call %d is already a trunk\n", callno);
1226 gettimeofday(&now, NULL);
1227 for (x=TRUNK_CALL_START;x<IAX_MAX_CALLS - 1; x++) {
1228 ast_mutex_lock(&iaxsl[x]);
1229 if (!iaxs[x] && ((now.tv_sec - lastused[x].tv_sec) > MIN_REUSE_TIME)) {
1230 iaxs[x] = iaxs[callno];
1231 iaxs[x]->callno = x;
1232 iaxs[callno] = NULL;
1233 /* Update the two timers that should have been started */
1234 if (iaxs[x]->pingid > -1)
1235 ast_sched_del(sched, iaxs[x]->pingid);
1236 if (iaxs[x]->lagid > -1)
1237 ast_sched_del(sched, iaxs[x]->lagid);
1238 iaxs[x]->pingid = ast_sched_add(sched, ping_time * 1000, send_ping, (void *)(long)x);
1239 iaxs[x]->lagid = ast_sched_add(sched, lagrq_time * 1000, send_lagrq, (void *)(long)x);
1241 ast_mutex_unlock(&iaxsl[callno]);
1244 ast_mutex_unlock(&iaxsl[x]);
1247 ast_mutex_unlock(&iaxsl[x]);
1249 if (x >= IAX_MAX_CALLS - 1) {
1250 ast_log(LOG_WARNING, "Unable to trunk call: Insufficient space\n");
1254 ast_log(LOG_DEBUG, "Made call %d into trunk call %d\n", callno, x);
1255 /* We move this call from a non-trunked to a trunked call */
1257 update_max_nontrunk();
1262 * \todo XXX Note that this function contains a very expensive operation that
1263 * happens for *every* incoming media frame. It iterates through every
1264 * possible call number, locking and unlocking each one, to try to match the
1265 * incoming frame to an active call. Call numbers can be up to 2^15, 32768.
1266 * So, for an call with a local call number of 20000, every incoming audio
1267 * frame would require 20000 mutex lock and unlock operations. Ouch.
1269 * It's a shame that IAX2 media frames carry the source call number instead of
1270 * the destination call number. If they did, this lookup wouldn't be needed.
1271 * However, it's too late to change that now. Instead, we need to come up with
1272 * a better way of indexing active calls so that these frequent lookups are not
1275 static int find_callno(unsigned short callno, unsigned short dcallno, struct sockaddr_in *sin, int new, int lockpeer, int sockfd)
1281 if (new <= NEW_ALLOW) {
1282 /* Look for an existing connection first */
1283 for (x=1;(res < 1) && (x<maxnontrunkcall);x++) {
1284 ast_mutex_lock(&iaxsl[x]);
1286 /* Look for an exact match */
1287 if (match(sin, callno, dcallno, iaxs[x])) {
1291 ast_mutex_unlock(&iaxsl[x]);
1293 for (x=TRUNK_CALL_START;(res < 1) && (x<maxtrunkcall);x++) {
1294 ast_mutex_lock(&iaxsl[x]);
1296 /* Look for an exact match */
1297 if (match(sin, callno, dcallno, iaxs[x])) {
1301 ast_mutex_unlock(&iaxsl[x]);
1304 if ((res < 1) && (new >= NEW_ALLOW)) {
1305 if (!iax2_getpeername(*sin, host, sizeof(host), lockpeer))
1306 snprintf(host, sizeof(host), "%s:%d", ast_inet_ntoa(sin->sin_addr), ntohs(sin->sin_port));
1307 gettimeofday(&now, NULL);
1308 for (x=1;x<TRUNK_CALL_START;x++) {
1309 /* Find first unused call number that hasn't been used in a while */
1310 ast_mutex_lock(&iaxsl[x]);
1311 if (!iaxs[x] && ((now.tv_sec - lastused[x].tv_sec) > MIN_REUSE_TIME)) break;
1312 ast_mutex_unlock(&iaxsl[x]);
1314 /* We've still got lock held if we found a spot */
1315 if (x >= TRUNK_CALL_START) {
1316 ast_log(LOG_WARNING, "No more space\n");
1319 iaxs[x] = new_iax(sin, lockpeer, host);
1320 update_max_nontrunk();
1322 if (option_debug && iaxdebug)
1323 ast_log(LOG_DEBUG, "Creating new call structure %d\n", x);
1324 iaxs[x]->sockfd = sockfd;
1325 iaxs[x]->addr.sin_port = sin->sin_port;
1326 iaxs[x]->addr.sin_family = sin->sin_family;
1327 iaxs[x]->addr.sin_addr.s_addr = sin->sin_addr.s_addr;
1328 iaxs[x]->peercallno = callno;
1329 iaxs[x]->callno = x;
1330 iaxs[x]->pingtime = DEFAULT_RETRY_TIME;
1331 iaxs[x]->expiry = min_reg_expire;
1332 iaxs[x]->pingid = ast_sched_add(sched, ping_time * 1000, send_ping, (void *)(long)x);
1333 iaxs[x]->lagid = ast_sched_add(sched, lagrq_time * 1000, send_lagrq, (void *)(long)x);
1334 iaxs[x]->amaflags = amaflags;
1335 ast_copy_flags(iaxs[x], (&globalflags), IAX_NOTRANSFER | IAX_TRANSFERMEDIA | IAX_USEJITTERBUF | IAX_FORCEJITTERBUF);
1337 ast_string_field_set(iaxs[x], accountcode, accountcode);
1338 ast_string_field_set(iaxs[x], mohinterpret, mohinterpret);
1339 ast_string_field_set(iaxs[x], mohsuggest, mohsuggest);
1341 ast_log(LOG_WARNING, "Out of resources\n");
1342 ast_mutex_unlock(&iaxsl[x]);
1345 ast_mutex_unlock(&iaxsl[x]);
1351 static void iax2_frame_free(struct iax_frame *fr)
1353 if (fr->retrans > -1)
1354 ast_sched_del(sched, fr->retrans);
1358 static int iax2_queue_frame(int callno, struct ast_frame *f)
1360 /* Assumes lock for callno is already held... */
1362 if (iaxs[callno] && iaxs[callno]->owner) {
1363 if (ast_mutex_trylock(&iaxs[callno]->owner->lock)) {
1364 /* Avoid deadlock by pausing and trying again */
1365 ast_mutex_unlock(&iaxsl[callno]);
1367 ast_mutex_lock(&iaxsl[callno]);
1369 ast_queue_frame(iaxs[callno]->owner, f);
1370 ast_mutex_unlock(&iaxs[callno]->owner->lock);
1379 static void destroy_firmware(struct iax_firmware *cur)
1381 /* Close firmware */
1383 munmap(cur->fwh, ntohl(cur->fwh->datalen) + sizeof(*(cur->fwh)));
1389 static int try_firmware(char *s)
1392 struct iax_firmware *cur = NULL;
1393 int ifd, fd, res, len, chunk;
1394 struct ast_iax2_firmware_header *fwh, fwh2;
1395 struct MD5Context md5;
1396 unsigned char sum[16], buf[1024];
1399 if (!(s2 = alloca(strlen(s) + 100))) {
1400 ast_log(LOG_WARNING, "Alloca failed!\n");
1404 last = strrchr(s, '/');
1410 snprintf(s2, strlen(s) + 100, "/var/tmp/%s-%ld", last, (unsigned long)ast_random());
1412 if ((res = stat(s, &stbuf) < 0)) {
1413 ast_log(LOG_WARNING, "Failed to stat '%s': %s\n", s, strerror(errno));
1417 /* Make sure it's not a directory */
1418 if (S_ISDIR(stbuf.st_mode))
1420 ifd = open(s, O_RDONLY);
1422 ast_log(LOG_WARNING, "Cannot open '%s': %s\n", s, strerror(errno));
1425 fd = open(s2, O_RDWR | O_CREAT | O_EXCL, AST_FILE_MODE);
1427 ast_log(LOG_WARNING, "Cannot open '%s' for writing: %s\n", s2, strerror(errno));
1431 /* Unlink our newly created file */
1434 /* Now copy the firmware into it */
1435 len = stbuf.st_size;
1438 if (chunk > sizeof(buf))
1439 chunk = sizeof(buf);
1440 res = read(ifd, buf, chunk);
1442 ast_log(LOG_WARNING, "Only read %d of %d bytes of data :(: %s\n", res, chunk, strerror(errno));
1447 res = write(fd, buf, chunk);
1449 ast_log(LOG_WARNING, "Only write %d of %d bytes of data :(: %s\n", res, chunk, strerror(errno));
1457 /* Return to the beginning */
1458 lseek(fd, 0, SEEK_SET);
1459 if ((res = read(fd, &fwh2, sizeof(fwh2))) != sizeof(fwh2)) {
1460 ast_log(LOG_WARNING, "Unable to read firmware header in '%s'\n", s);
1464 if (ntohl(fwh2.magic) != IAX_FIRMWARE_MAGIC) {
1465 ast_log(LOG_WARNING, "'%s' is not a valid firmware file\n", s);
1469 if (ntohl(fwh2.datalen) != (stbuf.st_size - sizeof(fwh2))) {
1470 ast_log(LOG_WARNING, "Invalid data length in firmware '%s'\n", s);
1474 if (fwh2.devname[sizeof(fwh2.devname) - 1] || ast_strlen_zero((char *)fwh2.devname)) {
1475 ast_log(LOG_WARNING, "No or invalid device type specified for '%s'\n", s);
1479 fwh = mmap(NULL, stbuf.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
1480 if (fwh == (void *) -1) {
1481 ast_log(LOG_WARNING, "mmap failed: %s\n", strerror(errno));
1486 MD5Update(&md5, fwh->data, ntohl(fwh->datalen));
1487 MD5Final(sum, &md5);
1488 if (memcmp(sum, fwh->chksum, sizeof(sum))) {
1489 ast_log(LOG_WARNING, "Firmware file '%s' fails checksum\n", s);
1490 munmap(fwh, stbuf.st_size);
1495 AST_LIST_TRAVERSE(&firmwares, cur, list) {
1496 if (!strcmp((char *)cur->fwh->devname, (char *)fwh->devname)) {
1497 /* Found a candidate */
1498 if (cur->dead || (ntohs(cur->fwh->version) < ntohs(fwh->version)))
1499 /* The version we have on loaded is older, load this one instead */
1501 /* This version is no newer than what we have. Don't worry about it.
1502 We'll consider it a proper load anyhow though */
1503 munmap(fwh, stbuf.st_size);
1509 if (!cur && ((cur = ast_calloc(1, sizeof(*cur))))) {
1511 AST_LIST_INSERT_TAIL(&firmwares, cur, list);
1516 munmap(cur->fwh, cur->mmaplen);
1521 cur->mmaplen = stbuf.st_size;
1528 static int iax_check_version(char *dev)
1531 struct iax_firmware *cur = NULL;
1533 if (ast_strlen_zero(dev))
1536 AST_LIST_LOCK(&firmwares);
1537 AST_LIST_TRAVERSE(&firmwares, cur, list) {
1538 if (!strcmp(dev, (char *)cur->fwh->devname)) {
1539 res = ntohs(cur->fwh->version);
1543 AST_LIST_UNLOCK(&firmwares);
1548 static int iax_firmware_append(struct iax_ie_data *ied, const unsigned char *dev, unsigned int desc)
1551 unsigned int bs = desc & 0xff;
1552 unsigned int start = (desc >> 8) & 0xffffff;
1554 struct iax_firmware *cur;
1556 if (ast_strlen_zero((char *)dev) || !bs)
1561 AST_LIST_LOCK(&firmwares);
1562 AST_LIST_TRAVERSE(&firmwares, cur, list) {
1563 if (strcmp((char *)dev, (char *)cur->fwh->devname))
1565 iax_ie_append_int(ied, IAX_IE_FWBLOCKDESC, desc);
1566 if (start < ntohl(cur->fwh->datalen)) {
1567 bytes = ntohl(cur->fwh->datalen) - start;
1570 iax_ie_append_raw(ied, IAX_IE_FWBLOCKDATA, cur->fwh->data + start, bytes);
1573 iax_ie_append(ied, IAX_IE_FWBLOCKDATA);
1581 AST_LIST_UNLOCK(&firmwares);
1587 static void reload_firmware(void)
1589 struct iax_firmware *cur = NULL;
1592 char dir[256], fn[256];
1594 AST_LIST_LOCK(&firmwares);
1596 /* Mark all as dead */
1597 AST_LIST_TRAVERSE(&firmwares, cur, list)
1600 /* Now that we have marked them dead... load new ones */
1601 snprintf(dir, sizeof(dir), "%s/firmware/iax", (char *)ast_config_AST_DATA_DIR);
1604 while((de = readdir(fwd))) {
1605 if (de->d_name[0] != '.') {
1606 snprintf(fn, sizeof(fn), "%s/%s", dir, de->d_name);
1607 if (!try_firmware(fn)) {
1608 if (option_verbose > 1)
1609 ast_verbose(VERBOSE_PREFIX_2 "Loaded firmware '%s'\n", de->d_name);
1615 ast_log(LOG_WARNING, "Error opening firmware directory '%s': %s\n", dir, strerror(errno));
1617 /* Clean up leftovers */
1618 AST_LIST_TRAVERSE_SAFE_BEGIN(&firmwares, cur, list) {
1621 AST_LIST_REMOVE_CURRENT(&firmwares, list);
1622 destroy_firmware(cur);
1624 AST_LIST_TRAVERSE_SAFE_END
1626 AST_LIST_UNLOCK(&firmwares);
1629 static int __do_deliver(void *data)
1631 /* Just deliver the packet by using queueing. This is called by
1632 the IAX thread with the iaxsl lock held. */
1633 struct iax_frame *fr = data;
1635 fr->af.has_timing_info = 0;
1636 if (iaxs[fr->callno] && !ast_test_flag(iaxs[fr->callno], IAX_ALREADYGONE))
1637 iax2_queue_frame(fr->callno, &fr->af);
1638 /* Free our iax frame */
1639 iax2_frame_free(fr);
1640 /* And don't run again */
1644 static int handle_error(void)
1646 /* XXX Ideally we should figure out why an error occurred and then abort those
1647 rather than continuing to try. Unfortunately, the published interface does
1648 not seem to work XXX */
1650 struct sockaddr_in *sin;
1653 struct sock_extended_err e;
1658 m.msg_controllen = sizeof(e);
1660 res = recvmsg(netsocket, &m, MSG_ERRQUEUE);
1662 ast_log(LOG_WARNING, "Error detected, but unable to read error: %s\n", strerror(errno));
1664 if (m.msg_controllen) {
1665 sin = (struct sockaddr_in *)SO_EE_OFFENDER(&e);
1667 ast_log(LOG_WARNING, "Receive error from %s\n", ast_inet_ntoa(sin->sin_addr));
1669 ast_log(LOG_WARNING, "No address detected??\n");
1671 ast_log(LOG_WARNING, "Local error: %s\n", strerror(e.ee_errno));
1678 static int transmit_trunk(struct iax_frame *f, struct sockaddr_in *sin, int sockfd)
1681 res = sendto(sockfd, f->data, f->datalen, 0,(struct sockaddr *)sin,
1685 ast_log(LOG_DEBUG, "Received error: %s\n", strerror(errno));
1692 static int send_packet(struct iax_frame *f)
1695 int callno = f->callno;
1697 /* Don't send if there was an error, but return error instead */
1698 if (!callno || !iaxs[callno] || iaxs[callno]->error)
1701 /* Called with iaxsl held */
1702 if (option_debug > 2 && iaxdebug)
1703 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));
1706 iax_showframe(f, NULL, 0, &iaxs[callno]->transfer, f->datalen - sizeof(struct ast_iax2_full_hdr));
1707 res = sendto(iaxs[callno]->sockfd, f->data, f->datalen, 0,(struct sockaddr *)&iaxs[callno]->transfer,
1708 sizeof(iaxs[callno]->transfer));
1711 iax_showframe(f, NULL, 0, &iaxs[callno]->addr, f->datalen - sizeof(struct ast_iax2_full_hdr));
1712 res = sendto(iaxs[callno]->sockfd, f->data, f->datalen, 0,(struct sockaddr *)&iaxs[callno]->addr,
1713 sizeof(iaxs[callno]->addr));
1716 if (option_debug && iaxdebug)
1717 ast_log(LOG_DEBUG, "Received error: %s\n", strerror(errno));
1724 static void iax2_destroy_helper(struct chan_iax2_pvt *pvt)
1726 struct iax2_user *user = NULL;
1728 /* Decrement AUTHREQ count if needed */
1729 if (ast_test_flag(pvt, IAX_MAXAUTHREQ)) {
1730 AST_LIST_LOCK(&users);
1731 AST_LIST_TRAVERSE(&users, user, entry) {
1732 if (!strcmp(user->name, pvt->username)) {
1737 AST_LIST_UNLOCK(&users);
1738 ast_clear_flag(pvt, IAX_MAXAUTHREQ);
1740 /* No more pings or lagrq's */
1741 if (pvt->pingid > -1)
1742 ast_sched_del(sched, pvt->pingid);
1744 if (pvt->lagid > -1)
1745 ast_sched_del(sched, pvt->lagid);
1747 if (pvt->autoid > -1)
1748 ast_sched_del(sched, pvt->autoid);
1750 if (pvt->authid > -1)
1751 ast_sched_del(sched, pvt->authid);
1753 if (pvt->initid > -1)
1754 ast_sched_del(sched, pvt->initid);
1757 ast_sched_del(sched, pvt->jbid);
1761 static int iax2_predestroy(int callno)
1763 struct ast_channel *c = NULL;
1764 struct chan_iax2_pvt *pvt = iaxs[callno];
1769 if (!ast_test_flag(pvt, IAX_ALREADYGONE)) {
1770 iax2_destroy_helper(pvt);
1771 ast_set_flag(pvt, IAX_ALREADYGONE);
1774 if ((c = pvt->owner)) {
1775 c->_softhangup |= AST_SOFTHANGUP_DEV;
1777 ast_queue_hangup(c);
1779 ast_module_unref(ast_module_info->self);
1785 static void iax2_destroy(int callno)
1787 struct chan_iax2_pvt *pvt = NULL;
1788 struct iax_frame *cur = NULL;
1789 struct ast_channel *owner = NULL;
1793 gettimeofday(&lastused[callno], NULL);
1795 owner = pvt ? pvt->owner : NULL;
1798 if (ast_mutex_trylock(&owner->lock)) {
1799 ast_log(LOG_NOTICE, "Avoiding IAX destroy deadlock\n");
1800 ast_mutex_unlock(&iaxsl[callno]);
1802 ast_mutex_lock(&iaxsl[callno]);
1807 iaxs[callno] = NULL;
1811 iax2_destroy_helper(pvt);
1814 ast_set_flag(pvt, IAX_ALREADYGONE);
1817 /* If there's an owner, prod it to give up */
1818 owner->_softhangup |= AST_SOFTHANGUP_DEV;
1819 ast_queue_hangup(owner);
1822 AST_LIST_LOCK(&queue);
1823 AST_LIST_TRAVERSE(&queue, cur, list) {
1824 /* Cancel any pending transmissions */
1825 if (cur->callno == pvt->callno)
1828 AST_LIST_UNLOCK(&queue);
1831 pvt->reg->callno = 0;
1835 ast_variables_destroy(pvt->vars);
1839 while (jb_getall(pvt->jb, &frame) == JB_OK)
1840 iax2_frame_free(frame.data);
1841 jb_destroy(pvt->jb);
1842 /* gotta free up the stringfields */
1843 ast_string_field_free_pools(pvt);
1848 ast_mutex_unlock(&owner->lock);
1850 if (callno & 0x4000)
1854 static int update_packet(struct iax_frame *f)
1856 /* Called with iaxsl lock held, and iaxs[callno] non-NULL */
1857 struct ast_iax2_full_hdr *fh = f->data;
1858 /* Mark this as a retransmission */
1859 fh->dcallno = ntohs(IAX_FLAG_RETRANS | f->dcallno);
1861 f->iseqno = iaxs[f->callno]->iseqno;
1862 fh->iseqno = f->iseqno;
1866 static int attempt_transmit(void *data);
1867 static void __attempt_transmit(void *data)
1869 /* Attempt to transmit the frame to the remote peer...
1870 Called without iaxsl held. */
1871 struct iax_frame *f = data;
1873 int callno = f->callno;
1874 /* Make sure this call is still active */
1876 ast_mutex_lock(&iaxsl[callno]);
1877 if (callno && iaxs[callno]) {
1878 if ((f->retries < 0) /* Already ACK'd */ ||
1879 (f->retries >= max_retries) /* Too many attempts */) {
1880 /* Record an error if we've transmitted too many times */
1881 if (f->retries >= max_retries) {
1883 /* Transfer timeout */
1884 send_command(iaxs[callno], AST_FRAME_IAX, IAX_COMMAND_TXREJ, 0, NULL, 0, -1);
1885 } else if (f->final) {
1887 iax2_destroy(callno);
1889 if (iaxs[callno]->owner)
1890 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);
1891 iaxs[callno]->error = ETIMEDOUT;
1892 if (iaxs[callno]->owner) {
1893 struct ast_frame fr = { 0, };
1895 fr.frametype = AST_FRAME_CONTROL;
1896 fr.subclass = AST_CONTROL_HANGUP;
1897 iax2_queue_frame(callno, &fr);
1898 /* Remember, owner could disappear */
1899 if (iaxs[callno]->owner)
1900 iaxs[callno]->owner->hangupcause = AST_CAUSE_DESTINATION_OUT_OF_ORDER;
1902 if (iaxs[callno]->reg) {
1903 memset(&iaxs[callno]->reg->us, 0, sizeof(iaxs[callno]->reg->us));
1904 iaxs[callno]->reg->regstate = REG_STATE_TIMEOUT;
1905 iaxs[callno]->reg->refresh = IAX_DEFAULT_REG_EXPIRE;
1907 iax2_destroy(callno);
1914 /* Update it if it needs it */
1916 /* Attempt transmission */
1919 /* Try again later after 10 times as long */
1921 if (f->retrytime > MAX_RETRY_TIME)
1922 f->retrytime = MAX_RETRY_TIME;
1923 /* Transfer messages max out at one second */
1924 if (f->transfer && (f->retrytime > 1000))
1925 f->retrytime = 1000;
1926 f->retrans = ast_sched_add(sched, f->retrytime, attempt_transmit, f);
1929 /* Make sure it gets freed */
1934 ast_mutex_unlock(&iaxsl[callno]);
1935 /* Do not try again */
1937 /* Don't attempt delivery, just remove it from the queue */
1938 AST_LIST_LOCK(&queue);
1939 AST_LIST_REMOVE(&queue, f, list);
1940 AST_LIST_UNLOCK(&queue);
1942 /* Free the IAX frame */
1947 static int attempt_transmit(void *data)
1949 #ifdef SCHED_MULTITHREADED
1950 if (schedule_action(__attempt_transmit, data))
1952 __attempt_transmit(data);
1956 static int iax2_prune_realtime(int fd, int argc, char *argv[])
1958 struct iax2_peer *peer;
1961 return RESULT_SHOWUSAGE;
1962 if (!strcmp(argv[3],"all")) {
1964 ast_cli(fd, "OK cache is flushed.\n");
1965 } else if ((peer = find_peer(argv[3], 0))) {
1966 if(ast_test_flag(peer, IAX_RTCACHEFRIENDS)) {
1967 ast_set_flag(peer, IAX_RTAUTOCLEAR);
1968 expire_registry((void*)peer->name);
1969 ast_cli(fd, "OK peer %s was removed from the cache.\n", argv[3]);
1971 ast_cli(fd, "SORRY peer %s is not eligible for this operation.\n", argv[3]);
1974 ast_cli(fd, "SORRY peer %s was not found in the cache.\n", argv[3]);
1977 return RESULT_SUCCESS;
1980 static int iax2_test_losspct(int fd, int argc, char *argv[])
1983 return RESULT_SHOWUSAGE;
1985 test_losspct = atoi(argv[3]);
1987 return RESULT_SUCCESS;
1991 static int iax2_test_late(int fd, int argc, char *argv[])
1994 return RESULT_SHOWUSAGE;
1996 test_late = atoi(argv[3]);
1998 return RESULT_SUCCESS;
2001 static int iax2_test_resync(int fd, int argc, char *argv[])
2004 return RESULT_SHOWUSAGE;
2006 test_resync = atoi(argv[3]);
2008 return RESULT_SUCCESS;
2011 static int iax2_test_jitter(int fd, int argc, char *argv[])
2013 if (argc < 4 || argc > 5)
2014 return RESULT_SHOWUSAGE;
2016 test_jit = atoi(argv[3]);
2018 test_jitpct = atoi(argv[4]);
2020 return RESULT_SUCCESS;
2022 #endif /* IAXTESTS */
2024 /*! \brief peer_status: Report Peer status in character string */
2025 /* returns 1 if peer is online, -1 if unmonitored */
2026 static int peer_status(struct iax2_peer *peer, char *status, int statuslen)
2030 if (peer->lastms < 0) {
2031 ast_copy_string(status, "UNREACHABLE", statuslen);
2032 } else if (peer->lastms > peer->maxms) {
2033 snprintf(status, statuslen, "LAGGED (%d ms)", peer->lastms);
2035 } else if (peer->lastms) {
2036 snprintf(status, statuslen, "OK (%d ms)", peer->lastms);
2039 ast_copy_string(status, "UNKNOWN", statuslen);
2042 ast_copy_string(status, "Unmonitored", statuslen);
2048 /*! \brief Show one peer in detail */
2049 static int iax2_show_peer(int fd, int argc, char *argv[])
2053 struct iax2_peer *peer;
2054 char codec_buf[512];
2055 int x = 0, codec = 0, load_realtime = 0;
2058 return RESULT_SHOWUSAGE;
2060 load_realtime = (argc == 5 && !strcmp(argv[4], "load")) ? 1 : 0;
2062 peer = find_peer(argv[3], load_realtime);
2065 ast_cli(fd, " * Name : %s\n", peer->name);
2066 ast_cli(fd, " Secret : %s\n", ast_strlen_zero(peer->secret)?"<Not set>":"<Set>");
2067 ast_cli(fd, " Context : %s\n", peer->context);
2068 ast_cli(fd, " Mailbox : %s\n", peer->mailbox);
2069 ast_cli(fd, " Dynamic : %s\n", ast_test_flag(peer, IAX_DYNAMIC) ? "Yes":"No");
2070 ast_cli(fd, " Callerid : %s\n", ast_callerid_merge(cbuf, sizeof(cbuf), peer->cid_name, peer->cid_num, "<unspecified>"));
2071 ast_cli(fd, " Expire : %d\n", peer->expire);
2072 ast_cli(fd, " ACL : %s\n", (peer->ha?"Yes":"No"));
2073 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));
2074 ast_cli(fd, " Defaddr->IP : %s Port %d\n", ast_inet_ntoa(peer->defaddr.sin_addr), ntohs(peer->defaddr.sin_port));
2075 ast_cli(fd, " Username : %s\n", peer->username);
2076 ast_cli(fd, " Codecs : ");
2077 ast_getformatname_multiple(codec_buf, sizeof(codec_buf) -1, peer->capability);
2078 ast_cli(fd, "%s\n", codec_buf);
2080 ast_cli(fd, " Codec Order : (");
2081 for(x = 0; x < 32 ; x++) {
2082 codec = ast_codec_pref_index(&peer->prefs,x);
2085 ast_cli(fd, "%s", ast_getformatname(codec));
2086 if(x < 31 && ast_codec_pref_index(&peer->prefs,x+1))
2091 ast_cli(fd, "none");
2094 ast_cli(fd, " Status : ");
2095 peer_status(peer, status, sizeof(status));
2096 ast_cli(fd, "%s\n",status);
2097 ast_cli(fd, " Qualify : every %dms when OK, every %dms when UNREACHABLE (sample smoothing %s)\n", peer->pokefreqok, peer->pokefreqnotok, peer->smoothing ? "On" : "Off");
2099 if (ast_test_flag(peer, IAX_TEMPONLY))
2102 ast_cli(fd,"Peer %s not found.\n", argv[3]);
2106 return RESULT_SUCCESS;
2109 static char *complete_iax2_show_peer(const char *line, const char *word, int pos, int state)
2112 struct iax2_peer *p = NULL;
2114 int wordlen = strlen(word);
2116 /* 0 - iax2; 1 - show; 2 - peer; 3 - <peername> */
2118 AST_LIST_LOCK(&peers);
2119 AST_LIST_TRAVERSE(&peers, p, entry) {
2120 if (!strncasecmp(p->name, word, wordlen) && ++which > state) {
2121 res = ast_strdup(p->name);
2125 AST_LIST_UNLOCK(&peers);
2131 static int iax2_show_stats(int fd, int argc, char *argv[])
2133 struct iax_frame *cur;
2134 int cnt = 0, dead=0, final=0;
2137 return RESULT_SHOWUSAGE;
2139 AST_LIST_LOCK(&queue);
2140 AST_LIST_TRAVERSE(&queue, cur, list) {
2141 if (cur->retries < 0)
2147 AST_LIST_UNLOCK(&queue);
2149 ast_cli(fd, " IAX Statistics\n");
2150 ast_cli(fd, "---------------------\n");
2151 ast_cli(fd, "Outstanding frames: %d (%d ingress, %d egress)\n", iax_get_frames(), iax_get_iframes(), iax_get_oframes());
2152 ast_cli(fd, "%d timed and %d untimed transmits; MTU %d/%d/%d\n", trunk_timed, trunk_untimed,
2153 trunk_maxmtu, trunk_nmaxmtu, global_max_trunk_mtu);
2155 ast_cli(fd, "Packets in transmit queue: %d dead, %d final, %d total\n\n", dead, final, cnt);
2157 trunk_timed = trunk_untimed = 0;
2158 if (trunk_maxmtu > trunk_nmaxmtu)
2159 trunk_nmaxmtu = trunk_maxmtu;
2161 return RESULT_SUCCESS;
2164 /*! \brief Set trunk MTU from CLI */
2165 static int iax2_set_mtu(int fd, int argc, char *argv[])
2170 return RESULT_SHOWUSAGE;
2171 if (strncasecmp(argv[3], "default", strlen(argv[3])) == 0)
2172 mtuv = MAX_TRUNK_MTU;
2174 mtuv = atoi(argv[3]);
2177 ast_cli(fd, "Trunk MTU control disabled (mtu was %d)\n", global_max_trunk_mtu);
2178 global_max_trunk_mtu = 0;
2179 return RESULT_SUCCESS;
2181 if (mtuv < 172 || mtuv > 4000) {
2182 ast_cli(fd, "Trunk MTU must be between 172 and 4000\n");
2183 return RESULT_SHOWUSAGE;
2185 ast_cli(fd, "Trunk MTU changed from %d to %d\n", global_max_trunk_mtu, mtuv);
2186 global_max_trunk_mtu = mtuv;
2187 return RESULT_SUCCESS;
2190 static int iax2_show_cache(int fd, int argc, char *argv[])
2192 struct iax2_dpcache *dp = NULL;
2193 char tmp[1024], *pc = NULL;
2197 gettimeofday(&tv, NULL);
2199 AST_LIST_LOCK(&dpcache);
2201 ast_cli(fd, "%-20.20s %-12.12s %-9.9s %-8.8s %s\n", "Peer/Context", "Exten", "Exp.", "Wait.", "Flags");
2203 AST_LIST_TRAVERSE(&dpcache, dp, cache_list) {
2204 s = dp->expiry.tv_sec - tv.tv_sec;
2206 if (dp->flags & CACHE_FLAG_EXISTS)
2207 strncat(tmp, "EXISTS|", sizeof(tmp) - strlen(tmp) - 1);
2208 if (dp->flags & CACHE_FLAG_NONEXISTENT)
2209 strncat(tmp, "NONEXISTENT|", sizeof(tmp) - strlen(tmp) - 1);
2210 if (dp->flags & CACHE_FLAG_CANEXIST)
2211 strncat(tmp, "CANEXIST|", sizeof(tmp) - strlen(tmp) - 1);
2212 if (dp->flags & CACHE_FLAG_PENDING)
2213 strncat(tmp, "PENDING|", sizeof(tmp) - strlen(tmp) - 1);
2214 if (dp->flags & CACHE_FLAG_TIMEOUT)
2215 strncat(tmp, "TIMEOUT|", sizeof(tmp) - strlen(tmp) - 1);
2216 if (dp->flags & CACHE_FLAG_TRANSMITTED)
2217 strncat(tmp, "TRANSMITTED|", sizeof(tmp) - strlen(tmp) - 1);
2218 if (dp->flags & CACHE_FLAG_MATCHMORE)
2219 strncat(tmp, "MATCHMORE|", sizeof(tmp) - strlen(tmp) - 1);
2220 if (dp->flags & CACHE_FLAG_UNKNOWN)
2221 strncat(tmp, "UNKNOWN|", sizeof(tmp) - strlen(tmp) - 1);
2222 /* Trim trailing pipe */
2223 if (!ast_strlen_zero(tmp))
2224 tmp[strlen(tmp) - 1] = '\0';
2226 ast_copy_string(tmp, "(none)", sizeof(tmp));
2228 pc = strchr(dp->peercontext, '@');
2230 pc = dp->peercontext;
2233 for (x=0;x<sizeof(dp->waiters) / sizeof(dp->waiters[0]); x++)
2234 if (dp->waiters[x] > -1)
2237 ast_cli(fd, "%-20.20s %-12.12s %-9d %-8d %s\n", pc, dp->exten, s, y, tmp);
2239 ast_cli(fd, "%-20.20s %-12.12s %-9.9s %-8d %s\n", pc, dp->exten, "(expired)", y, tmp);
2242 AST_LIST_LOCK(&dpcache);
2244 return RESULT_SUCCESS;
2247 static unsigned int calc_rxstamp(struct chan_iax2_pvt *p, unsigned int offset);
2249 static void unwrap_timestamp(struct iax_frame *fr)
2253 if ( (fr->ts & 0xFFFF0000) == (iaxs[fr->callno]->last & 0xFFFF0000) ) {
2254 x = fr->ts - iaxs[fr->callno]->last;
2256 /* Sudden big jump backwards in timestamp:
2257 What likely happened here is that miniframe timestamp has circled but we haven't
2258 gotten the update from the main packet. We'll just pretend that we did, and
2259 update the timestamp appropriately. */
2260 fr->ts = ( (iaxs[fr->callno]->last & 0xFFFF0000) + 0x10000) | (fr->ts & 0xFFFF);
2261 if (option_debug && iaxdebug)
2262 ast_log(LOG_DEBUG, "schedule_delivery: pushed forward timestamp\n");
2265 /* Sudden apparent big jump forwards in timestamp:
2266 What's likely happened is this is an old miniframe belonging to the previous
2267 top-16-bit timestamp that has turned up out of order.
2268 Adjust the timestamp appropriately. */
2269 fr->ts = ( (iaxs[fr->callno]->last & 0xFFFF0000) - 0x10000) | (fr->ts & 0xFFFF);
2270 if (option_debug && iaxdebug)
2271 ast_log(LOG_DEBUG, "schedule_delivery: pushed back timestamp\n");
2276 static int get_from_jb(void *p);
2278 static void update_jbsched(struct chan_iax2_pvt *pvt)
2282 when = ast_tvdiff_ms(ast_tvnow(), pvt->rxcore);
2284 when = jb_next(pvt->jb) - when;
2286 if(pvt->jbid > -1) ast_sched_del(sched, pvt->jbid);
2289 /* XXX should really just empty until when > 0.. */
2293 pvt->jbid = ast_sched_add(sched, when, get_from_jb, CALLNO_TO_PTR(pvt->callno));
2295 /* Signal scheduler thread */
2296 signal_condition(&sched_lock, &sched_cond);
2299 static void __get_from_jb(void *p)
2301 int callno = PTR_TO_CALLNO(p);
2302 struct chan_iax2_pvt *pvt = NULL;
2303 struct iax_frame *fr;
2310 /* Make sure we have a valid private structure before going on */
2311 ast_mutex_lock(&iaxsl[callno]);
2315 ast_mutex_unlock(&iaxsl[callno]);
2321 gettimeofday(&tv,NULL);
2322 /* round up a millisecond since ast_sched_runq does; */
2323 /* prevents us from spinning while waiting for our now */
2324 /* to catch up with runq's now */
2327 now = ast_tvdiff_ms(tv, pvt->rxcore);
2329 if(now >= (next = jb_next(pvt->jb))) {
2330 ret = jb_get(pvt->jb,&frame,now,ast_codec_interp_len(pvt->voiceformat));
2338 struct ast_frame af;
2340 /* create an interpolation frame */
2341 af.frametype = AST_FRAME_VOICE;
2342 af.subclass = pvt->voiceformat;
2344 af.samples = frame.ms * 8;
2346 af.src = "IAX2 JB interpolation";
2348 af.delivery = ast_tvadd(pvt->rxcore, ast_samp2tv(next, 1000));
2349 af.offset=AST_FRIENDLY_OFFSET;
2351 /* queue the frame: For consistency, we would call __do_deliver here, but __do_deliver wants an iax_frame,
2352 * which we'd need to malloc, and then it would free it. That seems like a drag */
2353 if (!ast_test_flag(iaxs[callno], IAX_ALREADYGONE))
2354 iax2_queue_frame(callno, &af);
2358 iax2_frame_free(frame.data);
2365 /* shouldn't happen */
2369 update_jbsched(pvt);
2370 ast_mutex_unlock(&iaxsl[callno]);
2373 static int get_from_jb(void *data)
2375 #ifdef SCHED_MULTITHREADED
2376 if (schedule_action(__get_from_jb, data))
2378 __get_from_jb(data);
2382 static int schedule_delivery(struct iax_frame *fr, int updatehistory, int fromtrunk, unsigned int *tsout)
2388 /* Attempt to recover wrapped timestamps */
2389 unwrap_timestamp(fr);
2392 /* delivery time is sender's sent timestamp converted back into absolute time according to our clock */
2393 if ( !fromtrunk && !ast_tvzero(iaxs[fr->callno]->rxcore))
2394 fr->af.delivery = ast_tvadd(iaxs[fr->callno]->rxcore, ast_samp2tv(fr->ts, 1000));
2398 ast_log(LOG_DEBUG, "schedule_delivery: set delivery to 0 as we don't have an rxcore yet, or frame is from trunk.\n");
2400 fr->af.delivery = ast_tv(0,0);
2403 type = JB_TYPE_CONTROL;
2406 if(fr->af.frametype == AST_FRAME_VOICE) {
2407 type = JB_TYPE_VOICE;
2408 len = ast_codec_get_samples(&fr->af) / 8;
2409 } else if(fr->af.frametype == AST_FRAME_CNG) {
2410 type = JB_TYPE_SILENCE;
2413 if ( (!ast_test_flag(iaxs[fr->callno], IAX_USEJITTERBUF)) ) {
2420 /* if the user hasn't requested we force the use of the jitterbuffer, and we're bridged to
2421 * a channel that can accept jitter, then flush and suspend the jb, and send this frame straight through */
2422 if( (!ast_test_flag(iaxs[fr->callno], IAX_FORCEJITTERBUF)) &&
2423 iaxs[fr->callno]->owner && ast_bridged_channel(iaxs[fr->callno]->owner) &&
2424 (ast_bridged_channel(iaxs[fr->callno]->owner)->tech->properties & AST_CHAN_TP_WANTSJITTER)) {
2427 /* deliver any frames in the jb */
2428 while(jb_getall(iaxs[fr->callno]->jb,&frame) == JB_OK)
2429 __do_deliver(frame.data);
2431 jb_reset(iaxs[fr->callno]->jb);
2433 if (iaxs[fr->callno]->jbid > -1)
2434 ast_sched_del(sched, iaxs[fr->callno]->jbid);
2436 iaxs[fr->callno]->jbid = -1;
2438 /* deliver this frame now */
2445 /* insert into jitterbuffer */
2446 /* TODO: Perhaps we could act immediately if it's not droppable and late */
2447 ret = jb_put(iaxs[fr->callno]->jb, fr, type, len, fr->ts,
2448 calc_rxstamp(iaxs[fr->callno],fr->ts));
2449 if (ret == JB_DROP) {
2451 } else if (ret == JB_SCHED) {
2452 update_jbsched(iaxs[fr->callno]);
2457 /* Free our iax frame */
2458 iax2_frame_free(fr);
2464 static int iax2_transmit(struct iax_frame *fr)
2466 /* Lock the queue and place this packet at the end */
2467 /* By setting this to 0, the network thread will send it for us, and
2468 queue retransmission if necessary */
2470 AST_LIST_LOCK(&queue);
2471 AST_LIST_INSERT_TAIL(&queue, fr, list);
2472 AST_LIST_UNLOCK(&queue);
2473 /* Wake up the network and scheduler thread */
2474 pthread_kill(netthreadid, SIGURG);
2475 signal_condition(&sched_lock, &sched_cond);
2481 static int iax2_digit_begin(struct ast_channel *c, char digit)
2483 return send_command_locked(PTR_TO_CALLNO(c->tech_pvt), AST_FRAME_DTMF_BEGIN, digit, 0, NULL, 0, -1);
2486 static int iax2_digit_end(struct ast_channel *c, char digit, unsigned int duration)
2488 return send_command_locked(PTR_TO_CALLNO(c->tech_pvt), AST_FRAME_DTMF_END, digit, 0, NULL, 0, -1);
2491 static int iax2_sendtext(struct ast_channel *c, const char *text)
2494 return send_command_locked(PTR_TO_CALLNO(c->tech_pvt), AST_FRAME_TEXT,
2495 0, 0, (unsigned char *)text, strlen(text) + 1, -1);
2498 static int iax2_sendimage(struct ast_channel *c, struct ast_frame *img)
2500 return send_command_locked(PTR_TO_CALLNO(c->tech_pvt), AST_FRAME_IMAGE, img->subclass, 0, img->data, img->datalen, -1);
2503 static int iax2_sendhtml(struct ast_channel *c, int subclass, const char *data, int datalen)
2505 return send_command_locked(PTR_TO_CALLNO(c->tech_pvt), AST_FRAME_HTML, subclass, 0, (unsigned char *)data, datalen, -1);
2508 static int iax2_fixup(struct ast_channel *oldchannel, struct ast_channel *newchan)
2510 unsigned short callno = PTR_TO_CALLNO(newchan->tech_pvt);
2511 ast_mutex_lock(&iaxsl[callno]);
2513 iaxs[callno]->owner = newchan;
2515 ast_log(LOG_WARNING, "Uh, this isn't a good sign...\n");
2516 ast_mutex_unlock(&iaxsl[callno]);
2520 static struct iax2_peer *realtime_peer(const char *peername, struct sockaddr_in *sin)
2522 struct ast_variable *var;
2523 struct ast_variable *tmp;
2524 struct iax2_peer *peer=NULL;
2525 time_t regseconds = 0, nowtime;
2529 var = ast_load_realtime("iaxpeers", "name", peername, NULL);
2532 sprintf(porta, "%d", ntohs(sin->sin_port));
2533 var = ast_load_realtime("iaxpeers", "ipaddr", ast_inet_ntoa(sin->sin_addr), "port", porta, NULL);
2535 /* We'll need the peer name in order to build the structure! */
2536 for (tmp = var; tmp; tmp = tmp->next) {
2537 if (!strcasecmp(tmp->name, "name"))
2538 peername = tmp->value;
2545 peer = build_peer(peername, var, NULL, ast_test_flag((&globalflags), IAX_RTCACHEFRIENDS) ? 0 : 1);
2548 ast_variables_destroy(var);
2552 for (tmp = var; tmp; tmp = tmp->next) {
2553 /* Make sure it's not a user only... */
2554 if (!strcasecmp(tmp->name, "type")) {
2555 if (strcasecmp(tmp->value, "friend") &&
2556 strcasecmp(tmp->value, "peer")) {
2557 /* Whoops, we weren't supposed to exist! */
2562 } else if (!strcasecmp(tmp->name, "regseconds")) {
2563 ast_get_time_t(tmp->value, ®seconds, 0, NULL);
2564 } else if (!strcasecmp(tmp->name, "ipaddr")) {
2565 inet_aton(tmp->value, &(peer->addr.sin_addr));
2566 } else if (!strcasecmp(tmp->name, "port")) {
2567 peer->addr.sin_port = htons(atoi(tmp->value));
2568 } else if (!strcasecmp(tmp->name, "host")) {
2569 if (!strcasecmp(tmp->value, "dynamic"))
2574 ast_variables_destroy(var);
2579 if (ast_test_flag((&globalflags), IAX_RTCACHEFRIENDS)) {
2580 ast_copy_flags(peer, &globalflags, IAX_RTAUTOCLEAR|IAX_RTCACHEFRIENDS);
2581 if (ast_test_flag(peer, IAX_RTAUTOCLEAR)) {
2582 if (peer->expire > -1)
2583 ast_sched_del(sched, peer->expire);
2584 peer->expire = ast_sched_add(sched, (global_rtautoclear) * 1000, expire_registry, (void*)peer->name);
2586 AST_LIST_LOCK(&peers);
2587 AST_LIST_INSERT_HEAD(&peers, peer, entry);
2588 AST_LIST_UNLOCK(&peers);
2589 if (ast_test_flag(peer, IAX_DYNAMIC))
2590 reg_source_db(peer);
2592 ast_set_flag(peer, IAX_TEMPONLY);
2595 if (!ast_test_flag(&globalflags, IAX_RTIGNOREREGEXPIRE) && dynamic) {
2597 if ((nowtime - regseconds) > IAX_DEFAULT_REG_EXPIRE) {
2598 memset(&peer->addr, 0, sizeof(peer->addr));
2599 realtime_update_peer(peer->name, &peer->addr, 0);
2601 ast_log(LOG_DEBUG, "realtime_peer: Bah, '%s' is expired (%d/%d/%d)!\n",
2602 peername, (int)(nowtime - regseconds), (int)regseconds, (int)nowtime);
2606 ast_log(LOG_DEBUG, "realtime_peer: Registration for '%s' still active (%d/%d/%d)!\n",
2607 peername, (int)(nowtime - regseconds), (int)regseconds, (int)nowtime);
2614 static struct iax2_user *realtime_user(const char *username)
2616 struct ast_variable *var;
2617 struct ast_variable *tmp;
2618 struct iax2_user *user=NULL;
2620 var = ast_load_realtime("iaxusers", "name", username, NULL);
2626 /* Make sure it's not a peer only... */
2627 if (!strcasecmp(tmp->name, "type")) {
2628 if (strcasecmp(tmp->value, "friend") &&
2629 strcasecmp(tmp->value, "user")) {
2636 user = build_user(username, var, NULL, !ast_test_flag((&globalflags), IAX_RTCACHEFRIENDS));
2638 ast_variables_destroy(var);
2643 if (ast_test_flag((&globalflags), IAX_RTCACHEFRIENDS)) {
2644 ast_set_flag(user, IAX_RTCACHEFRIENDS);
2645 AST_LIST_LOCK(&users);
2646 AST_LIST_INSERT_HEAD(&users, user, entry);
2647 AST_LIST_UNLOCK(&users);
2649 ast_set_flag(user, IAX_TEMPONLY);
2655 static void realtime_update_peer(const char *peername, struct sockaddr_in *sin, time_t regtime)
2658 char regseconds[20];
2660 snprintf(regseconds, sizeof(regseconds), "%d", (int)regtime);
2661 snprintf(port, sizeof(port), "%d", ntohs(sin->sin_port));
2662 ast_update_realtime("iaxpeers", "name", peername,
2663 "ipaddr", ast_inet_ntoa(sin->sin_addr), "port", port,
2664 "regseconds", regseconds, NULL);
2667 struct create_addr_info {
2680 char context[AST_MAX_CONTEXT];
2681 char peercontext[AST_MAX_CONTEXT];
2682 char mohinterpret[MAX_MUSICCLASS];
2683 char mohsuggest[MAX_MUSICCLASS];
2686 static int create_addr(const char *peername, struct sockaddr_in *sin, struct create_addr_info *cai)
2688 struct iax2_peer *peer;
2690 ast_clear_flag(cai, IAX_SENDANI | IAX_TRUNK);
2691 cai->sockfd = defaultsockfd;
2693 sin->sin_family = AF_INET;
2695 if (!(peer = find_peer(peername, 1))) {
2697 if (ast_get_ip_or_srv(sin, peername, srvlookup ? "_iax._udp" : NULL)) {
2698 ast_log(LOG_WARNING, "No such host: %s\n", peername);
2701 sin->sin_port = htons(IAX_DEFAULT_PORTNO);
2702 /* use global iax prefs for unknown peer/user */
2703 ast_codec_pref_convert(&prefs, cai->prefs, sizeof(cai->prefs), 1);
2709 /* if the peer has no address (current or default), return failure */
2710 if (!(peer->addr.sin_addr.s_addr || peer->defaddr.sin_addr.s_addr)) {
2711 if (ast_test_flag(peer, IAX_TEMPONLY))
2716 /* if the peer is being monitored and is currently unreachable, return failure */
2717 if (peer->maxms && ((peer->lastms > peer->maxms) || (peer->lastms < 0))) {
2718 if (ast_test_flag(peer, IAX_TEMPONLY))
2723 ast_copy_flags(cai, peer, IAX_SENDANI | IAX_TRUNK | IAX_NOTRANSFER | IAX_TRANSFERMEDIA | IAX_USEJITTERBUF | IAX_FORCEJITTERBUF);
2724 cai->maxtime = peer->maxms;
2725 cai->capability = peer->capability;
2726 cai->encmethods = peer->encmethods;
2727 cai->sockfd = peer->sockfd;
2728 cai->adsi = peer->adsi;
2729 ast_codec_pref_convert(&peer->prefs, cai->prefs, sizeof(cai->prefs), 1);
2730 ast_copy_string(cai->context, peer->context, sizeof(cai->context));
2731 ast_copy_string(cai->peercontext, peer->peercontext, sizeof(cai->peercontext));
2732 ast_copy_string(cai->username, peer->username, sizeof(cai->username));
2733 ast_copy_string(cai->timezone, peer->zonetag, sizeof(cai->timezone));
2734 ast_copy_string(cai->outkey, peer->outkey, sizeof(cai->outkey));
2735 ast_copy_string(cai->mohinterpret, peer->mohinterpret, sizeof(cai->mohinterpret));
2736 ast_copy_string(cai->mohsuggest, peer->mohsuggest, sizeof(cai->mohsuggest));
2737 if (ast_strlen_zero(peer->dbsecret)) {
2738 ast_copy_string(cai->secret, peer->secret, sizeof(cai->secret));
2743 family = ast_strdupa(peer->dbsecret);
2744 key = strchr(family, '/');
2747 if (!key || ast_db_get(family, key, cai->secret, sizeof(cai->secret))) {
2748 ast_log(LOG_WARNING, "Unable to retrieve database password for family/key '%s'!\n", peer->dbsecret);
2749 if (ast_test_flag(peer, IAX_TEMPONLY))
2755 if (peer->addr.sin_addr.s_addr) {
2756 sin->sin_addr = peer->addr.sin_addr;
2757 sin->sin_port = peer->addr.sin_port;
2759 sin->sin_addr = peer->defaddr.sin_addr;
2760 sin->sin_port = peer->defaddr.sin_port;
2763 if (ast_test_flag(peer, IAX_TEMPONLY))
2769 static void __auto_congest(void *nothing)
2771 int callno = PTR_TO_CALLNO(nothing);
2772 struct ast_frame f = { AST_FRAME_CONTROL, AST_CONTROL_CONGESTION };
2773 ast_mutex_lock(&iaxsl[callno]);
2775 iaxs[callno]->initid = -1;
2776 iax2_queue_frame(callno, &f);
2777 ast_log(LOG_NOTICE, "Auto-congesting call due to slow response\n");
2779 ast_mutex_unlock(&iaxsl[callno]);
2782 static int auto_congest(void *data)
2784 #ifdef SCHED_MULTITHREADED
2785 if (schedule_action(__auto_congest, data))
2787 __auto_congest(data);
2791 static unsigned int iax2_datetime(const char *tz)
2797 localtime_r(&t, &tm);
2798 if (!ast_strlen_zero(tz))
2799 ast_localtime(&t, &tm, tz);
2800 tmp = (tm.tm_sec >> 1) & 0x1f; /* 5 bits of seconds */
2801 tmp |= (tm.tm_min & 0x3f) << 5; /* 6 bits of minutes */
2802 tmp |= (tm.tm_hour & 0x1f) << 11; /* 5 bits of hours */
2803 tmp |= (tm.tm_mday & 0x1f) << 16; /* 5 bits of day of month */
2804 tmp |= ((tm.tm_mon + 1) & 0xf) << 21; /* 4 bits of month */
2805 tmp |= ((tm.tm_year - 100) & 0x7f) << 25; /* 7 bits of year */
2809 struct parsed_dial_string {
2821 * \brief Parses an IAX dial string into its component parts.
2822 * \param data the string to be parsed
2823 * \param pds pointer to a \c struct \c parsed_dial_string to be filled in
2826 * This function parses the string and fills the structure
2827 * with pointers to its component parts. The input string
2830 * \note This function supports both plaintext passwords and RSA
2831 * key names; if the password string is formatted as '[keyname]',
2832 * then the keyname will be placed into the key field, and the
2833 * password field will be set to NULL.
2835 * \note The dial string format is:
2836 * [username[:password]@]peer[:port][/exten[@@context]][/options]
2838 static void parse_dial_string(char *data, struct parsed_dial_string *pds)
2840 if (ast_strlen_zero(data))
2843 pds->peer = strsep(&data, "/");
2844 pds->exten = strsep(&data, "/");
2845 pds->options = data;
2849 pds->exten = strsep(&data, "@");
2850 pds->context = data;
2853 if (strchr(pds->peer, '@')) {
2855 pds->username = strsep(&data, "@");
2859 if (pds->username) {
2860 data = pds->username;
2861 pds->username = strsep(&data, ":");
2862 pds->password = data;
2866 pds->peer = strsep(&data, ":");
2869 /* check for a key name wrapped in [] in the secret position, if found,
2870 move it to the key field instead
2872 if (pds->password && (pds->password[0] == '[')) {
2873 pds->key = ast_strip_quoted(pds->password, "[", "]");
2874 pds->password = NULL;
2878 static int iax2_call(struct ast_channel *c, char *dest, int timeout)
2880 struct sockaddr_in sin;
2881 char *l=NULL, *n=NULL, *tmpstr;
2882 struct iax_ie_data ied;
2883 char *defaultrdest = "s";
2884 unsigned short callno = PTR_TO_CALLNO(c->tech_pvt);
2885 struct parsed_dial_string pds;
2886 struct create_addr_info cai;
2887 struct ast_var_t *var;
2889 if ((c->_state != AST_STATE_DOWN) && (c->_state != AST_STATE_RESERVED)) {
2890 ast_log(LOG_WARNING, "Channel is already in use (%s)?\n", c->name);
2894 memset(&cai, 0, sizeof(cai));
2895 cai.encmethods = iax2_encryption;
2897 memset(&pds, 0, sizeof(pds));
2898 tmpstr = ast_strdupa(dest);
2899 parse_dial_string(tmpstr, &pds);
2902 pds.exten = defaultrdest;
2904 if (create_addr(pds.peer, &sin, &cai)) {
2905 ast_log(LOG_WARNING, "No address associated with '%s'\n", pds.peer);
2909 if (!pds.username && !ast_strlen_zero(cai.username))
2910 pds.username = cai.username;
2911 if (!pds.password && !ast_strlen_zero(cai.secret))
2912 pds.password = cai.secret;
2913 if (!pds.key && !ast_strlen_zero(cai.outkey))
2914 pds.key = cai.outkey;
2915 if (!pds.context && !ast_strlen_zero(cai.peercontext))
2916 pds.context = cai.peercontext;
2918 /* Keep track of the context for outgoing calls too */
2919 ast_copy_string(c->context, cai.context, sizeof(c->context));
2922 sin.sin_port = htons(atoi(pds.port));
2925 n = c->cid.cid_name;
2927 /* Now build request */
2928 memset(&ied, 0, sizeof(ied));
2930 /* On new call, first IE MUST be IAX version of caller */
2931 iax_ie_append_short(&ied, IAX_IE_VERSION, IAX_PROTO_VERSION);
2932 iax_ie_append_str(&ied, IAX_IE_CALLED_NUMBER, pds.exten);
2933 if (pds.options && strchr(pds.options, 'a')) {
2934 /* Request auto answer */
2935 iax_ie_append(&ied, IAX_IE_AUTOANSWER);
2938 iax_ie_append_str(&ied, IAX_IE_CODEC_PREFS, cai.prefs);
2941 iax_ie_append_str(&ied, IAX_IE_CALLING_NUMBER, l);
2942 iax_ie_append_byte(&ied, IAX_IE_CALLINGPRES, c->cid.cid_pres);
2945 iax_ie_append_byte(&ied, IAX_IE_CALLINGPRES, c->cid.cid_pres);
2947 iax_ie_append_byte(&ied, IAX_IE_CALLINGPRES, AST_PRES_NUMBER_NOT_AVAILABLE);
2950 iax_ie_append_byte(&ied, IAX_IE_CALLINGTON, c->cid.cid_ton);
2951 iax_ie_append_short(&ied, IAX_IE_CALLINGTNS, c->cid.cid_tns);
2954 iax_ie_append_str(&ied, IAX_IE_CALLING_NAME, n);
2955 if (ast_test_flag(iaxs[callno], IAX_SENDANI) && c->cid.cid_ani)
2956 iax_ie_append_str(&ied, IAX_IE_CALLING_ANI, c->cid.cid_ani);
2958 if (!ast_strlen_zero(c->language))
2959 iax_ie_append_str(&ied, IAX_IE_LANGUAGE, c->language);
2960 if (!ast_strlen_zero(c->cid.cid_dnid))
2961 iax_ie_append_str(&ied, IAX_IE_DNID, c->cid.cid_dnid);
2962 if (!ast_strlen_zero(c->cid.cid_rdnis))
2963 iax_ie_append_str(&ied, IAX_IE_RDNIS, c->cid.cid_rdnis);
2966 iax_ie_append_str(&ied, IAX_IE_CALLED_CONTEXT, pds.context);
2969 iax_ie_append_str(&ied, IAX_IE_USERNAME, pds.username);
2972 iax_ie_append_short(&ied, IAX_IE_ENCRYPTION, cai.encmethods);
2974 ast_mutex_lock(&iaxsl[callno]);
2976 if (!ast_strlen_zero(c->context))
2977 ast_string_field_set(iaxs[callno], context, c->context);
2980 ast_string_field_set(iaxs[callno], username, pds.username);
2982 iaxs[callno]->encmethods = cai.encmethods;
2984 iaxs[callno]->adsi = cai.adsi;
2986 ast_string_field_set(iaxs[callno], mohinterpret, cai.mohinterpret);
2987 ast_string_field_set(iaxs[callno], mohsuggest, cai.mohsuggest);
2990 ast_string_field_set(iaxs[callno], outkey, pds.key);
2992 ast_string_field_set(iaxs[callno], secret, pds.password);
2994 iax_ie_append_int(&ied, IAX_IE_FORMAT, c->nativeformats);
2995 iax_ie_append_int(&ied, IAX_IE_CAPABILITY, iaxs[callno]->capability);
2996 iax_ie_append_short(&ied, IAX_IE_ADSICPE, c->adsicpe);
2997 iax_ie_append_int(&ied, IAX_IE_DATETIME, iax2_datetime(cai.timezone));
2999 if (iaxs[callno]->maxtime) {
3000 /* Initialize pingtime and auto-congest time */
3001 iaxs[callno]->pingtime = iaxs[callno]->maxtime / 2;
3002 iaxs[callno]->initid = ast_sched_add(sched, iaxs[callno]->maxtime * 2, auto_congest, CALLNO_TO_PTR(callno));
3003 } else if (autokill) {
3004 iaxs[callno]->pingtime = autokill / 2;
3005 iaxs[callno]->initid = ast_sched_add(sched, autokill * 2, auto_congest, CALLNO_TO_PTR(callno));
3008 /* send the command using the appropriate socket for this peer */
3009 iaxs[callno]->sockfd = cai.sockfd;
3011 /* Add remote vars */
3012 AST_LIST_TRAVERSE(&c->varshead, var, entries) {
3013 if (!strncmp(ast_var_name(var), "~IAX2~", strlen("~IAX2~"))) {
3016 /* Automatically divide the value up into sized chunks */
3017 for (i = 0; i < strlen(ast_var_value(var)); i += 255 - (strlen(ast_var_name(var)) - strlen("~IAX2~") + 1)) {
3018 snprintf(tmp, sizeof(tmp), "%s=%s", ast_var_name(var) + strlen("~IAX2~"), ast_var_value(var) + i);
3019 iax_ie_append_str(&ied, IAX_IE_VARIABLE, tmp);
3024 /* Transmit the string in a "NEW" request */
3025 send_command(iaxs[callno], AST_FRAME_IAX, IAX_COMMAND_NEW, 0, ied.buf, ied.pos, -1);
3027 ast_mutex_unlock(&iaxsl[callno]);
3028 ast_setstate(c, AST_STATE_RINGING);
3033 static int iax2_hangup(struct ast_channel *c)
3035 unsigned short callno = PTR_TO_CALLNO(c->tech_pvt);
3037 struct iax_ie_data ied;
3038 memset(&ied, 0, sizeof(ied));
3039 ast_mutex_lock(&iaxsl[callno]);
3040 if (callno && iaxs[callno]) {
3042 ast_log(LOG_DEBUG, "We're hanging up %s now...\n", c->name);
3043 alreadygone = ast_test_flag(iaxs[callno], IAX_ALREADYGONE);
3044 /* Send the hangup unless we have had a transmission error or are already gone */
3045 iax_ie_append_byte(&ied, IAX_IE_CAUSECODE, (unsigned char)c->hangupcause);
3046 if (!iaxs[callno]->error && !alreadygone)
3047 send_command_final(iaxs[callno], AST_FRAME_IAX, IAX_COMMAND_HANGUP, 0, ied.buf, ied.pos, -1);
3048 /* Explicitly predestroy it */
3049 iax2_predestroy(callno);
3050 /* If we were already gone to begin with, destroy us now */
3053 ast_log(LOG_DEBUG, "Really destroying %s now...\n", c->name);
3054 iax2_destroy(callno);
3057 ast_mutex_unlock(&iaxsl[callno]);
3058 if (option_verbose > 2)
3059 ast_verbose(VERBOSE_PREFIX_3 "Hungup '%s'\n", c->name);
3063 static int iax2_setoption(struct ast_channel *c, int option, void *data, int datalen)
3065 struct ast_option_header *h;
3069 case AST_OPTION_TXGAIN:
3070 case AST_OPTION_RXGAIN:
3071 /* these two cannot be sent, because they require a result */
3075 if (!(h = ast_malloc(datalen + sizeof(*h))))
3078 h->flag = AST_OPTION_FLAG_REQUEST;
3079 h->option = htons(option);
3080 memcpy(h->data, data, datalen);
3081 res = send_command_locked(PTR_TO_CALLNO(c->tech_pvt), AST_FRAME_CONTROL,
3082 AST_CONTROL_OPTION, 0, (unsigned char *) h,
3083 datalen + sizeof(*h), -1);
3089 static struct ast_frame *iax2_read(struct ast_channel *c)
3091 ast_log(LOG_NOTICE, "I should never be called!\n");
3092 return &ast_null_frame;
3095 static int iax2_start_transfer(unsigned short callno0, unsigned short callno1, int mediaonly)
3098 struct iax_ie_data ied0;
3099 struct iax_ie_data ied1;
3100 unsigned int transferid = (unsigned int)ast_random();
3101 memset(&ied0, 0, sizeof(ied0));
3102 iax_ie_append_addr(&ied0, IAX_IE_APPARENT_ADDR, &iaxs[callno1]->addr);
3103 iax_ie_append_short(&ied0, IAX_IE_CALLNO, iaxs[callno1]->peercallno);
3104 iax_ie_append_int(&ied0, IAX_IE_TRANSFERID, transferid);
3106 memset(&ied1, 0, sizeof(ied1));
3107 iax_ie_append_addr(&ied1, IAX_IE_APPARENT_ADDR, &iaxs[callno0]->addr);
3108 iax_ie_append_short(&ied1, IAX_IE_CALLNO, iaxs[callno0]->peercallno);
3109 iax_ie_append_int(&ied1, IAX_IE_TRANSFERID, transferid);
3111 res = send_command(iaxs[callno0], AST_FRAME_IAX, IAX_COMMAND_TXREQ, 0, ied0.buf, ied0.pos, -1);
3114 res = send_command(iaxs[callno1], AST_FRAME_IAX, IAX_COMMAND_TXREQ, 0, ied1.buf, ied1.pos, -1);
3117 iaxs[callno0]->transferring = mediaonly ? TRANSFER_MBEGIN : TRANSFER_BEGIN;
3118 iaxs[callno1]->transferring = mediaonly ? TRANSFER_MBEGIN : TRANSFER_BEGIN;
3122 static void lock_both(unsigned short callno0, unsigned short callno1)
3124 ast_mutex_lock(&iaxsl[callno0]);
3125 while (ast_mutex_trylock(&iaxsl[callno1])) {
3126 ast_mutex_unlock(&iaxsl[callno0]);
3128 ast_mutex_lock(&iaxsl[callno0]);
3132 static void unlock_both(unsigned short callno0, unsigned short callno1)
3134 ast_mutex_unlock(&iaxsl[callno1]);
3135 ast_mutex_unlock(&iaxsl[callno0]);
3138 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)
3140 struct ast_channel *cs[3];
3141 struct ast_channel *who, *other;
3144 int transferstarted=0;
3145 struct ast_frame *f;
3146 unsigned short callno0 = PTR_TO_CALLNO(c0->tech_pvt);
3147 unsigned short callno1 = PTR_TO_CALLNO(c1->tech_pvt);
3148 struct timeval waittimer = {0, 0}, tv;
3150 lock_both(callno0, callno1);
3151 /* Put them in native bridge mode */
3152 if (!flags & (AST_BRIDGE_DTMF_CHANNEL_0 | AST_BRIDGE_DTMF_CHANNEL_1)) {
3153 iaxs[callno0]->bridgecallno = callno1;
3154 iaxs[callno1]->bridgecallno = callno0;
3156 unlock_both(callno0, callno1);
3158 /* If not, try to bridge until we can execute a transfer, if we can */
3161 for (/* ever */;;) {
3162 /* Check in case we got masqueraded into */
3163 if ((c0->tech != &iax2_tech) || (c1->tech != &iax2_tech)) {
3164 if (option_verbose > 2)
3165 ast_verbose(VERBOSE_PREFIX_3 "Can't masquerade, we're different...\n");
3166 /* Remove from native mode */
3167 if (c0->tech == &iax2_tech) {
3168 ast_mutex_lock(&iaxsl[callno0]);
3169 iaxs[callno0]->bridgecallno = 0;
3170 ast_mutex_unlock(&iaxsl[callno0]);
3172 if (c1->tech == &iax2_tech) {
3173 ast_mutex_lock(&iaxsl[callno1]);
3174 iaxs[callno1]->bridgecallno = 0;
3175 ast_mutex_unlock(&iaxsl[callno1]);
3177 return AST_BRIDGE_FAILED_NOWARN;
3179 if (c0->nativeformats != c1->nativeformats) {
3180 if (option_verbose > 2) {
3183 ast_getformatname_multiple(buf0, sizeof(buf0) -1, c0->nativeformats);
3184 ast_getformatname_multiple(buf1, sizeof(buf1) -1, c1->nativeformats);
3185 ast_verbose(VERBOSE_PREFIX_3 "Operating with different codecs %d[%s] %d[%s] , can't native bridge...\n", c0->nativeformats, buf0, c1->nativeformats, buf1);
3187 /* Remove from native mode */
3188 lock_both(callno0, callno1);
3189 iaxs[callno0]->bridgecallno = 0;
3190 iaxs[callno1]->bridgecallno = 0;
3191 unlock_both(callno0, callno1);