2 * Asterisk -- A telephony toolkit for Linux.
4 * Implementation of Inter-Asterisk eXchange
6 * Copyright (C) 1999, Mark Spencer
8 * Mark Spencer <markster@linux-support.net>
10 * This program is free software, distributed under the terms of
11 * the GNU General Public License
14 #include <asterisk/lock.h>
15 #include <asterisk/frame.h>
16 #include <asterisk/channel.h>
17 #include <asterisk/channel_pvt.h>
18 #include <asterisk/logger.h>
19 #include <asterisk/module.h>
20 #include <asterisk/pbx.h>
21 #include <asterisk/sched.h>
22 #include <asterisk/io.h>
23 #include <asterisk/config.h>
24 #include <asterisk/options.h>
25 #include <asterisk/cli.h>
26 #include <asterisk/translate.h>
27 #include <asterisk/md5.h>
28 #include <asterisk/cdr.h>
29 #include <asterisk/crypto.h>
30 #include <asterisk/acl.h>
31 #include <asterisk/manager.h>
32 #include <arpa/inet.h>
33 #include <sys/socket.h>
34 #include <netinet/in.h>
35 #include <netinet/in_systm.h>
36 #include <netinet/ip.h>
38 #include <sys/signal.h>
48 #include <mysql/mysql.h>
54 #define IPTOS_MINCOST 0x02
58 * Uncomment to try experimental IAX bridge optimization,
59 * designed to reduce latency when IAX calls cannot
63 #define BRIDGE_OPTIMIZATION
66 #define DEFAULT_RETRY_TIME 1000
67 #define MEMORY_SIZE 100
68 #define DEFAULT_DROP 3
72 /* Sample over last 100 units to determine historic jitter */
76 static ast_mutex_t mysqllock = AST_MUTEX_INITIALIZER;
78 static char mydbuser[80];
79 static char mydbpass[80];
80 static char mydbhost[80];
81 static char mydbname[80];
84 static char *desc = "Inter Asterisk eXchange";
85 static char *tdesc = "Inter Asterisk eXchange Drver";
86 static char *type = "IAX";
88 static char context[80] = "default";
90 static int max_retries = 4;
91 static int ping_time = 20;
92 static int lagrq_time = 10;
93 static int nextcallno = 0;
94 static int maxjitterbuffer=3000;
96 static int iaxdefaultdpcache=10 * 60; /* Cache dialplan entries for 10 minutes by default */
98 static int iaxdefaulttimeout = 5; /* Default to wait no more than 5 seconds for a reply to come back */
100 static int netsocket = -1;
104 static int expirey = AST_DEFAULT_REG_EXPIRE;
107 static ast_mutex_t usecnt_lock = AST_MUTEX_INITIALIZER;
109 int (*iax_regfunk)(char *username, int onoff) = NULL;
112 #define IAX_CAPABILITY_FULLBANDWIDTH 0xFFFF
114 #define IAX_CAPABILITY_MEDBANDWIDTH (IAX_CAPABILITY_FULLBANDWIDTH & \
115 ~AST_FORMAT_SLINEAR & \
119 #define IAX_CAPABILITY_LOWBANDWIDTH (IAX_CAPABILITY_MEDBANDWIDTH & \
120 ~AST_FORMAT_ADPCM & \
123 #define IAX_CAPABILITY_LOWFREE (IAX_CAPABILITY_LOWBANDWIDTH & \
127 #define DEFAULT_MAXMS 2000 /* Must be faster than 2 seconds by default */
128 #define DEFAULT_FREQ_OK 60 * 1000 /* How often to check for the host to be up */
129 #define DEFAULT_FREQ_NOTOK 10 * 1000 /* How often to check, if the host is down... */
131 static struct io_context *io;
132 static struct sched_context *sched;
134 static int iax_capability = IAX_CAPABILITY_FULLBANDWIDTH;
136 static int iax_dropcount = DEFAULT_DROP;
138 static int use_jitterbuffer = 1;
140 static int iaxdebug = 0;
142 static char accountcode[20];
143 static int amaflags = 0;
145 static pthread_t netthreadid;
147 #define IAX_STATE_STARTED (1 << 0)
148 #define IAX_STATE_AUTHENTICATED (1 << 1)
149 #define IAX_STATE_TBD (1 << 2)
152 char context[AST_MAX_EXTENSION];
153 struct iax_context *next;
160 char accountcode[20];
161 char inkeys[80]; /* Key(s) this user can use to authenticate to us */
165 char callerid[AST_MAX_EXTENSION];
167 struct iax_context *contexts;
168 struct iax_user *next;
175 char outkey[80]; /* What key we use to talk to this peer */
176 char context[AST_MAX_EXTENSION]; /* Default context (for transfer really) */
177 struct sockaddr_in addr;
181 /* Dynamic Registration fields */
182 int dynamic; /* If this is a dynamic peer */
183 struct sockaddr_in defaddr; /* Default address if there is one */
185 char inkeys[80]; /* Key(s) this peer can use to authenticate to us */
188 /* Suggested caller id if registering */
189 char callerid[AST_MAX_EXTENSION];
190 /* Whether or not to send ANI */
192 int expire; /* Schedule entry for expirey */
193 int expirey; /* How soon to expire */
194 int capability; /* Capability */
195 int delme; /* I need to be deleted */
198 int callno; /* Call number of POKE request */
199 int pokeexpire; /* When to expire poke */
200 int lastms; /* How long last response took (in ms), or -1 for no response */
201 int maxms; /* Max ms we will accept for the host to be up, 0 to not monitor */
204 struct iax_peer *next;
207 #define REG_STATE_UNREGISTERED 0
208 #define REG_STATE_REGSENT 1
209 #define REG_STATE_AUTHSENT 2
210 #define REG_STATE_REGISTERED 3
211 #define REG_STATE_REJECTED 4
212 #define REG_STATE_TIMEOUT 5
213 #define REG_STATE_NOAUTH 6
215 #define TRANSFER_NONE 0
216 #define TRANSFER_BEGIN 1
217 #define TRANSFER_READY 2
218 #define TRANSFER_RELEASED 3
219 #define TRANSFER_PASSTHROUGH 4
221 struct iax_registry {
222 struct sockaddr_in addr; /* Who we connect to for registration purposes */
224 char secret[80]; /* Password or key name in []'s */
226 int expire; /* Sched ID of expiration */
227 int refresh; /* How often to refresh */
229 int callno; /* Associated call number if applicable */
230 struct sockaddr_in us; /* Who the server thinks we are */
231 struct iax_registry *next;
234 static struct iax_registry *registrations;
236 /* Don't retry more frequently than every 10 ms, or less frequently than every 5 seconds */
237 #define MIN_RETRY_TIME 10
238 #define MAX_RETRY_TIME 10000
239 #define MAX_JITTER_BUFFER 50
241 /* If we have more than this much excess real jitter buffer, srhink it. */
242 static int max_jitter_buffer = MAX_JITTER_BUFFER;
244 struct chan_iax_pvt {
245 /* Pipes for communication. pipe[1] belongs to the
246 network thread (write), and pipe[0] belongs to the individual
248 /* Whether or not we Quelch audio */
250 /* Last received voice format */
252 /* Last sent voice format */
254 /* What we are capable of sending */
256 /* Last received timestamp */
258 /* Last sent timestamp - never send the same timestamp twice in a single call */
259 unsigned int lastsent;
261 unsigned int pingtime;
262 /* Max time for initial response */
265 struct sockaddr_in addr;
266 /* Our call number */
270 /* Peer selected format */
272 /* Peer capability */
274 /* timeval that we base our transmission on */
275 struct timeval offset;
276 /* timeval that we base our delivery on */
277 struct timeval rxcore;
278 /* Historical delivery time */
279 int history[MEMORY_SIZE];
280 /* Current base jitterbuffer */
282 /* Current jitter measure */
284 /* Historic jitter value */
288 /* Error, as discovered by the manager */
290 /* Owner if we have one */
291 struct ast_channel *owner;
292 /* What's our state? */
294 /* Expirey (optional) */
296 /* Next outgoing sequence number */
297 unsigned short oseqno;
298 /* Next incoming sequence number */
299 unsigned short iseqno;
302 /* Default Context */
304 /* Caller ID if available */
306 /* Hidden Caller ID (i.e. ANI) if appropriate */
308 /* Whether or not ani should be transmitted in addition to Caller*ID */
312 /* Requested Extension */
313 char exten[AST_MAX_EXTENSION];
314 /* Expected Username */
316 /* Expected Secret */
318 /* permitted authentication methods */
322 /* Public keys permitted keys for incoming authentication */
324 /* Private key for outgoing authentication */
326 /* Preferred language */
328 /* Associated registry */
329 struct iax_registry *reg;
330 /* Associated peer for poking */
331 struct iax_peer *peerpoke;
333 /* Transferring status */
335 /* Already disconnected */
337 /* Who we are IAX transfering to */
338 struct sockaddr_in transfer;
339 /* What's the new call number for the transfer */
342 /* Status of knowledge of peer ADSI capability */
345 /* Who we are bridged to */
347 int pingid; /* Transmit PING request */
348 int lagid; /* Retransmit lag request */
349 int autoid; /* Auto hangup for Dialplan requestor */
350 int initid; /* Initial peer auto-congest ID (based on qualified peers) */
351 char dproot[AST_MAX_EXTENSION];
352 char accountcode[20];
354 struct iax_dpcache *dpentries;
357 #define DIRECTION_INGRESS 1
358 #define DIRECTION_OUTGRESS 2
360 struct ast_iax_frame {
361 /* Actual, isolated frame */
363 /* /Our/ call number */
365 /* Start of raw frame (outgoing only) */
367 /* Length of frame (outgoing only) */
369 /* How many retries so far? */
371 /* Outgoing relative timestamp (ms) */
373 /* How long to wait before retrying */
375 /* Are we received out of order? */
377 /* Have we been sent at all yet? */
379 /* Packet sequence number */
381 /* Non-zero if should be sent to transfer peer */
383 /* Non-zero if this is the final message */
385 /* Ingress or outgres */
387 /* Retransmission ID */
392 struct ast_iax_frame *next;
393 struct ast_iax_frame *prev;
396 static struct ast_iax_queue {
397 struct ast_iax_frame *head;
398 struct ast_iax_frame *tail;
403 static struct ast_user_list {
404 struct iax_user *users;
408 static struct ast_peer_list {
409 struct iax_peer *peers;
413 /* Extension exists */
414 #define CACHE_FLAG_EXISTS (1 << 0)
415 /* Extension is non-existant */
416 #define CACHE_FLAG_NONEXISTANT (1 << 1)
417 /* Extension can exist */
418 #define CACHE_FLAG_CANEXIST (1 << 2)
419 /* Waiting to hear back response */
420 #define CACHE_FLAG_PENDING (1 << 3)
422 #define CACHE_FLAG_TIMEOUT (1 << 4)
423 /* Request transmitted */
424 #define CACHE_FLAG_TRANSMITTED (1 << 5)
426 #define CACHE_FLAG_UNKNOWN (1 << 6)
428 #define CACHE_FLAG_MATCHMORE (1 << 7)
430 static struct iax_dpcache {
431 char peercontext[AST_MAX_EXTENSION];
432 char exten[AST_MAX_EXTENSION];
434 struct timeval expirey;
438 struct iax_dpcache *next;
439 struct iax_dpcache *peer; /* For linking in peers */
442 static ast_mutex_t dpcache_lock;
445 static void showframe(struct ast_iax_frame *f, struct ast_iax_full_hdr *fhi, int rx, struct sockaddr_in *sin)
499 struct ast_iax_full_hdr *fh;
507 snprintf(retries, sizeof(retries), "%03d", f->retries);
509 strcpy(retries, "N/A");
512 if (!(ntohs(fh->callno) & AST_FLAG_FULL)) {
513 /* Don't mess with mini-frames */
516 if (fh->type > sizeof(frames)/sizeof(char *)) {
517 snprintf(class2, sizeof(class2), "(%d?)", fh->type);
520 class = frames[(int)fh->type];
522 if (fh->type == AST_FRAME_DTMF) {
523 sprintf(subclass2, "%c", fh->csub);
524 subclass = subclass2;
525 } else if (fh->type == AST_FRAME_IAX) {
526 if (fh->csub >= sizeof(iaxs)/sizeof(iaxs[0])) {
527 snprintf(subclass2, sizeof(subclass2), "(%d?)", fh->csub);
528 subclass = subclass2;
530 subclass = iaxs[(int)fh->csub];
532 } else if (fh->type == AST_FRAME_CONTROL) {
533 if (fh->csub > sizeof(cmds)/sizeof(char *)) {
534 snprintf(subclass2, sizeof(subclass2), "(%d?)", fh->csub);
535 subclass = subclass2;
537 subclass = cmds[(int)fh->csub];
540 snprintf(subclass2, sizeof(subclass2), "%d", fh->csub);
541 subclass = subclass2;
544 "%s-Frame Retry[%s] -- Seqno: %2.2d Type: %s Subclass: %s\n",
546 retries, ntohs(fh->seqno), class, subclass);
548 " Timestamp: %05ldms Callno: %5.5d DCall: %5.5d [%s:%d]\n",
550 (short)(ntohs(fh->callno) & ~AST_FLAG_FULL), (short) ntohs(fh->dcallno),
551 inet_ntoa(sin->sin_addr), ntohs(sin->sin_port));
555 /* XXX We probably should use a mutex when working with this XXX */
556 static struct chan_iax_pvt *iaxs[AST_IAX_MAX_CALLS];
557 static ast_mutex_t iaxsl[AST_IAX_MAX_CALLS];
559 static int send_command(struct chan_iax_pvt *, char, int, unsigned int, char *, int, int);
560 static int send_command_immediate(struct chan_iax_pvt *, char, int, unsigned int, char *, int, int);
561 static int send_command_final(struct chan_iax_pvt *, char, int, unsigned int, char *, int, int);
562 static int send_command_transfer(struct chan_iax_pvt *, char, int, unsigned int, char *, int);
564 static unsigned int calc_timestamp(struct chan_iax_pvt *p, unsigned int ts);
566 static int send_ping(void *data)
568 int callno = (long)data;
569 /* Ping only if it's real, not if it's bridged */
571 #ifdef BRIDGE_OPTIMIZATION
572 if (iaxs[callno]->bridgecallno < 0)
574 send_command(iaxs[callno], AST_FRAME_IAX, AST_IAX_COMMAND_PING, 0, NULL, 0, -1);
580 static int send_lagrq(void *data)
582 int callno = (long)data;
583 /* Ping only if it's real not if it's bridged */
585 #ifdef BRIDGE_OPTIMIZATION
586 if (iaxs[callno]->bridgecallno < 0)
588 send_command(iaxs[callno], AST_FRAME_IAX, AST_IAX_COMMAND_LAGRQ, 0, NULL, 0, -1);
594 static unsigned char compress_subclass(int subclass)
598 /* If it's 128 or smaller, just return it */
599 if (subclass < AST_FLAG_SC_LOG)
601 /* Otherwise find its power */
602 for (x = 0; x < AST_MAX_SHIFT; x++) {
603 if (subclass & (1 << x)) {
605 ast_log(LOG_WARNING, "Can't compress subclass %d\n", subclass);
611 return power | AST_FLAG_SC_LOG;
614 static int uncompress_subclass(unsigned char csub)
616 /* If the SC_LOG flag is set, return 2^csub otherwise csub */
617 if (csub & AST_FLAG_SC_LOG) {
618 /* special case for 'compressed' -1 */
622 return 1 << (csub & ~AST_FLAG_SC_LOG & AST_MAX_SHIFT);
628 static struct chan_iax_pvt *new_iax(void)
630 struct chan_iax_pvt *tmp;
631 tmp = malloc(sizeof(struct chan_iax_pvt));
633 memset(tmp, 0, sizeof(struct chan_iax_pvt));
635 tmp->peercallno = -1;
636 tmp->transfercallno = -1;
637 tmp->bridgecallno = -1;
642 /* strncpy(tmp->context, context, sizeof(tmp->context)-1); */
643 strncpy(tmp->exten, "s", sizeof(tmp->exten)-1);
648 static int get_samples(struct ast_frame *f)
651 switch(f->subclass) {
652 case AST_FORMAT_G723_1:
653 samples = 240 /* XXX Not necessarily true XXX */;
656 samples = 160 * (f->datalen / 33);
658 case AST_FORMAT_ILBC:
659 samples = 240 * (f->datalen / 50);
661 case AST_FORMAT_G729A:
662 samples = 160 * (f->datalen / 20);
664 case AST_FORMAT_SLINEAR:
665 samples = f->datalen / 2;
667 case AST_FORMAT_LPC10:
669 samples += (((char *)(f->data))[7] & 0x1) * 8;
671 case AST_FORMAT_ULAW:
672 samples = f->datalen;
674 case AST_FORMAT_ALAW:
675 samples = f->datalen;
677 case AST_FORMAT_ADPCM:
678 samples = f->datalen *2;
680 case AST_FORMAT_SPEEX:
681 samples = (f->datalen/39)*160;
684 ast_log(LOG_WARNING, "Don't know how to calculate samples on %d packets\n", f->subclass);
689 static int frames = 0;
690 static int iframes = 0;
691 static int oframes = 0;
693 static struct ast_iax_frame *ast_iax_frame_new(int direction)
695 struct ast_iax_frame *fr;
696 fr = malloc(sizeof(struct ast_iax_frame));
698 fr->direction = direction;
701 if (fr->direction == DIRECTION_INGRESS)
709 static void ast_iax_frame_free(struct ast_iax_frame *fr)
711 if (fr->retrans > -1)
712 ast_sched_del(sched, fr->retrans);
713 if (fr->direction == DIRECTION_INGRESS)
715 else if (fr->direction == DIRECTION_OUTGRESS)
718 ast_log(LOG_WARNING, "Attempt to double free frame detected\n");
727 static struct ast_iax_frame *iaxfrdup2(struct ast_iax_frame *fr, int ch)
729 /* Malloc() a copy of a frame */
730 struct ast_iax_frame *new = ast_iax_frame_new(DIRECTION_INGRESS);
732 memcpy(new, fr, sizeof(struct ast_iax_frame));
733 new->f = ast_frdup(fr->f);
734 /* Copy full header */
736 memcpy(new->f->data - sizeof(struct ast_iax_full_hdr),
737 fr->f->data - sizeof(struct ast_iax_full_hdr),
738 sizeof(struct ast_iax_full_hdr));
739 /* Grab new data pointer */
740 new->data = new->f->data - (fr->f->data - fr->data);
745 new->direction = DIRECTION_INGRESS;
751 #define NEW_PREVENT 0
755 static int match(struct sockaddr_in *sin, short callno, short dcallno, struct chan_iax_pvt *cur)
757 if ((cur->addr.sin_addr.s_addr == sin->sin_addr.s_addr) &&
758 (cur->addr.sin_port == sin->sin_port)) {
759 /* This is the main host */
760 if ((cur->peercallno == callno) ||
761 ((dcallno == cur->callno) && (cur->peercallno) == -1)) {
762 /* That's us. Be sure we keep track of the peer call number */
766 if ((cur->transfer.sin_addr.s_addr == sin->sin_addr.s_addr) &&
767 (cur->transfer.sin_port == sin->sin_port) && (cur->transferring)) {
768 /* We're transferring */
769 if (dcallno == cur->callno)
775 static int find_callno(short callno, short dcallno ,struct sockaddr_in *sin, int new)
780 if (new <= NEW_ALLOW) {
781 /* Look for an existing connection first */
782 for (x=0;(res < 0) && (x<AST_IAX_MAX_CALLS);x++) {
783 ast_mutex_lock(&iaxsl[x]);
785 /* Look for an exact match */
786 if (match(sin, callno, dcallno, iaxs[x])) {
790 ast_mutex_unlock(&iaxsl[x]);
793 if ((res < 0) && (new >= NEW_ALLOW)) {
794 /* Create a new one */
796 for (x = (nextcallno + 1) % AST_IAX_MAX_CALLS; iaxs[x] && (x != start); x = (x + 1) % AST_IAX_MAX_CALLS)
798 ast_log(LOG_WARNING, "Unable to accept more calls\n");
801 ast_mutex_lock(&iaxsl[x]);
803 ast_mutex_unlock(&iaxsl[x]);
806 ast_log(LOG_DEBUG, "Creating new call structure %d\n", x);
807 iaxs[x]->addr.sin_port = sin->sin_port;
808 iaxs[x]->addr.sin_family = sin->sin_family;
809 iaxs[x]->addr.sin_addr.s_addr = sin->sin_addr.s_addr;
810 iaxs[x]->peercallno = callno;
812 iaxs[x]->pingtime = DEFAULT_RETRY_TIME;
813 iaxs[x]->expirey = expirey;
814 iaxs[x]->pingid = ast_sched_add(sched, ping_time * 1000, send_ping, (void *)x);
815 iaxs[x]->lagid = ast_sched_add(sched, lagrq_time * 1000, send_lagrq, (void *)x);
816 iaxs[x]->amaflags = amaflags;
817 strncpy(iaxs[x]->accountcode, accountcode, sizeof(iaxs[x]->accountcode)-1);
819 ast_log(LOG_WARNING, "Out of resources\n");
828 static int iax_queue_frame(int callno, struct ast_frame *f)
831 /* Assumes lock for callno is already held... */
834 if (!ast_mutex_trylock(&iaxsl[callno])) {
835 ast_log(LOG_WARNING, "Lock is not held on pass %d of iax_queue_frame\n", pass);
838 if (iaxs[callno] && iaxs[callno]->owner) {
839 if (ast_mutex_trylock(&iaxs[callno]->owner->lock)) {
840 /* Avoid deadlock by pausing and trying again */
841 ast_mutex_unlock(&iaxsl[callno]);
843 ast_mutex_lock(&iaxsl[callno]);
845 ast_queue_frame(iaxs[callno]->owner, f, 0);
846 ast_mutex_unlock(&iaxs[callno]->owner->lock);
855 static int iax_send(struct chan_iax_pvt *pvt, struct ast_frame *f, unsigned int ts, int seqno, int now, int transfer, int final);
857 static int __do_deliver(void *data)
859 /* Just deliver the packet by using queueing. This is called by
860 the IAX thread with the iaxsl lock held. */
861 struct ast_iax_frame *fr = data;
864 if (iaxs[fr->callno] && !iaxs[fr->callno]->alreadygone) {
865 if (fr->f->frametype == AST_FRAME_IAX) {
866 /* We have to treat some of these packets specially because
867 they're LAG measurement packets */
868 if (fr->f->subclass == AST_IAX_COMMAND_LAGRQ) {
869 /* If we got a queued request, build a reply and send it */
870 fr->f->subclass = AST_IAX_COMMAND_LAGRP;
871 iax_send(iaxs[fr->callno], fr->f, fr->ts, -1, 0, 0, 0);
872 } else if (fr->f->subclass == AST_IAX_COMMAND_LAGRP) {
873 /* This is a reply we've been given, actually measure the difference */
874 ts = calc_timestamp(iaxs[fr->callno], 0);
875 iaxs[fr->callno]->lag = ts - fr->ts;
878 iax_queue_frame(fr->callno, fr->f);
881 /* Free the packet */
883 /* And our iax frame */
884 ast_iax_frame_free(fr);
885 /* And don't run again */
889 static int do_deliver(void *data)
891 /* Locking version of __do_deliver */
892 struct ast_iax_frame *fr = data;
893 int callno = fr->callno;
895 ast_mutex_lock(&iaxsl[callno]);
896 res = __do_deliver(data);
897 ast_mutex_unlock(&iaxsl[callno]);
901 static int handle_error(void)
903 /* XXX Ideally we should figure out why an error occured and then abort those
904 rather than continuing to try. Unfortunately, the published interface does
905 not seem to work XXX */
907 struct sockaddr_in *sin;
910 struct sock_extended_err e;
915 m.msg_controllen = sizeof(e);
917 res = recvmsg(netsocket, &m, MSG_ERRQUEUE);
919 ast_log(LOG_WARNING, "Error detected, but unable to read error: %s\n", strerror(errno));
921 if (m.msg_controllen) {
922 sin = (struct sockaddr_in *)SO_EE_OFFENDER(&e);
924 ast_log(LOG_WARNING, "Receive error from %s\n", inet_ntoa(sin->sin_addr));
926 ast_log(LOG_WARNING, "No address detected??\n");
928 ast_log(LOG_WARNING, "Local error: %s\n", strerror(e.ee_errno));
935 static int send_packet(struct ast_iax_frame *f)
938 /* Called with iaxsl held */
940 ast_log(LOG_DEBUG, "Sending %d on %d/%d to %s:%d\n", f->ts, f->callno, iaxs[f->callno]->peercallno, inet_ntoa(iaxs[f->callno]->addr.sin_addr), ntohs(iaxs[f->callno]->addr.sin_port));
941 /* Don't send if there was an error, but return error instead */
943 ast_log(LOG_WARNING, "Call number = %d\n", f->callno);
946 if (!iaxs[f->callno])
948 if (iaxs[f->callno]->error)
953 showframe(f, NULL, 0, &iaxs[f->callno]->transfer);
955 res = sendto(netsocket, f->data, f->datalen, 0,(struct sockaddr *)&iaxs[f->callno]->transfer,
956 sizeof(iaxs[f->callno]->transfer));
960 showframe(f, NULL, 0, &iaxs[f->callno]->addr);
962 res = sendto(netsocket, f->data, f->datalen, 0,(struct sockaddr *)&iaxs[f->callno]->addr,
963 sizeof(iaxs[f->callno]->addr));
967 ast_log(LOG_DEBUG, "Received error: %s\n", strerror(errno));
975 static int iax_predestroy(int callno)
977 struct ast_channel *c;
978 struct chan_iax_pvt *pvt;
979 ast_mutex_lock(&iaxsl[callno]);
982 ast_mutex_unlock(&iaxsl[callno]);
985 if (!pvt->alreadygone) {
986 /* No more pings or lagrq's */
987 if (pvt->pingid > -1)
988 ast_sched_del(sched, pvt->pingid);
990 ast_sched_del(sched, pvt->lagid);
991 if (pvt->autoid > -1)
992 ast_sched_del(sched, pvt->autoid);
993 if (pvt->initid > -1)
994 ast_sched_del(sched, pvt->initid);
999 pvt->alreadygone = 1;
1003 c->_softhangup |= AST_SOFTHANGUP_DEV;
1006 ast_mutex_lock(&usecnt_lock);
1009 ast_log(LOG_WARNING, "Usecnt < 0???\n");
1010 ast_mutex_unlock(&usecnt_lock);
1011 ast_update_use_count();
1013 ast_mutex_unlock(&iaxsl[callno]);
1017 static int iax_predestroy_nolock(int callno)
1020 ast_mutex_unlock(&iaxsl[callno]);
1021 res = iax_predestroy(callno);
1022 ast_mutex_lock(&iaxsl[callno]);
1026 static void iax_destroy(int callno)
1028 struct chan_iax_pvt *pvt;
1029 struct ast_iax_frame *cur;
1030 struct ast_channel *owner;
1033 ast_mutex_lock(&iaxsl[callno]);
1035 iaxs[callno] = NULL;
1042 if (ast_mutex_trylock(&owner->lock)) {
1043 ast_log(LOG_NOTICE, "Avoiding IAX destroy deadlock\n");
1044 ast_mutex_unlock(&iaxsl[callno]);
1051 /* No more pings or lagrq's */
1052 if (pvt->pingid > -1)
1053 ast_sched_del(sched, pvt->pingid);
1054 if (pvt->lagid > -1)
1055 ast_sched_del(sched, pvt->lagid);
1056 if (pvt->autoid > -1)
1057 ast_sched_del(sched, pvt->autoid);
1058 if (pvt->initid > -1)
1059 ast_sched_del(sched, pvt->initid);
1066 pvt->alreadygone = 1;
1069 /* If there's an owner, prod it to give up */
1070 owner->pvt->pvt = NULL;
1071 owner->_softhangup |= AST_SOFTHANGUP_DEV;
1072 ast_queue_hangup(owner, 0);
1075 for (cur = iaxq.head; cur ; cur = cur->next) {
1076 /* Cancel any pending transmissions */
1077 if (cur->callno == pvt->callno)
1081 pvt->reg->callno = -1;
1086 ast_mutex_unlock(&owner->lock);
1088 ast_mutex_unlock(&iaxsl[callno]);
1090 static void iax_destroy_nolock(int callno)
1092 /* Actually it's easier to unlock, kill it, and relock */
1093 ast_mutex_unlock(&iaxsl[callno]);
1094 iax_destroy(callno);
1095 ast_mutex_lock(&iaxsl[callno]);
1100 static int attempt_transmit(void *data)
1102 /* Attempt to transmit the frame to the remote peer...
1103 Called without iaxsl held. */
1104 struct ast_iax_frame *f = data;
1106 int callno = f->callno;
1107 /* Make sure this call is still active */
1109 ast_mutex_lock(&iaxsl[callno]);
1110 if ((f->callno > -1) && iaxs[f->callno]) {
1111 if ((f->retries < 0) /* Already ACK'd */ ||
1112 (f->retries >= max_retries) /* Too many attempts */) {
1113 /* Record an error if we've transmitted too many times */
1114 if (f->retries >= max_retries) {
1116 /* Transfer timeout */
1117 send_command(iaxs[f->callno], AST_FRAME_IAX, AST_IAX_COMMAND_TXREJ, 0, NULL, 0, -1);
1118 } else if (f->final) {
1120 iax_destroy_nolock(f->callno);
1122 if (iaxs[f->callno]->owner)
1123 ast_log(LOG_WARNING, "Max retries exceeded to host %s on %s (type = %d, subclass = %d, ts=%d, seqno=%d)\n", inet_ntoa(iaxs[f->callno]->addr.sin_addr),iaxs[f->callno]->owner->name , f->f->frametype, f->f->subclass, f->ts, f->seqno);
1124 iaxs[f->callno]->error = ETIMEDOUT;
1125 if (iaxs[f->callno]->owner) {
1126 struct ast_frame fr = { 0, };
1128 fr.frametype = AST_FRAME_CONTROL;
1129 fr.subclass = AST_CONTROL_HANGUP;
1130 iax_queue_frame(f->callno, &fr);
1132 if (iaxs[f->callno]->reg) {
1133 memset(&iaxs[f->callno]->reg->us, 0, sizeof(iaxs[f->callno]->reg->us));
1134 iaxs[f->callno]->reg->regstate = REG_STATE_TIMEOUT;
1135 iaxs[f->callno]->reg->refresh = AST_DEFAULT_REG_EXPIRE;
1137 iax_destroy_nolock(f->callno);
1144 /* Attempt transmission */
1147 /* Try again later after 10 times as long */
1149 if (f->retrytime > MAX_RETRY_TIME)
1150 f->retrytime = MAX_RETRY_TIME;
1151 /* Transfer messages max out at one second */
1152 if (f->transfer && (f->retrytime > 1000))
1153 f->retrytime = 1000;
1154 f->retrans = ast_sched_add(sched, f->retrytime, attempt_transmit, f);
1157 /* Make sure it gets freed */
1162 ast_mutex_unlock(&iaxsl[callno]);
1163 /* Do not try again */
1165 /* Don't attempt delivery, just remove it from the queue */
1166 ast_mutex_lock(&iaxq.lock);
1168 f->prev->next = f->next;
1170 iaxq.head = f->next;
1172 f->next->prev = f->prev;
1174 iaxq.tail = f->prev;
1176 ast_mutex_unlock(&iaxq.lock);
1177 /* Free the frame */
1180 ast_iax_frame_free(f);
1185 static int iax_set_jitter(int fd, int argc, char *argv[])
1187 if ((argc != 4) && (argc != 5))
1188 return RESULT_SHOWUSAGE;
1190 max_jitter_buffer = atoi(argv[3]);
1191 if (max_jitter_buffer < 0)
1192 max_jitter_buffer = 0;
1195 if ((atoi(argv[3]) >= 0) && (atoi(argv[3]) < AST_IAX_MAX_CALLS)) {
1196 if (iaxs[atoi(argv[3])]) {
1197 iaxs[atoi(argv[3])]->jitterbuffer = atoi(argv[4]);
1198 if (iaxs[atoi(argv[3])]->jitterbuffer < 0)
1199 iaxs[atoi(argv[3])]->jitterbuffer = 0;
1201 ast_cli(fd, "No such call '%d'\n", atoi(argv[3]));
1203 ast_cli(fd, "%d is not a valid call number\n", atoi(argv[3]));
1206 return RESULT_SUCCESS;
1209 static char jitter_usage[] =
1210 "Usage: iax set jitter [callid] <value>\n"
1211 " If used with a callid, it sets the jitter buffer to the given static\n"
1212 "value (until its next calculation). If used without a callid, the value is used\n"
1213 "to establish the maximum excess jitter buffer that is permitted before the jitter\n"
1214 "buffer size is reduced.";
1216 static int iax_show_stats(int fd, int argc, char *argv[])
1218 struct ast_iax_frame *cur;
1219 int cnt = 0, dead=0, final=0;
1221 return RESULT_SHOWUSAGE;
1222 for (cur = iaxq.head; cur ; cur = cur->next) {
1223 if (cur->retries < 0)
1229 ast_cli(fd, " IAX Statistics\n");
1230 ast_cli(fd, "---------------------\n");
1231 ast_cli(fd, "Outstanding frames: %d (%d ingress, %d outgress)\n", frames, iframes, oframes);
1232 ast_cli(fd, "Packets in transmit queue: %d dead, %d final, %d total\n", dead, final, cnt);
1233 return RESULT_SUCCESS;
1236 static int iax_show_cache(int fd, int argc, char *argv[])
1238 struct iax_dpcache *dp;
1239 char tmp[1024], *pc;
1243 gettimeofday(&tv, NULL);
1244 ast_mutex_lock(&dpcache_lock);
1246 ast_cli(fd, "%-20.20s %-12.12s %-9.9s %-8.8s %s\n", "Peer/Context", "Exten", "Exp.", "Wait.", "Flags");
1248 s = dp->expirey.tv_sec - tv.tv_sec;
1250 if (dp->flags & CACHE_FLAG_EXISTS)
1251 strcat(tmp, "EXISTS|");
1252 if (dp->flags & CACHE_FLAG_NONEXISTANT)
1253 strcat(tmp, "NONEXISTANT|");
1254 if (dp->flags & CACHE_FLAG_CANEXIST)
1255 strcat(tmp, "CANEXIST|");
1256 if (dp->flags & CACHE_FLAG_PENDING)
1257 strcat(tmp, "PENDING|");
1258 if (dp->flags & CACHE_FLAG_TIMEOUT)
1259 strcat(tmp, "TIMEOUT|");
1260 if (dp->flags & CACHE_FLAG_TRANSMITTED)
1261 strcat(tmp, "TRANSMITTED|");
1262 if (dp->flags & CACHE_FLAG_MATCHMORE)
1263 strcat(tmp, "MATCHMORE|");
1264 if (dp->flags & CACHE_FLAG_UNKNOWN)
1265 strcat(tmp, "UNKNOWN|");
1266 /* Trim trailing pipe */
1268 tmp[strlen(tmp) - 1] = '\0';
1270 strcpy(tmp, "(none)");
1272 pc = strchr(dp->peercontext, '@');
1274 pc = dp->peercontext;
1277 for (x=0;x<sizeof(dp->waiters) / sizeof(dp->waiters[0]); x++)
1278 if (dp->waiters[x] > -1)
1281 ast_cli(fd, "%-20.20s %-12.12s %-9d %-8d %s\n", pc, dp->exten, s, y, tmp);
1283 ast_cli(fd, "%-20.20s %-12.12s %-9.9s %-8d %s\n", pc, dp->exten, "(expired)", y, tmp);
1286 ast_mutex_unlock(&dpcache_lock);
1287 return RESULT_SUCCESS;
1290 static char show_stats_usage[] =
1291 "Usage: iax show stats\n"
1292 " Display statistics on IAX channel driver.\n";
1295 static char show_cache_usage[] =
1296 "Usage: iax show cache\n"
1297 " Display currently cached IAX Dialplan results.\n";
1299 static struct ast_cli_entry cli_set_jitter =
1300 { { "iax", "set", "jitter", NULL }, iax_set_jitter, "Sets IAX jitter buffer", jitter_usage };
1302 static struct ast_cli_entry cli_show_stats =
1303 { { "iax", "show", "stats", NULL }, iax_show_stats, "Display IAX statistics", show_stats_usage };
1305 static struct ast_cli_entry cli_show_cache =
1306 { { "iax", "show", "cache", NULL }, iax_show_cache, "Display IAX cached dialplan", show_cache_usage };
1308 static unsigned int calc_rxstamp(struct chan_iax_pvt *p);
1310 #ifdef BRIDGE_OPTIMIZATION
1311 static unsigned int calc_fakestamp(struct chan_iax_pvt *from, struct chan_iax_pvt *to, unsigned int ts);
1313 static int forward_delivery(struct ast_iax_frame *fr)
1315 struct chan_iax_pvt *p1, *p2;
1316 p1 = iaxs[fr->callno];
1317 p2 = iaxs[p1->bridgecallno];
1322 /* Fix relative timestamp */
1323 fr->ts = calc_fakestamp(p1, p2, fr->ts);
1324 /* Now just send it send on the 2nd one
1325 with adjusted timestamp */
1326 return iax_send(p2, fr->f, fr->ts, -1, 0, 0, 0);
1330 static int schedule_delivery(struct ast_iax_frame *fr, int reallydeliver)
1333 int drops[MEMORY_SIZE];
1334 int min, max=0, maxone=0,y,z, match;
1335 /* ms is a measure of the "lateness" of the packet relative to the first
1336 packet we received, which always has a lateness of 1. Called by
1337 IAX thread, with iaxsl lock held. */
1338 ms = calc_rxstamp(iaxs[fr->callno]) - fr->ts;
1341 /* What likely happened here is that our counter has circled but we haven't
1342 gotten the update from the main packet. We'll just pretend that we did, and
1343 update the timestamp appropriately. */
1348 /* We got this packet out of order. Lets add 65536 to it to bring it into our new
1353 /* Rotate our history queue of "lateness". Don't worry about those initial
1354 zeros because the first entry will always be zero */
1355 for (x=0;x<MEMORY_SIZE - 1;x++)
1356 iaxs[fr->callno]->history[x] = iaxs[fr->callno]->history[x+1];
1357 /* Add a history entry for this one */
1358 iaxs[fr->callno]->history[x] = ms;
1360 /* Initialize the minimum to reasonable values. It's too much
1361 work to do the same for the maximum, repeatedly */
1362 min=iaxs[fr->callno]->history[0];
1363 for (z=0;z < iax_dropcount + 1;z++) {
1364 /* Start very optimistic ;-) */
1366 for (x=0;x<MEMORY_SIZE;x++) {
1367 if (max < iaxs[fr->callno]->history[x]) {
1368 /* We have a candidate new maximum value. Make
1369 sure it's not in our drop list */
1371 for (y=0;!match && (y<z);y++)
1372 match |= (drops[y] == x);
1374 /* It's not in our list, use it as the new maximum */
1375 max = iaxs[fr->callno]->history[x];
1381 /* On our first pass, find the minimum too */
1382 if (min > iaxs[fr->callno]->history[x])
1383 min = iaxs[fr->callno]->history[x];
1390 /* Just for reference, keep the "jitter" value, the difference between the
1391 earliest and the latest. */
1392 iaxs[fr->callno]->jitter = max - min;
1394 /* IIR filter for keeping track of historic jitter, but always increase
1395 historic jitter immediately for increase */
1397 if (iaxs[fr->callno]->jitter > iaxs[fr->callno]->historicjitter )
1398 iaxs[fr->callno]->historicjitter = iaxs[fr->callno]->jitter;
1400 iaxs[fr->callno]->historicjitter = GAMMA * (double)iaxs[fr->callno]->jitter + (1-GAMMA) *
1401 iaxs[fr->callno]->historicjitter;
1403 /* If our jitter buffer is too big (by a significant margin), then we slowly
1404 shrink it by about 1 ms each time to avoid letting the change be perceived */
1405 if (max < iaxs[fr->callno]->jitterbuffer - max_jitter_buffer)
1406 iaxs[fr->callno]->jitterbuffer -= 2;
1410 /* Constrain our maximum jitter buffer appropriately */
1411 if (max > min + maxjitterbuffer) {
1413 ast_log(LOG_DEBUG, "Constraining buffer from %d to %d + %d\n", max, min , maxjitterbuffer);
1414 max = min + maxjitterbuffer;
1418 /* If our jitter buffer is smaller than our maximum delay, grow the jitter
1419 buffer immediately to accomodate it (and a little more). */
1420 if (max > iaxs[fr->callno]->jitterbuffer)
1421 iaxs[fr->callno]->jitterbuffer = max
1422 /* + ((float)iaxs[fr->callno]->jitter) * 0.1 */;
1426 ast_log(LOG_DEBUG, "min = %d, max = %d, jb = %d, lateness = %d\n", min, max, iaxs[fr->callno]->jitterbuffer, ms);
1428 /* Subtract the lateness from our jitter buffer to know how long to wait
1429 before sending our packet. */
1430 ms = iaxs[fr->callno]->jitterbuffer - ms;
1432 if (!use_jitterbuffer)
1435 /* If the caller just wanted us to update, return now */
1441 ast_log(LOG_DEBUG, "Calculated ms is %d\n", ms);
1442 /* Don't deliver it more than 4 ms late */
1443 if ((ms > -4) || (fr->f->frametype != AST_FRAME_VOICE)) {
1447 ast_log(LOG_DEBUG, "Dropping voice packet since %d ms is, too old\n", ms);
1448 /* Free the packet */
1450 /* And our iax frame */
1451 ast_iax_frame_free(fr);
1455 ast_log(LOG_DEBUG, "Scheduling delivery in %d ms\n", ms);
1456 fr->retrans = ast_sched_add(sched, ms, do_deliver, fr);
1461 static int iax_transmit(struct ast_iax_frame *fr)
1463 /* Lock the queue and place this packet at the end */
1466 /* By setting this to 0, the network thread will send it for us, and
1467 queue retransmission if necessary */
1469 ast_mutex_lock(&iaxq.lock);
1476 iaxq.tail->next = fr;
1477 fr->prev = iaxq.tail;
1481 ast_mutex_unlock(&iaxq.lock);
1482 /* Wake up the network thread */
1483 pthread_kill(netthreadid, SIGURG);
1489 static int iax_digit(struct ast_channel *c, char digit)
1491 return send_command(c->pvt->pvt, AST_FRAME_DTMF, digit, 0, NULL, 0, -1);
1494 static int iax_sendtext(struct ast_channel *c, char *text)
1497 return send_command(c->pvt->pvt, AST_FRAME_TEXT,
1498 0, 0, text, strlen(text) + 1, -1);
1501 static int iax_sendimage(struct ast_channel *c, struct ast_frame *img)
1503 return send_command(c->pvt->pvt, AST_FRAME_IMAGE, img->subclass, 0, img->data, img->datalen, -1);
1506 static int iax_sendhtml(struct ast_channel *c, int subclass, char *data, int datalen)
1508 return send_command(c->pvt->pvt, AST_FRAME_HTML, subclass, 0, data, datalen, -1);
1511 static int iax_fixup(struct ast_channel *oldchannel, struct ast_channel *newchan)
1513 struct chan_iax_pvt *pvt = newchan->pvt->pvt;
1514 pvt->owner = newchan;
1518 #ifdef MYSQL_FRIENDS
1520 static void mysql_update_peer(char *peer, struct sockaddr_in *sin)
1522 if (mysql && (strlen(peer) < 128)) {
1526 name = alloca(strlen(peer) * 2 + 1);
1528 mysql_real_escape_string(mysql, name, peer, strlen(peer));
1529 snprintf(query, sizeof(query), "UPDATE iax1friends SET ipaddr=\"%s\", port=\"%d\", regseconds=\"%ld\" WHERE name=\"%s\"",
1530 inet_ntoa(sin->sin_addr), ntohs(sin->sin_port), nowtime, name);
1531 ast_mutex_lock(&mysqllock);
1532 if (mysql_real_query(mysql, query, strlen(query)))
1533 ast_log(LOG_WARNING, "Unable to update database\n");
1535 ast_mutex_unlock(&mysqllock);
1539 static struct iax_peer *mysql_peer(char *peer)
1544 p = malloc(sizeof(struct iax_peer));
1545 memset(p, 0, sizeof(struct iax_peer));
1546 if (mysql && (strlen(peer) < 128)) {
1551 time_t regseconds, nowtime;
1553 MYSQL_FIELD *fields;
1555 name = alloca(strlen(peer) * 2 + 1);
1556 mysql_real_escape_string(mysql, name, peer, strlen(peer));
1557 snprintf(query, sizeof(query), "SELECT * FROM iax1friends WHERE name=\"%s\"", name);
1558 ast_mutex_lock(&mysqllock);
1559 mysql_query(mysql, query);
1560 if ((result = mysql_store_result(mysql))) {
1561 if ((rowval = mysql_fetch_row(result))) {
1562 numfields = mysql_num_fields(result);
1563 fields = mysql_fetch_fields(result);
1565 for (x=0;x<numfields;x++) {
1567 if (!strcasecmp(fields[x].name, "secret")) {
1568 strncpy(p->secret, rowval[x], sizeof(p->secret));
1569 } else if (!strcasecmp(fields[x].name, "context")) {
1570 strncpy(p->context, rowval[x], sizeof(p->context) - 1);
1571 } else if (!strcasecmp(fields[x].name, "ipaddr")) {
1572 inet_aton(rowval[x], &p->addr.sin_addr);
1573 } else if (!strcasecmp(fields[x].name, "port")) {
1574 if (sscanf(rowval[x], "%i", &port) != 1)
1576 p->addr.sin_port = htons(port);
1577 } else if (!strcasecmp(fields[x].name, "regseconds")) {
1578 if (sscanf(rowval[x], "%li", ®seconds) != 1)
1584 if ((nowtime - regseconds) > AST_DEFAULT_REG_EXPIRE)
1585 memset(&p->addr, 0, sizeof(p->addr));
1588 ast_mutex_unlock(&mysqllock);
1594 strncpy(p->name, peer, sizeof(p->name) - 1);
1597 p->capability = iax_capability;
1598 strcpy(p->methods, "md5,plaintext");
1603 static struct iax_user *mysql_user(char *user)
1606 struct iax_context *con;
1609 p = malloc(sizeof(struct iax_user));
1610 memset(p, 0, sizeof(struct iax_user));
1611 con = malloc(sizeof(struct iax_context));
1612 memset(con, 0, sizeof(struct iax_context));
1613 strcpy(con->context, "default");
1615 if (mysql && (strlen(user) < 128)) {
1620 MYSQL_FIELD *fields;
1622 name = alloca(strlen(user) * 2 + 1);
1623 mysql_real_escape_string(mysql, name, user, strlen(user));
1624 snprintf(query, sizeof(query), "SELECT * FROM iax1friends WHERE name=\"%s\"", name);
1625 ast_mutex_lock(&mysqllock);
1626 mysql_query(mysql, query);
1627 if ((result = mysql_store_result(mysql))) {
1628 if ((rowval = mysql_fetch_row(result))) {
1629 numfields = mysql_num_fields(result);
1630 fields = mysql_fetch_fields(result);
1632 for (x=0;x<numfields;x++) {
1634 if (!strcasecmp(fields[x].name, "secret")) {
1635 strncpy(p->secret, rowval[x], sizeof(p->secret));
1636 } else if (!strcasecmp(fields[x].name, "context")) {
1637 strncpy(p->contexts->context, rowval[x], sizeof(p->contexts->context) - 1);
1643 ast_mutex_unlock(&mysqllock);
1651 strncpy(p->name, user, sizeof(p->name) - 1);
1653 strcpy(p->methods, "md5,plaintext");
1657 #endif /* MYSQL_FRIENDS */
1659 static int create_addr(struct sockaddr_in *sin, int *capability, int *sendani, int *maxtime, char *peer, char *context)
1668 sin->sin_family = AF_INET;
1669 ast_mutex_lock(&peerl.lock);
1672 if (!strcasecmp(p->name, peer)) {
1677 #ifdef MYSQL_FRIENDS
1679 p = mysql_peer(peer);
1684 *capability = p->capability;
1685 if ((p->addr.sin_addr.s_addr || p->defaddr.sin_addr.s_addr) &&
1686 (!p->maxms || ((p->lastms > 0) && (p->lastms <= p->maxms)))) {
1688 *sendani = p->sendani; /* Whether we transmit ANI */
1690 *maxtime = p->maxms; /* Max time they should take */
1692 strncpy(context, p->context, AST_MAX_EXTENSION - 1);
1693 if (p->addr.sin_addr.s_addr) {
1694 sin->sin_addr = p->addr.sin_addr;
1695 sin->sin_port = p->addr.sin_port;
1697 sin->sin_addr = p->defaddr.sin_addr;
1698 sin->sin_port = p->defaddr.sin_port;
1706 ast_mutex_unlock(&peerl.lock);
1708 hp = gethostbyname(peer);
1710 memcpy(&sin->sin_addr, hp->h_addr, sizeof(sin->sin_addr));
1711 sin->sin_port = htons(AST_DEFAULT_IAX_PORTNO);
1714 ast_log(LOG_WARNING, "No such host: %s\n", peer);
1724 static int auto_congest(void *nothing)
1726 int callno = (int)(long)(nothing);
1727 struct ast_frame f = { AST_FRAME_CONTROL, AST_CONTROL_CONGESTION };
1728 ast_mutex_lock(&iaxsl[callno]);
1730 iaxs[callno]->initid = -1;
1731 iax_queue_frame(callno, &f);
1732 ast_log(LOG_NOTICE, "Auto-congesting call due to slow response\n");
1734 ast_mutex_unlock(&iaxsl[callno]);
1738 static int iax_call(struct ast_channel *c, char *dest, int timeout)
1740 struct sockaddr_in sin;
1745 char *secret = NULL;
1747 char requeststr[256] = "";
1748 char myrdest [5] = "s";
1749 char context[AST_MAX_EXTENSION] ="";
1750 char *portno = NULL;
1751 struct chan_iax_pvt *p = c->pvt->pvt;
1753 if ((c->_state != AST_STATE_DOWN) && (c->_state != AST_STATE_RESERVED)) {
1754 ast_log(LOG_WARNING, "Line is already in use (%s)?\n", c->name);
1757 strncpy(host, dest, sizeof(host)-1);
1759 strsep(&stringp, "/");
1760 /* If no destination extension specified, use 's' */
1761 rdest = strsep(&stringp, "/");
1765 strsep(&stringp, "@");
1766 rcontext = strsep(&stringp, "@");
1768 strsep(&stringp, "@");
1769 username = strsep(&stringp, "@");
1771 /* Really the second argument is the host, not the username */
1779 username = strsep(&stringp, ":");
1780 secret = strsep(&stringp, ":");
1783 if (strsep(&stringp, ":")) {
1785 strsep(&stringp, ":");
1786 portno = strsep(&stringp, ":");
1788 if (create_addr(&sin, NULL, NULL, NULL, hname, context)) {
1789 ast_log(LOG_WARNING, "No address associated with '%s'\n", hname);
1792 /* Keep track of the context for outgoing calls too */
1793 strncpy(c->context, context, sizeof(c->context) - 1);
1795 sin.sin_port = htons(atoi(portno));
1797 /* Now we build our request string */
1798 #define MYSNPRINTF snprintf(requeststr + strlen(requeststr), sizeof(requeststr) - strlen(requeststr),
1799 #define MYSNPRINTF2 snprintf(requeststr + strlen(requeststr), reqsize - strlen(requeststr),
1800 MYSNPRINTF "exten=%s;", rdest);
1802 MYSNPRINTF "callerid=%s;", c->callerid);
1803 if (p->sendani && c->ani)
1804 MYSNPRINTF "ani=%s;", c->ani);
1805 if (c->language && strlen(c->language))
1806 MYSNPRINTF "language=%s;", c->language);
1808 MYSNPRINTF "dnid=%s;", c->dnid);
1810 MYSNPRINTF "context=%s;", rcontext);
1812 MYSNPRINTF "username=%s;", username);
1814 if (secret[0] == '[') {
1815 /* This is an RSA key, not a normal secret */
1816 strncpy(p->outkey, secret + 1, sizeof(p->secret)-1);
1817 if (strlen(p->outkey)) {
1818 p->outkey[strlen(p->outkey) - 1] = '\0';
1821 strncpy(p->secret, secret, sizeof(p->secret)-1);
1823 MYSNPRINTF "formats=%d;", c->nativeformats);
1824 MYSNPRINTF "capability=%d;", p->capability);
1825 MYSNPRINTF "version=%d;", AST_IAX_PROTO_VERSION);
1826 MYSNPRINTF "adsicpe=%d;", c->adsicpe);
1827 /* Trim the trailing ";" */
1828 if (strlen(requeststr))
1829 requeststr[strlen(requeststr) - 1] = '\0';
1830 /* Transmit the string in a "NEW" request */
1831 if (option_verbose > 2)
1832 ast_verbose(VERBOSE_PREFIX_3 "Calling using options '%s'\n", requeststr);
1834 /* Initialize pingtime and auto-congest time */
1835 p->pingtime = p->maxtime / 2;
1836 p->initid = ast_sched_add(sched, p->maxtime * 2, auto_congest, (void *)p->callno);
1838 send_command(p, AST_FRAME_IAX,
1839 AST_IAX_COMMAND_NEW, 0, requeststr, strlen(requeststr) + 1, -1);
1840 ast_setstate(c, AST_STATE_RINGING);
1844 static int iax_hangup(struct ast_channel *c)
1846 struct chan_iax_pvt *pvt = c->pvt->pvt;
1850 callno = pvt->callno;
1851 ast_mutex_lock(&iaxsl[callno]);
1852 ast_log(LOG_DEBUG, "We're hanging up %s now...\n", c->name);
1853 alreadygone = pvt->alreadygone;
1854 /* Send the hangup unless we have had a transmission error or are already gone */
1855 if (!pvt->error && !alreadygone)
1856 send_command_final(pvt, AST_FRAME_IAX, AST_IAX_COMMAND_HANGUP, 0, NULL, 0, -1);
1857 /* Explicitly predestroy it */
1858 iax_predestroy_nolock(callno);
1859 /* If we were already gone to begin with, destroy us now */
1861 ast_log(LOG_DEBUG, "Really destroying %s now...\n", c->name);
1862 iax_destroy_nolock(callno);
1864 ast_mutex_unlock(&iaxsl[callno]);
1866 if (option_verbose > 2)
1867 ast_verbose(VERBOSE_PREFIX_3 "Hungup '%s'\n", c->name);
1871 static int iax_setoption(struct ast_channel *c, int option, void *data, int datalen)
1873 struct ast_option_header *h;
1875 h = malloc(datalen + sizeof(struct ast_option_header));
1877 h->flag = AST_OPTION_FLAG_REQUEST;
1878 h->option = htons(option);
1879 memcpy(h->data, data, datalen);
1880 res = send_command((struct chan_iax_pvt *)c->pvt->pvt, AST_FRAME_CONTROL,
1881 AST_CONTROL_OPTION, 0, (char *)h, datalen + sizeof(struct ast_option_header), -1);
1885 ast_log(LOG_WARNING, "Out of memory\n");
1888 static struct ast_frame *iax_read(struct ast_channel *c)
1890 static struct ast_frame f = { AST_FRAME_NULL, };
1891 ast_log(LOG_NOTICE, "I should never be called!\n");
1895 static int iax_start_transfer(struct ast_channel *c0, struct ast_channel *c1)
1900 struct chan_iax_pvt *p0 = c0->pvt->pvt;
1901 struct chan_iax_pvt *p1 = c1->pvt->pvt;
1902 snprintf(req0, sizeof(req0), "remip=%s;remport=%d;remcall=%d;", inet_ntoa(p1->addr.sin_addr), ntohs(p1->addr.sin_port), p1->peercallno);
1903 snprintf(req1, sizeof(req1), "remip=%s;remport=%d;remcall=%d;", inet_ntoa(p0->addr.sin_addr), ntohs(p0->addr.sin_port), p0->peercallno);
1904 res = send_command(p0, AST_FRAME_IAX, AST_IAX_COMMAND_TXREQ, 0, req0, strlen(req0) + 1, -1);
1907 res = send_command(p1, AST_FRAME_IAX, AST_IAX_COMMAND_TXREQ, 0, req1, strlen(req1) + 1, -1);
1910 p0->transferring = TRANSFER_BEGIN;
1911 p1->transferring = TRANSFER_BEGIN;
1915 static int iax_bridge(struct ast_channel *c0, struct ast_channel *c1, int flags, struct ast_frame **fo, struct ast_channel **rc)
1917 struct ast_channel *cs[3];
1918 struct ast_channel *who;
1921 int transferstarted=0;
1922 struct ast_frame *f;
1923 struct chan_iax_pvt *p0 = c0->pvt->pvt;
1924 struct chan_iax_pvt *p1 = c1->pvt->pvt;
1926 /* Put them in native bridge mode */
1927 p0->bridgecallno = p1->callno;
1928 p1->bridgecallno = p0->callno;
1930 /* If not, try to bridge until we can execute a transfer, if we can */
1933 for (/* ever */;;) {
1934 /* Check in case we got masqueraded into */
1935 if ((c0->type != type) || (c1->type != type)) {
1936 if (option_verbose > 2)
1937 ast_verbose(VERBOSE_PREFIX_3 "Can't masquerade, we're different...\n");
1940 if (c0->nativeformats != c1->nativeformats) {
1941 ast_verbose(VERBOSE_PREFIX_3 "Operating with different codecs, can't native bridge...\n");
1944 if (!transferstarted) {
1945 /* Try the transfer */
1946 if (iax_start_transfer(c0, c1))
1947 ast_log(LOG_WARNING, "Unable to start the transfer\n");
1948 transferstarted = 1;
1951 if ((p0->transferring == TRANSFER_RELEASED) && (p1->transferring == TRANSFER_RELEASED)) {
1952 /* Call has been transferred. We're no longer involved */
1954 c0->_softhangup |= AST_SOFTHANGUP_DEV;
1955 c1->_softhangup |= AST_SOFTHANGUP_DEV;
1962 who = ast_waitfor_n(cs, 2, &to);
1973 if ((f->frametype == AST_FRAME_CONTROL) && !(flags & AST_BRIDGE_IGNORE_SIGS)) {
1979 if ((f->frametype == AST_FRAME_VOICE) ||
1980 (f->frametype == AST_FRAME_TEXT) ||
1981 (f->frametype == AST_FRAME_VIDEO) ||
1982 (f->frametype == AST_FRAME_IMAGE) ||
1983 (f->frametype == AST_FRAME_DTMF)) {
1984 if ((f->frametype == AST_FRAME_DTMF) &&
1985 (flags & (AST_BRIDGE_DTMF_CHANNEL_0 | AST_BRIDGE_DTMF_CHANNEL_1))) {
1987 if ((flags & AST_BRIDGE_DTMF_CHANNEL_0)) {
1990 /* Take out of conference mode */
1997 if (flags & AST_BRIDGE_DTMF_CHANNEL_1) {
2007 ast_log(LOG_DEBUG, "Read from %s\n", who->name);
2009 ast_log(LOG_DEBUG, "Servicing channel %s twice in a row?\n", last->name);
2021 /* Swap who gets priority */
2026 p0->bridgecallno = -1;
2027 p1->bridgecallno = -1;
2031 static int iax_answer(struct ast_channel *c)
2033 struct chan_iax_pvt *pvt = c->pvt->pvt;
2035 ast_log(LOG_DEBUG, "Answering\n");
2036 return send_command(pvt, AST_FRAME_CONTROL, AST_CONTROL_ANSWER, 0, NULL, 0, -1);
2039 static int iax_indicate(struct ast_channel *c, int condition)
2041 struct chan_iax_pvt *pvt = c->pvt->pvt;
2043 ast_log(LOG_DEBUG, "Indicating condition %d\n", condition);
2044 return send_command(pvt, AST_FRAME_CONTROL, condition, 0, NULL, 0, -1);
2048 static int iax_write(struct ast_channel *c, struct ast_frame *f);
2050 static int iax_getpeername(struct sockaddr_in sin, char *host, int len)
2052 struct iax_peer *peer;
2054 ast_mutex_lock(&peerl.lock);
2057 if ((peer->addr.sin_addr.s_addr == sin.sin_addr.s_addr) &&
2058 (peer->addr.sin_port == sin.sin_port)) {
2059 strncpy(host, peer->name, len-1);
2065 ast_mutex_unlock(&peerl.lock);
2069 static struct ast_channel *ast_iax_new(struct chan_iax_pvt *i, int state, int capability)
2072 struct ast_channel *tmp;
2073 tmp = ast_channel_alloc(1);
2075 if (!iax_getpeername(i->addr, host, sizeof(host)))
2076 snprintf(host, sizeof(host), "%s:%d", inet_ntoa(i->addr.sin_addr), ntohs(i->addr.sin_port));
2077 if (strlen(i->username))
2078 snprintf(tmp->name, sizeof(tmp->name), "IAX[%s@%s]/%d", i->username, host, i->callno);
2080 snprintf(tmp->name, sizeof(tmp->name), "IAX[%s]/%d", host, i->callno);
2082 /* We can support any format by default, until we get restricted */
2083 tmp->nativeformats = capability;
2084 tmp->readformat = 0;
2085 tmp->writeformat = 0;
2087 tmp->pvt->send_digit = iax_digit;
2088 tmp->pvt->send_text = iax_sendtext;
2089 tmp->pvt->send_image = iax_sendimage;
2090 tmp->pvt->send_html = iax_sendhtml;
2091 tmp->pvt->call = iax_call;
2092 tmp->pvt->hangup = iax_hangup;
2093 tmp->pvt->answer = iax_answer;
2094 tmp->pvt->read = iax_read;
2095 tmp->pvt->write = iax_write;
2096 tmp->pvt->indicate = iax_indicate;
2097 tmp->pvt->setoption = iax_setoption;
2098 tmp->pvt->bridge = iax_bridge;
2099 if (strlen(i->callerid))
2100 tmp->callerid = strdup(i->callerid);
2102 tmp->ani = strdup(i->ani);
2103 if (strlen(i->language))
2104 strncpy(tmp->language, i->language, sizeof(tmp->language)-1);
2105 if (strlen(i->dnid))
2106 tmp->dnid = strdup(i->dnid);
2107 if (strlen(i->accountcode))
2108 strncpy(tmp->accountcode, i->accountcode, sizeof(tmp->accountcode)-1);
2110 tmp->amaflags = i->amaflags;
2111 strncpy(tmp->context, i->context, sizeof(tmp->context)-1);
2112 strncpy(tmp->exten, i->exten, sizeof(tmp->exten)-1);
2113 tmp->adsicpe = i->peeradsicpe;
2114 tmp->pvt->fixup = iax_fixup;
2116 i->capability = capability;
2117 ast_setstate(tmp, state);
2118 ast_mutex_lock(&usecnt_lock);
2120 ast_mutex_unlock(&usecnt_lock);
2121 ast_update_use_count();
2122 if (state != AST_STATE_DOWN) {
2123 if (ast_pbx_start(tmp)) {
2124 ast_log(LOG_WARNING, "Unable to start PBX on %s\n", tmp->name);
2133 static unsigned int calc_timestamp(struct chan_iax_pvt *p, unsigned int ts)
2137 if (!p->offset.tv_sec && !p->offset.tv_usec)
2138 gettimeofday(&p->offset, NULL);
2139 /* If the timestamp is specified, just send it as is */
2142 gettimeofday(&tv, NULL);
2143 ms = (tv.tv_sec - p->offset.tv_sec) * 1000 + (tv.tv_usec - p->offset.tv_usec) / 1000;
2144 /* We never send the same timestamp twice, so fudge a little if we must */
2145 if (ms <= p->lastsent)
2146 ms = p->lastsent + 1;
2151 #ifdef BRIDGE_OPTIMIZATION
2152 static unsigned int calc_fakestamp(struct chan_iax_pvt *p1, struct chan_iax_pvt *p2, unsigned int fakets)
2155 /* Receive from p1, send to p2 */
2157 /* Setup rxcore if necessary on outgoing channel */
2158 if (!p1->rxcore.tv_sec && !p1->rxcore.tv_usec)
2159 gettimeofday(&p1->rxcore, NULL);
2161 /* Setup txcore if necessary on outgoing channel */
2162 if (!p2->offset.tv_sec && !p2->offset.tv_usec)
2163 gettimeofday(&p2->offset, NULL);
2165 /* Now, ts is the timestamp of the original packet in the orignal context.
2166 Adding rxcore to it gives us when we would want the packet to be delivered normally.
2167 Subtracting txcore of the outgoing channel gives us what we'd expect */
2169 ms = (p1->rxcore.tv_sec - p2->offset.tv_sec) * 1000 + (p1->rxcore.tv_usec - p1->offset.tv_usec) / 1000;
2171 if (fakets <= p2->lastsent)
2172 fakets = p2->lastsent + 1;
2173 p2->lastsent = fakets;
2178 static unsigned int calc_rxstamp(struct chan_iax_pvt *p)
2180 /* Returns where in "receive time" we are */
2183 /* Setup rxcore if necessary */
2184 if (!p->rxcore.tv_sec && !p->rxcore.tv_usec)
2185 gettimeofday(&p->rxcore, NULL);
2187 gettimeofday(&tv, NULL);
2188 ms = (tv.tv_sec - p->rxcore.tv_sec) * 1000 + (tv.tv_usec - p->rxcore.tv_usec) / 1000;
2192 static int iax_send(struct chan_iax_pvt *pvt, struct ast_frame *f, unsigned int ts, int seqno, int now, int transfer, int final)
2194 /* Queue a packet for delivery on a given private structure. Use "ts" for
2195 timestamp, or calculate if ts is 0. Send immediately without retransmission
2196 or delayed, with retransmission */
2197 struct ast_iax_full_hdr *fh;
2198 struct ast_iax_mini_hdr *mh;
2199 struct ast_iax_frame *fr, fr2;
2201 unsigned int lastsent;
2202 /* Allocate an ast_iax_frame */
2206 fr = ast_iax_frame_new(DIRECTION_OUTGRESS);
2208 ast_log(LOG_WARNING, "Out of memory\n");
2212 ast_log(LOG_WARNING, "No private structure for packet (%d)?\n", fr->callno);
2214 ast_iax_frame_free(fr);
2217 /* Isolate our frame for transmission */
2218 fr->f = ast_frdup(f);
2221 ast_log(LOG_WARNING, "Out of memory\n");
2223 ast_iax_frame_free(fr);
2226 if (fr->f->offset < sizeof(struct ast_iax_full_hdr)) {
2227 ast_log(LOG_WARNING, "Packet from '%s' not friendly\n", fr->f->src);
2231 lastsent = pvt->lastsent;
2232 fr->ts = calc_timestamp(pvt, ts);
2234 ast_log(LOG_WARNING, "timestamp is 0?\n");
2236 ast_iax_frame_free(fr);
2239 fr->callno = pvt->callno;
2240 fr->transfer = transfer;
2242 if (((fr->ts & 0xFFFF0000L) != (lastsent & 0xFFFF0000L))
2243 /* High two bits of timestamp differ */ ||
2244 (fr->f->frametype != AST_FRAME_VOICE)
2245 /* or not a voice frame */ ||
2246 (fr->f->subclass != pvt->svoiceformat)
2247 /* or new voice format */ ) {
2248 /* We need a full frame */
2252 fr->seqno = pvt->oseqno++;
2253 fh = (struct ast_iax_full_hdr *)(fr->f->data - sizeof(struct ast_iax_full_hdr));
2254 fh->callno = htons(fr->callno | AST_FLAG_FULL);
2255 fh->ts = htonl(fr->ts);
2256 fh->seqno = htons(fr->seqno);
2257 fh->type = fr->f->frametype & 0xFF;
2258 fh->csub = compress_subclass(fr->f->subclass);
2260 fh->dcallno = htons(pvt->transfercallno);
2262 fh->dcallno = htons(pvt->peercallno);
2263 fr->datalen = fr->f->datalen + sizeof(struct ast_iax_full_hdr);
2266 /* Retry after 2x the ping time has passed */
2267 fr->retrytime = pvt->pingtime * 2;
2268 if (fr->retrytime < MIN_RETRY_TIME)
2269 fr->retrytime = MIN_RETRY_TIME;
2270 if (fr->retrytime > MAX_RETRY_TIME)
2271 fr->retrytime = MAX_RETRY_TIME;
2272 /* Acks' don't get retried */
2273 if ((f->frametype == AST_FRAME_IAX) && (f->subclass == AST_IAX_COMMAND_ACK))
2275 if (f->frametype == AST_FRAME_VOICE) {
2276 pvt->svoiceformat = f->subclass;
2279 res = send_packet(fr);
2282 res = iax_transmit(fr);
2284 /* Mini-frames have no sequence number */
2286 /* Mini frame will do */
2287 mh = (struct ast_iax_mini_hdr *)(fr->f->data - sizeof(struct ast_iax_mini_hdr));
2288 mh->callno = htons(fr->callno);
2289 mh->ts = htons(fr->ts & 0xFFFF);
2290 fr->datalen = fr->f->datalen + sizeof(struct ast_iax_mini_hdr);
2294 res = send_packet(fr);
2297 res = iax_transmit(fr);
2304 static int iax_show_users(int fd, int argc, char *argv[])
2306 #define FORMAT "%-15.15s %-15.15s %-15.15s %-15.15s %-5.5s\n"
2307 struct iax_user *user;
2309 return RESULT_SHOWUSAGE;
2310 ast_mutex_lock(&userl.lock);
2311 ast_cli(fd, FORMAT, "Username", "Secret", "Authen", "Def.Context", "A/C");
2312 for(user=userl.users;user;user=user->next) {
2313 ast_cli(fd, FORMAT, user->name, user->secret, user->methods,
2314 user->contexts ? user->contexts->context : context,
2315 user->ha ? "Yes" : "No");
2317 ast_mutex_unlock(&userl.lock);
2318 return RESULT_SUCCESS;
2322 static int iax_show_peers(int fd, int argc, char *argv[])
2324 #define FORMAT2 "%-15.15s %-15.15s %s %-15.15s %-8s %-10s\n"
2325 #define FORMAT "%-15.15s %-15.15s %s %-15.15s %-8d %-10s\n"
2326 struct iax_peer *peer;
2327 char name[256] = "";
2329 return RESULT_SHOWUSAGE;
2330 ast_mutex_lock(&peerl.lock);
2331 ast_cli(fd, FORMAT2, "Name/Username", "Host", " ", "Mask", "Port", "Status");
2332 for (peer = peerl.peers;peer;peer = peer->next) {
2335 if (strlen(peer->username))
2336 snprintf(name, sizeof(name), "%s/%s", peer->name, peer->username);
2338 strncpy(name, peer->name, sizeof(name) - 1);
2340 if (peer->lastms < 0)
2341 strcpy(status, "UNREACHABLE");
2342 else if (peer->lastms > peer->maxms)
2343 snprintf(status, sizeof(status), "LAGGED (%d ms)", peer->lastms);
2344 else if (peer->lastms)
2345 snprintf(status, sizeof(status), "OK (%d ms)", peer->lastms);
2347 strcpy(status, "UNKNOWN");
2349 strcpy(status, "Unmonitored");
2350 strncpy(nm, inet_ntoa(peer->mask), sizeof(nm)-1);
2351 ast_cli(fd, FORMAT, name,
2352 peer->addr.sin_addr.s_addr ? inet_ntoa(peer->addr.sin_addr) : "(Unspecified)",
2353 peer->dynamic ? "(D)" : "(S)",
2355 ntohs(peer->addr.sin_port), status);
2357 ast_mutex_unlock(&peerl.lock);
2358 return RESULT_SUCCESS;
2363 /* JDG: callback to display iax peers in manager */
2364 static int manager_iax_show_peers( struct mansession *s, struct message *m )
2366 char *a[] = { "iax", "show", "users" };
2368 ret = iax_show_peers( s->fd, 3, a );
2369 ast_cli( s->fd, "\r\n" );
2373 static char *regstate2str(int regstate)
2376 case REG_STATE_UNREGISTERED:
2377 return "Unregistered";
2378 case REG_STATE_REGSENT:
2379 return "Request Sent";
2380 case REG_STATE_AUTHSENT:
2381 return "Auth. Sent";
2382 case REG_STATE_REGISTERED:
2383 return "Registered";
2384 case REG_STATE_REJECTED:
2386 case REG_STATE_TIMEOUT:
2388 case REG_STATE_NOAUTH:
2389 return "No Authentication";
2395 static int iax_show_registry(int fd, int argc, char *argv[])
2397 #define FORMAT2 "%-20.20s %-10.10s %-20.20s %8.8s %s\n"
2398 #define FORMAT "%-20.20s %-10.10s %-20.20s %8d %s\n"
2399 struct iax_registry *reg;
2403 return RESULT_SHOWUSAGE;
2404 ast_mutex_lock(&peerl.lock);
2405 ast_cli(fd, FORMAT2, "Host", "Username", "Perceived", "Refresh", "State");
2406 for (reg = registrations;reg;reg = reg->next) {
2407 snprintf(host, sizeof(host), "%s:%d", inet_ntoa(reg->addr.sin_addr), ntohs(reg->addr.sin_port));
2408 if (reg->us.sin_addr.s_addr)
2409 snprintf(perceived, sizeof(perceived), "%s:%d", inet_ntoa(reg->us.sin_addr), ntohs(reg->us.sin_port));
2411 strcpy(perceived, "<Unregistered>");
2412 ast_cli(fd, FORMAT, host,
2413 reg->username, perceived, reg->refresh, regstate2str(reg->regstate));
2415 ast_mutex_unlock(&peerl.lock);
2416 return RESULT_SUCCESS;
2421 static int iax_show_channels(int fd, int argc, char *argv[])
2423 #define FORMAT2 "%-15.15s %-10.10s %-11.11s %-11.11s %-7.7s %-6.6s %s\n"
2424 #define FORMAT "%-15.15s %-10.10s %5.5d/%5.5d %5.5d/%5.5d %-5.5dms %-4.4dms %-6.6s\n"
2428 return RESULT_SHOWUSAGE;
2429 ast_cli(fd, FORMAT2, "Peer", "Username", "ID (Lo/Rem)", "Seq (Tx/Rx)", "Lag", "Jitter", "Format");
2430 for (x=0;x<AST_IAX_MAX_CALLS;x++) {
2431 ast_mutex_lock(&iaxsl[x]);
2433 ast_cli(fd, FORMAT, inet_ntoa(iaxs[x]->addr.sin_addr),
2434 strlen(iaxs[x]->username) ? iaxs[x]->username : "(None)",
2435 iaxs[x]->callno, iaxs[x]->peercallno,
2436 iaxs[x]->oseqno, iaxs[x]->iseqno,
2439 ast_getformatname(iaxs[x]->voiceformat) );
2442 ast_mutex_unlock(&iaxsl[x]);
2444 ast_cli(fd, "%d active IAX channel(s)\n", numchans);
2445 return RESULT_SUCCESS;
2450 static int iax_do_debug(int fd, int argc, char *argv[])
2453 return RESULT_SHOWUSAGE;
2455 ast_cli(fd, "IAX Debugging Enabled\n");
2456 return RESULT_SUCCESS;
2459 static int iax_no_debug(int fd, int argc, char *argv[])
2462 return RESULT_SHOWUSAGE;
2464 ast_cli(fd, "IAX Debugging Disabled\n");
2465 return RESULT_SUCCESS;
2470 static char show_users_usage[] =
2471 "Usage: iax show users\n"
2472 " Lists all users known to the IAX (Inter-Asterisk eXchange) subsystem.\n";
2474 static char show_channels_usage[] =
2475 "Usage: iax show channels\n"
2476 " Lists all currently active IAX channels.\n";
2478 static char show_peers_usage[] =
2479 "Usage: iax show peers\n"
2480 " Lists all known IAX peers.\n";
2482 static char show_reg_usage[] =
2483 "Usage: iax show registry\n"
2484 " Lists all registration requests and status.\n";
2486 #ifdef DEBUG_SUPPORT
2488 static char debug_usage[] =
2489 "Usage: iax debug\n"
2490 " Enables dumping of IAX packets for debugging purposes\n";
2492 static char no_debug_usage[] =
2493 "Usage: iax no debug\n"
2494 " Disables dumping of IAX packets for debugging purposes\n";
2498 static struct ast_cli_entry cli_show_users =
2499 { { "iax", "show", "users", NULL }, iax_show_users, "Show defined IAX users", show_users_usage };
2500 static struct ast_cli_entry cli_show_channels =
2501 { { "iax", "show", "channels", NULL }, iax_show_channels, "Show active IAX channels", show_channels_usage };
2502 static struct ast_cli_entry cli_show_peers =
2503 { { "iax", "show", "peers", NULL }, iax_show_peers, "Show defined IAX peers", show_peers_usage };
2504 static struct ast_cli_entry cli_show_registry =
2505 { { "iax", "show", "registry", NULL }, iax_show_registry, "Show IAX registration status", show_reg_usage };
2506 static struct ast_cli_entry cli_debug =
2507 { { "iax", "debug", NULL }, iax_do_debug, "Enable IAX debugging", debug_usage };
2508 static struct ast_cli_entry cli_no_debug =
2509 { { "iax", "no", "debug", NULL }, iax_no_debug, "Disable IAX debugging", no_debug_usage };
2511 static int iax_write(struct ast_channel *c, struct ast_frame *f)
2513 struct chan_iax_pvt *i = c->pvt->pvt;
2516 /* If there's an outstanding error, return failure now */
2518 ast_log(LOG_DEBUG, "Write error: %s\n", strerror(errno));
2521 /* If it's already gone, just return */
2524 /* Don't waste bandwidth sending null frames */
2525 if (f->frametype == AST_FRAME_NULL)
2527 /* If we're quelching voice, don't bother sending it */
2528 if ((f->frametype == AST_FRAME_VOICE) && i->quelch)
2530 /* Simple, just queue for transmission */
2531 return iax_send(i, f, 0, -1, 0, 0, 0);
2534 static int __send_command(struct chan_iax_pvt *i, char type, int command, unsigned int ts, char *data, int datalen, int seqno,
2535 int now, int transfer, int final)
2539 f.subclass = command;
2540 f.datalen = datalen;
2544 f.src = __FUNCTION__;
2546 return iax_send(i, &f, ts, seqno, now, transfer, final);
2549 static int send_command(struct chan_iax_pvt *i, char type, int command, unsigned int ts, char *data, int datalen, int seqno)
2551 return __send_command(i, type, command, ts, data, datalen, seqno, 0, 0, 0);
2554 #ifdef BRIDGE_OPTIMIZATION
2555 static int forward_command(struct chan_iax_pvt *i, char type, int command, unsigned int ts, char *data, int datalen, int seqno)
2557 return __send_command(iaxs[i->bridgecallno], type, command, ts, data, datalen, seqno, 0, 0, 0);
2561 static int send_command_final(struct chan_iax_pvt *i, char type, int command, unsigned int ts, char *data, int datalen, int seqno)
2563 /* It is assumed that the callno has already been locked */
2564 iax_predestroy_nolock(i->callno);
2565 return __send_command(i, type, command, ts, data, datalen, seqno, 0, 0, 1);
2568 static int send_command_immediate(struct chan_iax_pvt *i, char type, int command, unsigned int ts, char *data, int datalen, int seqno)
2570 return __send_command(i, type, command, ts, data, datalen, seqno, 1, 0, 0);
2573 static int send_command_transfer(struct chan_iax_pvt *i, char type, int command, unsigned int ts, char *data, int datalen)
2575 return __send_command(i, type, command, ts, data, datalen, 0, 0, 1, 0);
2578 static int apply_context(struct iax_context *con, char *context)
2581 if (!strcmp(con->context, context))
2588 static int iax_getformats(int callno, char *orequest)
2593 strncpy(request, orequest, sizeof(request)-1);
2595 var = strsep(&stringp, ";");
2597 value = strchr(var, '=');
2601 if (!strcmp(var, "formats")) {
2602 iaxs[callno]->peerformat = atoi(value);
2604 ast_log(LOG_WARNING, "Unknown variable '%s' with value '%s'\n", var, value);
2606 var = strsep(&stringp, ";");
2612 static int check_access(int callno, struct sockaddr_in *sin, char *orequest, int requestl)
2614 /* Start pessimistic */
2618 struct iax_user *user;
2620 int gotcapability=0;
2622 strncpy(request, orequest, sizeof(request)-1);
2626 var = strsep(&stringp, ";");
2628 value = strchr(var, '=');
2632 if (!strcmp(var, "exten"))
2633 strncpy(iaxs[callno]->exten, value, sizeof(iaxs[callno]->exten)-1);
2634 else if (!strcmp(var, "callerid"))
2635 strncpy(iaxs[callno]->callerid, value, sizeof(iaxs[callno]->callerid)-1);
2636 else if (!strcmp(var, "ani"))
2637 strncpy(iaxs[callno]->ani, value, sizeof(iaxs[callno]->ani) - 1);
2638 else if (!strcmp(var, "dnid"))
2639 strncpy(iaxs[callno]->dnid, value, sizeof(iaxs[callno]->dnid)-1);
2640 else if (!strcmp(var, "context"))
2641 strncpy(iaxs[callno]->context, value, sizeof(iaxs[callno]->context)-1);
2642 else if (!strcmp(var, "language"))
2643 strncpy(iaxs[callno]->language, value, sizeof(iaxs[callno]->language)-1);
2644 else if (!strcmp(var, "username"))
2645 strncpy(iaxs[callno]->username, value, sizeof(iaxs[callno]->username)-1);
2646 else if (!strcmp(var, "formats"))
2647 iaxs[callno]->peerformat = atoi(value);
2648 else if (!strcmp(var, "adsicpe"))
2649 iaxs[callno]->peeradsicpe = atoi(value);
2650 else if (!strcmp(var, "capability")) {
2652 iaxs[callno]->peercapability = atoi(value);
2653 } else if (!strcmp(var, "version"))
2654 version = atoi(value);
2656 ast_log(LOG_WARNING, "Unknown variable '%s' with value '%s'\n", var, value);
2658 var = strsep(&stringp, ";");
2661 iaxs[callno]->peercapability = iaxs[callno]->peerformat;
2662 if (version > AST_IAX_PROTO_VERSION) {
2663 ast_log(LOG_WARNING, "Peer '%s' has too new a protocol version (%d) for me\n",
2664 inet_ntoa(sin->sin_addr), version);
2667 ast_mutex_lock(&userl.lock);
2668 /* Search the userlist for a compatible entry, and fill in the rest */
2671 if ((!strlen(iaxs[callno]->username) || /* No username specified */
2672 !strcmp(iaxs[callno]->username, user->name)) /* Or this username specified */
2673 && ast_apply_ha(user->ha, sin) /* Access is permitted from this IP */
2674 && (!strlen(iaxs[callno]->context) || /* No context specified */
2675 apply_context(user->contexts, iaxs[callno]->context))) { /* Context is permitted */
2680 #ifdef MYSQL_FRIENDS
2681 if (!user && mysql && strlen(iaxs[callno]->username) && (strlen(iaxs[callno]->username) < 128)) {
2682 user = mysql_user(iaxs[callno]->username);
2683 if (user && strlen(iaxs[callno]->context) && /* No context specified */
2684 !apply_context(user->contexts, iaxs[callno]->context)) { /* Context is permitted */
2686 free(user->contexts);
2692 ast_mutex_unlock(&userl.lock);
2694 /* We found our match (use the first) */
2696 /* Store the requested username if not specified */
2697 if (!strlen(iaxs[callno]->username))
2698 strncpy(iaxs[callno]->username, user->name, sizeof(iaxs[callno]->username)-1);
2699 /* And use the default context */
2700 if (!strlen(iaxs[callno]->context)) {
2702 strncpy(iaxs[callno]->context, user->contexts->context, sizeof(iaxs[callno]->context)-1);
2704 strncpy(iaxs[callno]->context, context, sizeof(iaxs[callno]->context)-1);
2706 /* Copy the secret */
2707 strncpy(iaxs[callno]->secret, user->secret, sizeof(iaxs[callno]->secret)-1);
2708 /* And any input keys */
2709 strncpy(iaxs[callno]->inkeys, user->inkeys, sizeof(iaxs[callno]->inkeys));
2710 /* And the permitted authentication methods */
2711 strncpy(iaxs[callno]->methods, user->methods, sizeof(iaxs[callno]->methods)-1);
2712 /* If they have callerid, override the given caller id. Always store the ANI */
2713 if (strlen(iaxs[callno]->callerid)) {
2714 if (user->hascallerid)
2715 strncpy(iaxs[callno]->callerid, user->callerid, sizeof(iaxs[callno]->callerid)-1);
2716 strncpy(iaxs[callno]->ani, user->callerid, sizeof(iaxs[callno]->ani)-1);
2718 if (strlen(user->accountcode))
2719 strncpy(iaxs[callno]->accountcode, user->accountcode, sizeof(iaxs[callno]->accountcode)-1);
2721 iaxs[callno]->amaflags = user->amaflags;
2727 static int raw_hangup(struct sockaddr_in *sin, short src, short dst)
2729 struct ast_iax_full_hdr fh;
2730 fh.callno = htons(src | AST_FLAG_FULL);
2731 fh.dcallno = htons(dst);
2734 fh.type = AST_FRAME_IAX;
2735 fh.csub = compress_subclass(AST_IAX_COMMAND_INVAL);
2739 ast_log(LOG_DEBUG, "Raw Hangup %s:%d, src=%d, dst=%d\n",
2740 inet_ntoa(sin->sin_addr), ntohs(sin->sin_port), src, dst);
2741 return sendto(netsocket, &fh, sizeof(fh), 0, (struct sockaddr *)sin, sizeof(*sin));
2744 static int authenticate_request(struct chan_iax_pvt *p)
2746 char requeststr[256] = "";
2747 MYSNPRINTF "methods=%s;", p->methods);
2748 if (strstr(p->methods, "md5") || strstr(p->methods, "rsa")) {
2749 /* Build the challenge */
2750 snprintf(p->challenge, sizeof(p->challenge), "%d", rand());
2751 MYSNPRINTF "challenge=%s;", p->challenge);
2753 MYSNPRINTF "username=%s;", p->username);
2754 if (strlen(requeststr))
2755 requeststr[strlen(requeststr) - 1] = '\0';
2756 return send_command(p, AST_FRAME_IAX, AST_IAX_COMMAND_AUTHREQ, 0, requeststr, strlen(requeststr) + 1, -1);
2759 static int authenticate_verify(struct chan_iax_pvt *p, char *orequest)
2761 char requeststr[256] = "";
2762 char *var, *value, request[256];
2763 char md5secret[256] = "";
2764 char secret[256] = "";
2765 char rsasecret[256] = "";
2770 if (!(p->state & IAX_STATE_AUTHENTICATED))
2772 strncpy(request, orequest, sizeof(request)-1);
2774 var = strsep(&stringp, ";");
2776 value = strchr(var, '=');
2780 if (!strcmp(var, "secret"))
2781 strncpy(secret, value, sizeof(secret)-1);
2782 else if (!strcmp(var, "md5secret"))
2783 strncpy(md5secret, value, sizeof(md5secret)-1);
2784 else if (!strcmp(var, "rsasecret"))
2785 strncpy(rsasecret, value, sizeof(rsasecret)-1);
2787 ast_log(LOG_WARNING, "Unknown variable '%s' with value '%s'\n", var, value);
2789 var = strsep(&stringp, ";");
2791 if (strstr(p->methods, "rsa") && strlen(rsasecret) && strlen(p->inkeys)) {
2792 struct ast_key *key;
2796 strncpy(tmpkey, p->inkeys, sizeof(tmpkey));
2798 keyn = strsep(&stringp, ":");
2800 key = ast_key_get(keyn, AST_KEY_PUBLIC);
2801 if (key && !ast_check_signature(key, p->challenge, rsasecret)) {
2805 ast_log(LOG_WARNING, "requested inkey '%s' for RSA authentication does not exist\n", keyn);
2806 keyn = strsep(&stringp, ":");
2808 } else if (strstr(p->methods, "md5")) {
2809 struct MD5Context md5;
2810 unsigned char digest[16];
2812 MD5Update(&md5, p->challenge, strlen(p->challenge));
2813 MD5Update(&md5, p->secret, strlen(p->secret));
2814 MD5Final(digest, &md5);
2815 /* If they support md5, authenticate with it. */
2817 MYSNPRINTF "%2.2x", digest[x]);
2818 if (!strcasecmp(requeststr, md5secret))
2820 } else if (strstr(p->methods, "plaintext")) {
2821 if (!strcmp(secret, p->secret))
2827 static int register_verify(int callno, struct sockaddr_in *sin, char *orequest)
2830 char requeststr[256] = "";
2831 char peer[256] = "";
2832 char md5secret[256] = "";
2833 char rsasecret[256] = "";
2834 char secret[256] = "";
2836 struct ast_key *key;
2844 iaxs[callno]->state &= ~IAX_STATE_AUTHENTICATED;
2845 strcpy(iaxs[callno]->peer, "");
2848 strncpy(request, orequest, sizeof(request)-1);
2850 var = strsep(&stringp, ";");
2852 value = strchr(var, '=');
2856 if (!strcmp(var, "peer"))
2857 strncpy(peer, value, sizeof(peer)-1);
2858 else if (!strcmp(var, "md5secret"))
2859 strncpy(md5secret, value, sizeof(md5secret)-1);
2860 else if (!strcmp(var, "rsasecret"))
2861 strncpy(rsasecret, value, sizeof(rsasecret)-1);
2862 else if (!strcmp(var, "secret"))
2863 strncpy(secret, value, sizeof(secret)-1);
2864 else if (!strcmp(var, "refresh"))
2865 expire = atoi(value);
2867 ast_log(LOG_WARNING, "Unknown variable '%s' with value '%s'\n", var, value);
2869 var = strsep(&stringp, ";");
2872 if (!strlen(peer)) {
2873 ast_log(LOG_NOTICE, "Empty registration from %s\n", inet_ntoa(sin->sin_addr));
2877 for (p = peerl.peers; p ; p = p->next)
2878 if (!strcasecmp(p->name, peer))
2881 #ifdef MYSQL_FRIENDS
2883 p = mysql_peer(peer);
2886 ast_log(LOG_NOTICE, "No registration for peer '%s' (from %s)\n", peer, inet_ntoa(sin->sin_addr));
2891 ast_log(LOG_NOTICE, "Peer '%s' is not dynamic (from %s)\n", peer, inet_ntoa(sin->sin_addr));
2897 if (!ast_apply_ha(p->ha, sin)) {
2898 ast_log(LOG_NOTICE, "Host %s denied access to register peer '%s'\n", inet_ntoa(sin->sin_addr), p->name);
2903 strncpy(iaxs[callno]->secret, p->secret, sizeof(iaxs[callno]->secret)-1);
2904 strncpy(iaxs[callno]->inkeys, p->inkeys, sizeof(iaxs[callno]->inkeys)-1);
2905 /* Check secret against what we have on file */
2906 if (strlen(rsasecret) && strstr(p->methods, "rsa") && strlen(iaxs[callno]->challenge)) {
2907 if (strlen(p->inkeys)) {
2910 strncpy(tmpkeys, p->inkeys, sizeof(tmpkeys));
2912 keyn = strsep(&stringp, ":");
2914 key = ast_key_get(keyn, AST_KEY_PUBLIC);
2915 if (key && !ast_check_signature(key, iaxs[callno]->challenge, rsasecret)) {
2916 iaxs[callno]->state |= IAX_STATE_AUTHENTICATED;
2919 ast_log(LOG_WARNING, "requested inkey '%s' does not exist\n", keyn);
2920 keyn = strsep(&stringp, ":");
2923 ast_log(LOG_NOTICE, "Host %s failed RSA authentication with inkeys '%s'\n", peer, p->inkeys);
2929 ast_log(LOG_NOTICE, "Host '%s' trying to do RSA authentication, but we have no inkeys\n", peer);
2934 } else if (strlen(secret) && strstr(p->methods, "plaintext")) {
2935 /* They've provided a plain text password and we support that */
2936 if (strcmp(secret, p->secret)) {
2937 ast_log(LOG_NOTICE, "Host %s did not provide proper plaintext password for '%s'\n", inet_ntoa(sin->sin_addr), p->name);
2942 iaxs[callno]->state |= IAX_STATE_AUTHENTICATED;
2943 } else if (strlen(md5secret) && strstr(p->methods, "md5") && strlen(iaxs[callno]->challenge)) {
2944 struct MD5Context md5;
2945 unsigned char digest[16];
2947 MD5Update(&md5, iaxs[callno]->challenge, strlen(iaxs[callno]->challenge));
2948 MD5Update(&md5, p->secret, strlen(p->secret));
2949 MD5Final(digest, &md5);
2951 MYSNPRINTF "%2.2x", digest[x]);
2952 if (strcasecmp(requeststr, md5secret)) {
2953 ast_log(LOG_NOTICE, "Host %s failed MD5 authentication for '%s' (%s != %s)\n", inet_ntoa(sin->sin_addr), p->name, requeststr, md5secret);
2958 iaxs[callno]->state |= IAX_STATE_AUTHENTICATED;
2959 } else if (strlen(md5secret) || strlen(secret)) {
2960 ast_log(LOG_NOTICE, "Inappropriate authentication received\n");
2965 strncpy(iaxs[callno]->peer, peer, sizeof(iaxs[callno]->peer)-1);
2966 /* Choose lowest expirey number */
2967 if (expire && (expire < iaxs[callno]->expirey))
2968 iaxs[callno]->expirey = expire;
2975 static int authenticate(char *challenge, char *secret, char *keyn, char *methods, char *requeststr, int reqsize, struct sockaddr_in *sin)
2979 if (keyn && strlen(keyn)) {
2980 if (!strstr(methods, "rsa")) {
2981 if (!secret || !strlen(secret))
2982 ast_log(LOG_NOTICE, "Asked to authenticate to %s with an RSA key, but they don't allow RSA authentication\n", inet_ntoa(sin->sin_addr));
2983 } else if (!strlen(challenge)) {
2984 ast_log(LOG_NOTICE, "No challenge provided for RSA authentication to %s\n", inet_ntoa(sin->sin_addr));
2987 struct ast_key *key;
2988 key = ast_key_get(keyn, AST_KEY_PRIVATE);
2990 ast_log(LOG_NOTICE, "Unable to find private key '%s'\n", keyn);
2992 if (ast_sign(key, challenge, sig)) {
2993 ast_log(LOG_NOTICE, "Unable to sign challenge withy key\n");
2996 MYSNPRINTF2 "rsasecret=%s;", sig);
3003 if (res && secret && strlen(secret)) {
3004 if (strstr(methods, "md5") && strlen(challenge)) {
3005 struct MD5Context md5;
3006 unsigned char digest[16];
3008 MD5Update(&md5, challenge, strlen(challenge));
3009 MD5Update(&md5, secret, strlen(secret));
3010 MD5Final(digest, &md5);
3011 /* If they support md5, authenticate with it. */
3012 MYSNPRINTF2 "md5secret=");
3014 MYSNPRINTF2 "%2.2x", digest[x]);
3017 } else if (strstr(methods, "plaintext")) {
3018 MYSNPRINTF2 "secret=%s;", secret);
3021 ast_log(LOG_NOTICE, "No way to send secret to peer '%s' (their methods: %s)\n", inet_ntoa(sin->sin_addr), methods);
3026 static int authenticate_reply(struct chan_iax_pvt *p, struct sockaddr_in *sin, char *orequest, char *override, char *okey)
3028 struct iax_peer *peer;
3029 /* Start pessimistic */
3032 char methods[80] = "";
3033 char requeststr[256] = "";
3037 strncpy(request, orequest, sizeof(request)-1);
3039 var = strsep(&stringp, ";");
3041 value = strchr(var, '=');
3045 if (!strcmp(var, "username"))
3046 strncpy(p->username, value, sizeof(p->username)-1);
3047 else if (!strcmp(var, "challenge"))
3048 strncpy(p->challenge, value, sizeof(p->challenge)-1);
3049 else if (!strcmp(var, "methods"))
3050 strncpy(methods, value, sizeof(methods)-1);
3052 ast_log(LOG_WARNING, "Unknown variable '%s' with value '%