45 #include <sys/socket.h>
46 #include <netinet/in.h>
47 #include <arpa/inet.h>
48 #include <netinet/in_systm.h>
49 #include <netinet/ip.h>
51 #include <sys/signal.h>
231 #define SCHED_MULTITHREADED
235 #define DEBUG_SCHED_MULTITHREAD
239 static int nochecksums = 0;
242 #define PTR_TO_CALLNO(a) ((unsigned short)(unsigned long)(a))
243 #define CALLNO_TO_PTR(a) ((void *)(unsigned long)(a))
245 #define DEFAULT_THREAD_COUNT 10
246 #define DEFAULT_MAX_THREAD_COUNT 100
247 #define DEFAULT_RETRY_TIME 1000
248 #define MEMORY_SIZE 100
249 #define DEFAULT_DROP 3
251 #define DEBUG_SUPPORT
253 #define MIN_REUSE_TIME 60
260 static const char tdesc[] =
"Inter Asterisk eXchange Driver (Ver 2)";
265 #define MAX_TRUNK_MTU 1240
270 #define DEFAULT_CONTEXT "default"
289 #define MAX_TRUNKDATA 640 * 200
322 #define IAX_CAPABILITY_FULLBANDWIDTH 0xFFFF
324 #define IAX_CAPABILITY_MEDBANDWIDTH (IAX_CAPABILITY_FULLBANDWIDTH & \
325 ~AST_FORMAT_SLINEAR & \
326 ~AST_FORMAT_SLINEAR16 & \
327 ~AST_FORMAT_SIREN7 & \
328 ~AST_FORMAT_SIREN14 & \
334 #define IAX_CAPABILITY_LOWBANDWIDTH (IAX_CAPABILITY_MEDBANDWIDTH & \
336 ~AST_FORMAT_G726_AAL2 & \
339 #define IAX_CAPABILITY_LOWFREE (IAX_CAPABILITY_LOWBANDWIDTH & \
343 #define DEFAULT_MAXMS 2000
344 #define DEFAULT_FREQ_OK 60 * 1000
345 #define DEFAULT_FREQ_NOTOK 10 * 1000
348 #define IAX_CALLENCRYPTED(pvt) \
349 (ast_test_flag64(pvt, IAX_ENCRYPTED) && ast_test_flag64(pvt, IAX_KEYPOPULATED))
351 #define IAX_DEBUGDIGEST(msg, key) do { \
353 char digest[33] = ""; \
358 for (idx = 0; idx < 16; idx++) \
359 sprintf(digest + (idx << 1), "%2.2x", (unsigned) key[idx]); \
361 ast_log(LOG_NOTICE, msg " IAX_COMMAND_RTKEY to rotate key to '%s'\n", digest); \
367 #define DONT_RESCHEDULE -2
377 static int test_late = 0;
378 static int test_resync = 0;
379 static int test_jit = 0;
380 static int test_jitpct = 0;
407 #define IAX_HASCALLERID (uint64_t)(1 << 0)
408 #define IAX_DELME (uint64_t)(1 << 1)
409 #define IAX_TEMPONLY (uint64_t)(1 << 2)
410 #define IAX_TRUNK (uint64_t)(1 << 3)
411 #define IAX_NOTRANSFER (uint64_t)(1 << 4)
412 #define IAX_USEJITTERBUF (uint64_t)(1 << 5)
413 #define IAX_DYNAMIC (uint64_t)(1 << 6)
414 #define IAX_SENDANI (uint64_t)(1 << 7)
415 #define IAX_RTSAVE_SYSNAME (uint64_t)(1 << 8)
416 #define IAX_ALREADYGONE (uint64_t)(1 << 9)
417 #define IAX_PROVISION (uint64_t)(1 << 10)
418 #define IAX_QUELCH (uint64_t)(1 << 11)
419 #define IAX_ENCRYPTED (uint64_t)(1 << 12)
420 #define IAX_KEYPOPULATED (uint64_t)(1 << 13)
421 #define IAX_CODEC_USER_FIRST (uint64_t)(1 << 14)
422 #define IAX_CODEC_NOPREFS (uint64_t)(1 << 15)
423 #define IAX_CODEC_NOCAP (uint64_t)(1 << 16)
424 #define IAX_RTCACHEFRIENDS (uint64_t)(1 << 17)
425 #define IAX_RTUPDATE (uint64_t)(1 << 18)
426 #define IAX_RTAUTOCLEAR (uint64_t)(1 << 19)
427 #define IAX_FORCEJITTERBUF (uint64_t)(1 << 20)
428 #define IAX_RTIGNOREREGEXPIRE (uint64_t)(1 << 21)
429 #define IAX_TRUNKTIMESTAMPS (uint64_t)(1 << 22)
430 #define IAX_TRANSFERMEDIA (uint64_t)(1 << 23)
431 #define IAX_MAXAUTHREQ (uint64_t)(1 << 24)
432 #define IAX_DELAYPBXSTART (uint64_t)(1 << 25)
433 #define IAX_ALLOWFWDOWNLOAD (uint64_t)(1 << 26)
434 #define IAX_IMMEDIATE (uint64_t)(1 << 27)
435 #define IAX_SENDCONNECTEDLINE (uint64_t)(1 << 28)
436 #define IAX_RECVCONNECTEDLINE (uint64_t)(1 << 29)
437 #define IAX_FORCE_ENCRYPT (uint64_t)(1 << 30)
438 #define IAX_SHRINKCALLERID (uint64_t)(1 << 31)
545 #define IAX2_TRUNK_PREFACE (sizeof(struct iax_frame) + sizeof(struct ast_iax2_meta_hdr) + sizeof(struct ast_iax2_meta_trunk_hdr))
610 struct sockaddr_in us;
618 #define MIN_RETRY_TIME 100
619 #define MAX_RETRY_TIME 10000
621 #define MAX_JITTER_BUFFER 50
622 #define MIN_JITTER_BUFFER 10
624 #define DEFAULT_TRUNKDATA 640 * 10
626 #define MAX_TIMESTAMP_SKEW 160
629 #define TS_GAP_FOR_JB_RESYNC 5000
632 #define MARK_IAX_SUBCLASS_TX 0x8000
678 unsigned int notsilenttx:1;
704 struct timeval offset;
706 struct timeval rxcore;
786 unsigned char semirand[32];
788 struct iax2_registry *
reg;
836 unsigned char calltoken_ie_len;
881 #define MAX_PEER_BUCKETS 17
883 #define MAX_PEER_BUCKETS 563
887 #define MAX_USER_BUCKETS MAX_PEER_BUCKETS
966 struct timeval expiry;
999 unsigned char buf[1];
1006 #ifdef SCHED_MULTITHREADED
1007 void (*schedfunc)(
const void *);
1010 #ifdef DEBUG_SCHED_MULTITHREAD
1016 struct sockaddr_in iosin;
1017 unsigned char readbuf[4096];
1033 struct sockaddr_in sin;
1098 #define TRUNK_CALL_START (IAX_MAX_CALLS / 2)
1109 debugaddr.sin_addr.s_addr == sin->sin_addr.s_addr)) {
1136 va_start(args, fmt);
1137 vsnprintf(buf,
sizeof(buf), fmt, args);
1148 va_start(args, fmt);
1149 vsnprintf(buf,
sizeof(buf), fmt, args);
1160 va_start(args, fmt);
1161 vsnprintf(buf,
sizeof(buf), fmt, args);
1179 static int iax2_provision(
struct sockaddr_in *end,
int sockfd,
const char *dest,
const char *
template,
int force);
1190 static int send_trunk(
struct iax2_trunk_peer *tpeer,
struct timeval *now);
1194 static int send_command_locked(
unsigned short callno,
char,
int,
unsigned int,
const unsigned char *,
int,
int);
1218 .description =
tdesc,
1263 if (!iaxs[callno] || !iaxs[callno]->owner) {
1294 if (subtype == -1) {
1368 if (!network_change_event_subscription) {
1376 if (network_change_event_subscription) {
1383 struct iax2_registry *reg;
1384 network_change_event_sched_id = -1;
1396 ast_debug(1,
"IAX, got a network change event, renewing all IAX registrations.\n");
1397 if (network_change_event_sched_id == -1) {
1409 "Channel: %s\r\nChanneltype: IAX2\r\nIAX2-callno-local: %d\r\nIAX2-callno-remote: %d\r\nIAX2-peer: %s\r\n",
1415 .
type =
"IAX2_VARIABLE",
1479 struct iax2_thread *
thread = NULL;
1543 #ifdef SCHED_MULTITHREADED
1544 static int __schedule_action(
void (*func)(
const void *data),
const void *data,
const char *funcname)
1546 struct iax2_thread *
thread;
1547 static time_t lasterror;
1551 if (thread != NULL) {
1555 #ifdef DEBUG_SCHED_MULTITHREAD
1562 if (t != lasterror) {
1564 ast_debug(1,
"Out of idle IAX2 threads for scheduling! (%s)\n", funcname);
1569 #define schedule_action(func, data) __schedule_action(func, data, __PRETTY_FUNCTION__)
1590 int callno = (long) data;
1595 if (iaxs[callno]->peercallno) {
1602 ast_debug(1,
"I was supposed to send a PING with callno %d, but no such call exists.\n", callno);
1610 int callno = (long) data;
1617 #ifdef SCHED_MULTITHREADED
1644 if (!strcasecmp(s,
"aes128"))
1657 int callno = (long) data;
1662 if (iaxs[callno]->peercallno) {
1669 ast_debug(1,
"I was supposed to send a LAGRQ with callno %d, but no such call exists.\n", callno);
1677 int callno = (long) data;
1684 #ifdef SCHED_MULTITHREADED
1700 if (subclass & (1LL << x)) {
1740 struct iax2_peer *peer = obj, *peer2 = arg;
1779 if(!peer && realtime)
1825 struct sockaddr_in peer_addr;
1829 if ((peer_addr.sin_addr.s_addr == sin.sin_addr.s_addr) &&
1830 (peer_addr.sin_port == sin.sin_port)) {
1915 struct signaling_queue_entry *s = NULL;
1928 struct signaling_queue_entry *qe;
1932 }
else if (!(qe =
ast_calloc(1,
sizeof(
struct signaling_queue_entry)))) {
1955 struct signaling_queue_entry *s = NULL;
2045 memcpy(
new, fr,
sizeof(*
new));
2071 if ((cur->
addr.sin_addr.s_addr == sin->sin_addr.s_addr) &&
2072 (cur->
addr.sin_port == sin->sin_port)) {
2075 (check_dcallno ? dcallno == cur->
callno : 1) ) {
2080 if ((cur->
transfer.sin_addr.s_addr == sin->sin_addr.s_addr) &&
2092 static int maxnontrunkcall = 1;
2094 #define update_max_trunk() __update_max_trunk()
2095 #define update_max_nontrunk() __update_max_nontrunk()
2097 static void __update_max_trunk(
void)
2111 ast_debug(1,
"New max trunk callno is %d\n", max);
2114 static void __update_max_nontrunk(
void)
2123 maxnontrunkcall = max;
2125 ast_debug(1,
"New max nontrunk callno is %d\n", max);
2130 #define update_max_trunk() do { } while (0)
2131 #define update_max_nontrunk() do { } while (0)
2140 if (iaxs[callno]->oseqno) {
2144 if (callno >= TRUNK_CALL_START) {
2154 x = callno_entry->
callno;
2169 if (iaxs[x]->callno_entry) {
2177 ping_time * 1000,
send_ping, (
void *)(
long)x);
2179 lagrq_time * 1000,
send_lagrq, (
void *)(
long)x);
2187 ast_debug(1,
"Made call %d into trunk call %d\n", callno, x);
2197 ast_log(
LOG_ERROR,
"This should not be called without a transfer call number.\n");
2201 ao2_link(iax_transfercallno_pvts, pvt);
2207 ast_log(
LOG_ERROR,
"This should not be called without a transfer call number.\n");
2216 ast_log(
LOG_ERROR,
"This should not be called without a peer call number.\n");
2220 ao2_link(iax_peercallno_pvts, pvt);
2226 ast_log(
LOG_ERROR,
"This should not be called without a peer call number.\n");
2243 struct sockaddr_in sin;
2245 return abs((
int) sin.sin_addr.s_addr);
2259 return abs((
int) peercnt->
addr);
2264 struct peercnt *peercnt1 = obj, *peercnt2 = arg;
2271 struct sockaddr_in *sin = arg;
2272 struct sockaddr_in ha_netmask_sin;
2273 struct sockaddr_in ha_addr_sin;
2278 if ((sin->sin_addr.s_addr & ha_netmask_sin.sin_addr.s_addr) == ha_addr_sin.sin_addr.s_addr) {
2295 const char *find =
S_OR(name,
"guest");
2329 ast_debug(1,
"Determining if address %s with username %s requires calltoken validation. Optional = %d calltoken_required = %u\n",
ast_inet_ntoa(sin->sin_addr), name, optional, calltoken_required);
2352 struct sockaddr_in sin = {
2353 .sin_addr.s_addr = peercnt->
addr,
2357 if (peercnt->
reg && peercnt->
limit) {
2362 limit = addr_range->
limit;
2367 peercnt->
limit = limit;
2379 ast_debug(1,
"Reset limits for peercnts table\n");
2403 struct peercnt tmp = {
2406 struct sockaddr_in sin;
2410 tmp.
addr = sin.sin_addr.s_addr;
2415 peercnt->
limit = limit;
2435 unsigned long addr = sin->sin_addr.s_addr;
2437 struct peercnt tmp = {
2450 }
else if ((peercnt =
ao2_alloc(
sizeof(*peercnt), NULL))) {
2464 if (peercnt->
limit > peercnt->
cur) {
2486 struct sockaddr_in sin = {
2487 .sin_addr.s_addr = peercnt->
addr,
2500 if (peercnt->
cur == 0) {
2527 struct peercnt tmp = {
2528 .
addr = sin->sin_addr.s_addr,
2545 struct addr_range tmp;
2551 for (; v; v = v->
next) {
2559 ast_log(
LOG_ERROR,
"Call number limit for %s could not be added, Invalid address range\n.", v->
name);
2561 }
else if ((sscanf(v->
value,
"%d", &limit) != 1) || (limit < 0)) {
2572 }
else if (!(addr_range =
ao2_alloc(
sizeof(*addr_range), NULL))) {
2580 addr_range->
limit = limit;
2581 addr_range->
delme = 0;
2587 ao2_link(callno_limits, addr_range);
2601 struct ast_ha *ha = NULL;
2621 addr_range->
delme = 0;
2623 }
else if ((addr_range =
ao2_alloc(
sizeof(*addr_range), NULL))) {
2626 ao2_link(calltoken_ignores, addr_range);
2642 struct sockaddr_in sin;
2647 e->
command =
"iax2 show callnumber usage";
2649 "Usage: iax2 show callnumber usage [IP address]\n"
2650 " Shows current IP addresses which are consuming iax2 call numbers\n";
2659 ast_cli(a->
fd,
"%-15s %-12s %-12s\n",
"Address",
"Callno Usage",
"Callno Limit");
2664 sin.sin_addr.s_addr = peercnt->
addr;
2667 ast_cli(a->
fd,
"%-15s %-12s %-12s\n",
"Address",
"Callno Usage",
"Callno Limit");
2681 ast_cli(a->
fd,
"\nNon-CallToken Validation Callno Limit: %d\n"
2682 "Non-CallToken Validated Callno Used: %d\n",
2683 global_maxcallno_nonval,
2684 total_nonval_callno_used);
2686 ast_cli(a->
fd,
"Total Available Callno: %d\n"
2687 "Regular Callno Available: %d\n"
2688 "Trunk Callno Available: %d\n",
2692 }
else if (a->
argc == 5 && !found) {
2693 ast_cli(a->
fd,
"No call number table entries for %s found\n", a->
argv[4] );
2719 if (!validated && (total_nonval_callno_used >= global_maxcallno_nonval)) {
2720 ast_log(
LOG_WARNING,
"NON-CallToken callnumber limit is reached. Current:%d Max:%d\n", total_nonval_callno_used, global_maxcallno_nonval);
2732 total_nonval_callno_used++;
2737 return callno_entry;
2748 if (!callno_entry->
validated && (total_nonval_callno_used != 0)) {
2749 total_nonval_callno_used--;
2750 }
else if (!callno_entry->
validated && (total_nonval_callno_used == 0)) {
2751 ast_log(
LOG_ERROR,
"Attempted to decrement total non calltoken validated callnumbers below zero... Callno is:%d \n", callno_entry->
callno);
2754 if (callno_entry->
callno < TRUNK_CALL_START) {
2755 ao2_link(callno_pool, callno_entry);
2757 ao2_link(callno_pool_trunk, callno_entry);
2786 if (!(callno_entry =
ao2_alloc(
sizeof(*callno_entry), NULL))) {
2790 callno_entry->
callno = i;
2792 if (i < TRUNK_CALL_START) {
2793 ao2_link(callno_pool, callno_entry);
2795 ao2_link(callno_pool_trunk, callno_entry);
2816 struct peercnt tmp = {
2817 .
addr = sin->sin_addr.s_addr,
2862 static int __find_callno(
unsigned short callno,
unsigned short dcallno,
struct sockaddr_in *sin,
int new,
int sockfd,
int return_locked,
int check_dcallno)
2868 int validated = (
new >
NEW_ALLOW) ? 1 : 0;
2877 .transfercallno =
callno,
2879 .frames_received = check_dcallno,
2882 memcpy(&tmp_pvt.
addr, sin,
sizeof(tmp_pvt.
addr));
2885 if (return_locked) {
2894 memset(&tmp_pvt.
addr, 0,
sizeof(tmp_pvt.
addr));
2897 if (return_locked) {
2911 if (callno && dcallno && iaxs[dcallno] && !iaxs[dcallno]->
peercallno &&
match(sin, callno, dcallno, iaxs[dcallno], check_dcallno)) {
2915 if (!res || !return_locked) {
2935 for (x = 1; !res && x < maxnontrunkcall; x++) {
2939 if (
match(sin, callno, dcallno, iaxs[x], check_dcallno)) {
2943 if (!res || !return_locked)
2946 for (x = TRUNK_CALL_START; !res && x < maxtrunkcall; x++) {
2950 if (
match(sin, callno, dcallno, iaxs[x], check_dcallno)) {
2954 if (!res || !return_locked)
2968 snprintf(host,
sizeof(host),
"%s:%d",
ast_inet_ntoa(sin->sin_addr), ntohs(sin->sin_port));
2983 x = callno_entry->
callno;
2990 ast_debug(1,
"Creating new call structure %d\n", x);
2993 iaxs[x]->
addr.sin_port = sin->sin_port;
2994 iaxs[x]->
addr.sin_family = sin->sin_family;
2995 iaxs[x]->
addr.sin_addr.s_addr = sin->sin_addr.s_addr;
3009 if (iaxs[x]->peercallno) {
3025 static int find_callno(
unsigned short callno,
unsigned short dcallno,
struct sockaddr_in *sin,
int new,
int sockfd,
int full_frame) {
3026 return __find_callno(callno, dcallno, sin,
new, sockfd, 0, full_frame);
3031 return __find_callno(callno, dcallno, sin,
new, sockfd, 1, full_frame);
3047 if (iaxs[callno] && iaxs[callno]->owner) {
3070 if (iaxs[callno] && iaxs[callno]->owner) {
3094 if (iaxs[callno] && iaxs[callno]->owner) {
3113 struct iax_firmware *cur = NULL;
3114 int ifd,
fd, res,
len, chunk;
3117 unsigned char sum[16], buf[1024];
3122 last = strrchr(s,
'/');
3128 snprintf(s2, strlen(s) + 100,
"/var/tmp/%s-%ld", last,
ast_random());
3130 if ((res = stat(s, &stbuf) < 0)) {
3136 if (S_ISDIR(stbuf.st_mode))
3138 ifd = open(s, O_RDONLY);
3153 len = stbuf.st_size;
3156 if (chunk >
sizeof(buf))
3157 chunk =
sizeof(
buf);
3158 res = read(ifd, buf, chunk);
3165 res = write(fd, buf, chunk);
3176 lseek(fd, 0, SEEK_SET);
3177 if ((res = read(fd, &fwh2,
sizeof(fwh2))) !=
sizeof(fwh2)) {
3187 if (ntohl(fwh2.
datalen) != (stbuf.st_size -
sizeof(fwh2))) {
3198 if (fwh == MAP_FAILED) {
3206 if (memcmp(sum, fwh->
chksum,
sizeof(sum))) {
3208 munmap((
void*)fwh, stbuf.st_size);
3221 munmap((
void*)fwh, stbuf.st_size);
3227 if (!cur && ((cur =
ast_calloc(1,
sizeof(*cur))))) {
3249 struct iax_firmware *cur = NULL;
3256 if (!strcmp(dev, (
char *)cur->
fwh->
devname)) {
3269 unsigned int bs = desc & 0xff;
3270 unsigned int start = (desc >> 8) & 0xffffff;
3272 struct iax_firmware *cur;
3281 if (strcmp((
char *)dev, (
char *)cur->
fwh->
devname))
3307 struct iax_firmware *cur = NULL;
3310 char dir[256], fn[256];
3323 while((de = readdir(fwd))) {
3324 if (de->d_name[0] !=
'.') {
3325 snprintf(fn,
sizeof(fn),
"%s/%s", dir, de->d_name);
3327 ast_verb(2,
"Loaded firmware '%s'\n", de->d_name);
3377 struct sockaddr_in *sin;
3380 struct sock_extended_err e;
3385 m.msg_controllen =
sizeof(e);
3387 res = recvmsg(
netsocket, &m, MSG_ERRQUEUE);
3391 if (m.msg_controllen) {
3392 sin = (
struct sockaddr_in *)SO_EE_OFFENDER(&e);
3408 res = sendto(sockfd, f->
data, f->
datalen, 0,(
struct sockaddr *)sin,
3424 if (!callno || !iaxs[callno] || iaxs[callno]->error)
3436 res = sendto(iaxs[callno]->
sockfd, f->
data, f->
datalen, 0,(
struct sockaddr *)&iaxs[callno]->
addr,
sizeof(iaxs[callno]->
addr));
3465 if ((c = pvt->
owner)) {
3481 if ((pvt = iaxs[callno])) {
3494 owner = pvt ? pvt->
owner : NULL;
3498 ast_debug(3,
"Avoiding IAX destroy deadlock\n");
3505 iaxs[callno] = NULL;
3536 if (callno & TRUNK_CALL_START) {
3579 if (callno && iaxs[callno]) {
3583 }
else if (f->
retries >= max_retries) {
3588 }
else if (f->
final) {
3591 if (iaxs[callno]->owner) {
3592 ast_log(
LOG_WARNING,
"Max retries exceeded to host %s on %s (type = %u, subclass = %d, ts=%u, seqno=%d)\n",
3601 if (iaxs[callno]->owner) {
3606 if (iaxs[callno] && iaxs[callno]->owner)
3609 if (iaxs[callno]->reg) {
3610 memset(&iaxs[callno]->reg->us, 0,
sizeof(iaxs[callno]->
reg->
us));
3646 }
else if (callno) {
3653 #ifdef SCHED_MULTITHREADED
3664 static const char *
const choices[] = {
"all", NULL };
3669 e->
command =
"iax2 prune realtime";
3671 "Usage: iax2 prune realtime [<peername>|all]\n"
3672 " Prunes object(s) from the cache\n";
3685 if (!strcmp(a->
argv[3],
"all")) {
3688 ast_cli(a->
fd,
"Cache flushed successfully.\n");
3698 ast_cli(a->
fd,
"Peer %s was removed from the cache.\n", a->
argv[3]);
3700 ast_cli(a->
fd,
"Peer %s is not eligible for this operation.\n", a->
argv[3]);
3707 ast_cli(a->
fd,
"User %s was removed from the cache.\n", a->
argv[3]);
3709 ast_cli(a->
fd,
"User %s is not eligible for this operation.\n", a->
argv[3]);
3715 ast_cli(a->
fd,
"%s was not found in the cache.\n", a->
argv[3]);
3725 e->
command =
"iax2 test losspct";
3727 "Usage: iax2 test losspct <percentage>\n"
3728 " For testing, throws away <percentage> percent of incoming packets\n";
3736 test_losspct = atoi(a->
argv[3]);
3746 e->
command =
"iax2 test late";
3748 "Usage: iax2 test late <ms>\n"
3749 " For testing, count the next frame as <ms> ms late\n";
3758 test_late = atoi(a->
argv[3]);
3767 e->
command =
"iax2 test resync";
3769 "Usage: iax2 test resync <ms>\n"
3770 " For testing, adjust all future frames by <ms> ms\n";
3779 test_resync = atoi(a->
argv[3]);
3788 e->
command =
"iax2 test jitter";
3790 "Usage: iax2 test jitter <ms> <pct>\n"
3791 " For testing, simulate maximum jitter of +/- <ms> on <pct>\n"
3792 " percentage of packets. If <pct> is not specified, adds\n"
3793 " jitter to all packets.\n";
3802 test_jit = atoi(a->
argv[3]);
3804 test_jitpct = atoi(a->
argv[4]);
3819 snprintf(status, statuslen,
"LAGGED (%d ms)", peer->
lastms);
3821 }
else if (peer->
lastms) {
3822 snprintf(status, statuslen,
"OK (%d ms)", peer->
lastms);
3840 char codec_buf[512];
3842 int x = 0, codec = 0, load_realtime = 0;
3846 e->
command =
"iax2 show peer";
3848 "Usage: iax2 show peer <name>\n"
3849 " Display details on specific IAX peer\n";
3860 load_realtime = (a->
argc == 5 && !strcmp(a->
argv[4],
"load")) ? 1 : 0;
3864 struct sockaddr_in peer_addr;
3882 ast_cli(a->
fd,
" ACL : %s\n", (peer->
ha ?
"Yes" :
"No"));
3883 ast_cli(a->
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));
3891 for(x = 0; x < 32 ; x++) {
3923 int wordlen = strlen(word);
3928 if (!strncasecmp(peer->
name, word, wordlen) && ++which > state
3944 int cnt = 0, dead = 0,
final = 0, i = 0;
3948 e->
command =
"iax2 show stats";
3950 "Usage: iax2 show stats\n"
3951 " Display statistics on IAX channel driver.\n";
3973 ast_cli(a->
fd,
"---------------------\n");
3975 ast_cli(a->
fd,
"%d timed and %d untimed transmits; MTU %d/%d/%d\n", trunk_timed, trunk_untimed,
3976 trunk_maxmtu, trunk_nmaxmtu, global_max_trunk_mtu);
3977 ast_cli(a->
fd,
"Packets in transmit queue: %d dead, %d final, %d total\n\n", dead,
final, cnt);
3979 trunk_timed = trunk_untimed = 0;
3980 if (trunk_maxmtu > trunk_nmaxmtu)
3995 "Usage: iax2 set mtu <value>\n"
3996 " Set the system-wide IAX IP mtu to <value> bytes net or\n"
3997 " zero to disable. Disabling means that the operating system\n"
3998 " must handle fragmentation of UDP packets when the IAX2 trunk\n"
3999 " packet exceeds the UDP payload size. This is substantially\n"
4000 " below the IP mtu. Try 1240 on ethernets. Must be 172 or\n"
4001 " greater for G.711 samples.\n";
4009 if (strncasecmp(a->
argv[3],
"default", strlen(a->
argv[3])) == 0)
4012 mtuv = atoi(a->
argv[3]);
4015 ast_cli(a->
fd,
"Trunk MTU control disabled (mtu was %d)\n", global_max_trunk_mtu);
4016 global_max_trunk_mtu = 0;
4019 if (mtuv < 172 || mtuv > 4000) {
4020 ast_cli(a->
fd,
"Trunk MTU must be between 172 and 4000\n");
4023 ast_cli(a->
fd,
"Trunk MTU changed from %d to %d\n", global_max_trunk_mtu, mtuv);
4024 global_max_trunk_mtu = mtuv;
4031 char tmp[1024], *pc = NULL;
4037 e->
command =
"iax2 show cache";
4039 "Usage: iax2 show cache\n"
4040 " Display currently cached IAX Dialplan results.\n";
4048 ast_cli(a->
fd,
"%-20.20s %-12.12s %-9.9s %-8.8s %s\n",
"Peer/Context",
"Exten",
"Exp.",
"Wait.",
"Flags");
4051 s = dp->
expiry.tv_sec - now.tv_sec;
4054 strncat(tmp,
"EXISTS|",
sizeof(tmp) - strlen(tmp) - 1);
4056 strncat(tmp,
"NONEXISTENT|",
sizeof(tmp) - strlen(tmp) - 1);
4058 strncat(tmp,
"CANEXIST|",
sizeof(tmp) - strlen(tmp) - 1);
4060 strncat(tmp,
"PENDING|",
sizeof(tmp) - strlen(tmp) - 1);
4062 strncat(tmp,
"TIMEOUT|",
sizeof(tmp) - strlen(tmp) - 1);
4064 strncat(tmp,
"TRANSMITTED|",
sizeof(tmp) - strlen(tmp) - 1);
4066 strncat(tmp,
"MATCHMORE|",
sizeof(tmp) - strlen(tmp) - 1);
4068 strncat(tmp,
"UNKNOWN|",
sizeof(tmp) - strlen(tmp) - 1);
4071 tmp[strlen(tmp) - 1] =
'\0';
4087 ast_cli(a->
fd,
"%-20.20s %-12.12s %-9d %-8d %s\n", pc, dp->
exten, s, y, tmp);
4089 ast_cli(a->
fd,
"%-20.20s %-12.12s %-9.9s %-8d %s\n", pc, dp->
exten,
"(expired)", y, tmp);
4105 const int lower_mask = (1 << ts_shift) - 1;
4106 const int upper_mask = ~lower_mask;
4107 const int last_upper = iaxs[fr->
callno]->
last & upper_mask;
4109 if ( (fr->
ts & upper_mask) == last_upper ) {
4111 const int threshold = (ts_shift == 15) ? 25000 : 50000;
4113 if (x < -threshold) {
4118 fr->
ts = (last_upper + (1 << ts_shift)) | (fr->
ts & lower_mask);
4120 ast_debug(1,
"schedule_delivery: pushed forward timestamp\n");
4121 }
else if (x > threshold) {
4126 fr->
ts = (last_upper - (1 << ts_shift)) | (fr->
ts & lower_mask);
4128 ast_debug(1,
"schedule_delivery: pushed back timestamp\n");
4177 now.tv_usec += 1000;
4198 af.
src =
"IAX2 JB interpolation";
4230 #ifdef SCHED_MULTITHREADED
4268 ast_debug(1,
"schedule_delivery: set delivery to 0 as we don't have an rxcore yet, or frame is from trunk.\n");
4395 0, 0, (
unsigned char *)text, strlen(text) + 1, -1);
4429 time_t regseconds = 0, nowtime;
4438 sprintf(porta,
"%d", ntohs(sin->sin_port));
4442 for (tmp = var; tmp; tmp = tmp->
next) {
4443 if (!strcasecmp(tmp->
name,
"name"))
4444 peername = tmp->
value;
4448 if (!var && peername) {
4457 for (tmp = var; tmp; tmp = tmp->
next) {
4458 if (!strcasecmp(tmp->
name,
"host")) {
4481 for (tmp = var; tmp; tmp = tmp->
next) {
4483 if (!strcasecmp(tmp->
name,
"type")) {
4484 if (strcasecmp(tmp->
value,
"friend") &&
4485 strcasecmp(tmp->
value,
"peer")) {
4490 }
else if (!strcasecmp(tmp->
name,
"regseconds")) {
4492 }
else if (!strcasecmp(tmp->
name,
"ipaddr")) {
4496 }
else if (!strcasecmp(tmp->
name,
"port")) {
4498 }
else if (!strcasecmp(tmp->
name,
"host")) {
4499 if (!strcasecmp(tmp->
value,
"dynamic"))
4532 memset(&peer->
addr, 0,
sizeof(peer->
addr));
4534 ast_debug(1,
"realtime_peer: Bah, '%s' is expired (%d/%d/%d)!\n",
4535 peername, (
int)(nowtime - regseconds), (
int)regseconds, (
int)nowtime);
4538 ast_debug(1,
"realtime_peer: Registration for '%s' still active (%d/%d/%d)!\n",
4539 peername, (
int)(nowtime - regseconds), (
int)regseconds, (
int)nowtime);
4557 snprintf(porta,
sizeof(porta),
"%d", ntohs(sin->sin_port));
4571 for (tmp = var; tmp; tmp = tmp->
next) {
4572 if (!strcasecmp(tmp->
name,
"host")) {
4591 if (!strcasecmp(tmp->
name,
"type")) {
4592 if (strcasecmp(tmp->
value,
"friend") &&
4593 strcasecmp(tmp->
value,
"user")) {
4620 char regseconds[20];
4622 char *syslabel = NULL;
4627 syslabel =
"regserver";
4629 snprintf(regseconds,
sizeof(regseconds),
"%d", (
int)regtime);
4633 "regseconds", regseconds, syslabel, sysname,
SENTINEL);
4662 struct sockaddr_in peer_addr;
4667 sin->sin_family = AF_INET;
4673 sin_tmp.
ss.ss_family = AF_INET;
4679 if (sin->sin_port == 0) {
4684 memcpy(&ourprefs, &
prefs,
sizeof(ourprefs));
4696 if (!(peer_addr.sin_addr.s_addr || peer->
defaddr.sin_addr.s_addr)) {
4710 memcpy(&ourprefs, &peer->
prefs,
sizeof(ourprefs));
4733 key = strchr(family,
'/');
4742 if (peer_addr.sin_addr.s_addr) {
4743 sin->sin_addr = peer_addr.sin_addr;
4744 sin->sin_port = peer_addr.sin_port;
4746 sin->sin_addr = peer->
defaddr.sin_addr;
4747 sin->sin_port = peer->
defaddr.sin_port;
4764 iaxs[callno]->
initid = -1;
4773 #ifdef SCHED_MULTITHREADED
4786 tmp = (tm.
tm_sec >> 1) & 0x1f;
4787 tmp |= (tm.
tm_min & 0x3f) << 5;
4788 tmp |= (tm.
tm_hour & 0x1f) << 11;
4789 tmp |= (tm.
tm_mday & 0x1f) << 16;
4790 tmp |= ((tm.
tm_mon + 1) & 0xf) << 21;
4791 tmp |= ((tm.
tm_year - 100) & 0x7f) << 25;
4807 struct sockaddr_in *sin,
int command,
int ts,
unsigned char seqno,
4818 memcpy(&data.ied, ied->
buf, ied->
pos);
4821 data.f.scallno = htons(0x8000 | callno);
4823 data.f.ts = htonl(ts);
4824 data.f.iseqno = seqno;
4831 return sendto(sockfd, &data, size, 0, (
struct sockaddr *)sin,
sizeof(*sin));
4837 if (pvt && ied && (2 < ((
int)
sizeof(ied->
buf) - ied->
pos))) {
4839 ied->
buf[ied->
pos++] = 0;
4876 (f->
datalen >
sizeof(data))) {
4896 data.ied.pos = ie_data_pos;
4967 struct sockaddr_in *sin,
int fd)
4969 #define CALLTOKEN_HASH_FORMAT "%s%d%u%d"
4970 #define CALLTOKEN_IE_FORMAT "%u?%s"
4972 time_t t = time(NULL);
4995 char *rec_hash = NULL;
4996 char *rec_ts = NULL;
4997 unsigned int rec_time;
5007 if (!rec_hash || !rec_ts) {
5009 }
else if (sscanf(rec_ts,
"%u", &rec_time) != 1) {
5018 if (strcmp(hash, rec_hash)) {
5021 }
else if ((t < rec_time) || ((t - rec_time) >= MAX_CALLTOKEN_DELAY)) {
5034 ast_log(
LOG_ERROR,
"Call rejected, CallToken Support required. If unexpected, resolve by placing address %s in the calltokenoptional list or setting user %s requirecalltoken=no\n",
ast_inet_ntoa(sin->sin_addr),
S_OR(ies->
username,
"guest"));
5084 if (strchr(pds->
peer,
'@')) {
5111 struct sockaddr_in sin;
5112 char *l=NULL, *n=NULL, *tmpstr;
5114 char *defaultrdest =
"s";
5120 const char* osp_token_ptr;
5121 unsigned int osp_token_length;
5122 unsigned char osp_block_index;
5123 unsigned int osp_block_length;
5124 unsigned char osp_buffer[256];
5131 memset(&cai, 0,
sizeof(cai));
5134 memset(&pds, 0,
sizeof(pds));
5143 pds.
exten = defaultrdest;
5155 ast_log(
LOG_WARNING,
"Call terminated. No secret given and force encrypt enabled\n");
5171 sin.sin_port = htons(atoi(pds.
port));
5177 memset(&ied, 0,
sizeof(ied));
5258 if (iaxs[callno]->maxtime) {
5262 }
else if (autokill) {
5263 iaxs[callno]->
pingtime = autokill / 2;
5271 osp_block_index = 0;
5272 while (osp_token_length > 0) {
5274 osp_buffer[0] = osp_block_index;
5275 memcpy(osp_buffer + 1, osp_token_ptr, osp_block_length);
5278 osp_token_ptr += osp_block_length;
5279 osp_token_length -= osp_block_length;
5283 }
else if (iaxdebug)
5284 ast_debug(1,
"OSP token is undefined\n");
5290 if (variablestore) {
5292 ast_debug(1,
"Found an IAX variable store on this channel\n");
5322 memset(&ied, 0,
sizeof(ied));
5324 if (callno && iaxs[callno]) {
5329 if (!iaxs[callno]->error && !alreadygone) {
5333 if (!iaxs[callno]) {
5341 if (iaxs[callno] && alreadygone) {
5344 }
else if (iaxs[callno]) {
5346 ast_log(
LOG_ERROR,
"Unable to schedule iax2 callno %d destruction?!! Destroying immediately.\n", callno);
5367 unsigned short callno = pvt->
callno;
5403 if ((*(
int *) data)) {
5435 if (!(h =
ast_malloc(datalen +
sizeof(*h)))) {
5440 h->option = htons(option);
5441 memcpy(h->
data, data, datalen);
5444 datalen +
sizeof(*h), -1);
5475 ast_debug(1,
"I should never be called!\n");
5493 snprintf(key,
sizeof(key),
"%lX", (
unsigned long)
ast_random());
5496 MD5Update(&md5, (
unsigned char *) key, strlen(key));
5497 MD5Final((
unsigned char *) key, &md5);
5517 unsigned int transferid = (
unsigned int)
ast_random();
5520 ast_debug(1,
"transfers are not supported for encrypted calls at this time\n");
5526 memset(&ied0, 0,
sizeof(ied0));
5531 memset(&ied1, 0,
sizeof(ied1));
5547 static void lock_both(
unsigned short callno0,
unsigned short callno1)
5555 static void unlock_both(
unsigned short callno0,
unsigned short callno1)
5567 int transferstarted=0;
5571 struct timeval waittimer = {0, 0};
5574 if (timeoutms > 0) {
5581 if (!iaxs[callno0] || !iaxs[callno1]) {
5597 if ((c0->
tech != &iax2_tech) || (c1->
tech != &iax2_tech)) {
5598 ast_verb(3,
"Can't masquerade, we're different...\n");
5600 if (c0->
tech == &iax2_tech) {
5605 if (c1->
tech == &iax2_tech) {
5617 ast_verb(3,
"Operating with different codecs [%s] [%s] , can't native bridge...\n", buf0, buf1);
5633 transferstarted = 1;
5656 if (timeoutms > -1) {
5657 timeoutms -= (1000 - to);
5679 other = (who == c0) ? c1 : c0;
5708 if (flags & monitored_source) {
5750 ast_debug(1,
"Indicating condition %d\n", condition);
5760 switch (condition) {
5777 ast_debug(2,
"Callno %d: Config blocked sending control frame %d.\n",
5799 context = strchr(tmp,
'@');
5820 struct sockaddr_in peer_addr;
5824 if ((peer_addr.sin_addr.s_addr == sin.sin_addr.s_addr) &&
5825 (peer_addr.sin_port == sin.sin_port)) {
5844 if (!(i = iaxs[callno])) {
5851 tmp =
ast_channel_alloc(1, state, i->
cid_num, i->
cid_name, i->
accountcode, i->
exten, i->
context, linkedid, i->
amaflags,
"IAX2/%s-%d", i->
host, i->
callno);
5853 if (i != iaxs[callno]) {
5913 for (v = i->
vars ; v ; v = v->
next)
5920 ast_debug(1,
"Loading up the channel with IAXVARs\n");
5923 if (variablestore && varlist) {
5924 variablestore->
data = varlist;
5934 ast_log(
LOG_ERROR,
"Memory allocation error while processing IAX2 variables\n");
5944 if (variablestore) {
5966 static unsigned int calc_txpeerstamp(
struct iax2_trunk_peer *tpeer,
int sampms,
struct timeval *now)
5968 unsigned long int mssincetx;
6002 iaxs[callno]->
rxcore.tv_usec -= iaxs[callno]->
rxcore.tv_usec % 20000;
6017 struct timeval *delivery = NULL;
6079 else if (adjust > 0)
6099 ast_debug(1,
"predicted timestamp skew (%d) > max (%d), using real ts instead.\n",
6104 int diff = ms % (f->
samples / rate);
6121 if ( (
unsigned int)ms < p->
lastsent )
6154 ast_debug(1,
"calc_rxstamp: call=%d: rxcore set to %d.%6.6d - %ums\n",
6159 ast_debug(1,
"calc_rxstamp: call=%d: works out as %d.%6.6d\n",
6167 if (!test_jitpct || ((100.0 *
ast_random() / (RAND_MAX + 1.0)) < test_jitpct)) {
6168 jit = (int)((
float)test_jit *
ast_random() / (RAND_MAX + 1.0));
6169 if ((
int)(2.0 *
ast_random() / (RAND_MAX + 1.0)))
6182 static struct iax2_trunk_peer *
find_tpeer(
struct sockaddr_in *sin,
int fd)
6184 struct iax2_trunk_peer *tpeer = NULL;
6197 if ((tpeer =
ast_calloc(1,
sizeof(*tpeer)))) {
6200 memcpy(&tpeer->
addr, sin,
sizeof(tpeer->
addr));
6205 setsockopt(tpeer->
sockfd, SOL_SOCKET, SO_NO_CHECK, &nochecksums,
sizeof(nochecksums));
6220 struct iax2_trunk_peer *tpeer;
6253 mtm->
mini.
ts = htons(0xffff & fr->
ts);
6276 if (global_max_trunk_mtu > 0 && tpeer->
trunkdatalen + f->
datalen + 4 >= global_max_trunk_mtu) {
6293 memcpy(buf, (
unsigned char *) &tmp, (len >
sizeof(tmp)) ?
sizeof(tmp) : len);
6323 dst[x] = src[x] ^ 0xff;
6325 unsigned char lastblock[16] = { 0 };
6330 dst[x] ^= lastblock[x];
6331 memcpy(lastblock, src,
sizeof(lastblock));
6347 dst[x] = src[x] ^ 0xff;
6349 unsigned char curblock[16] = { 0 };
6353 curblock[x] ^= src[x];
6355 memcpy(curblock, dst,
sizeof(curblock));
6366 unsigned char *workspace;
6369 memset(f, 0,
sizeof(*f));
6377 padding = 16 + (workspace[15] & 0x0f);
6379 ast_debug(1,
"Decoding full frame with length %d (padding = %d) (15=%02x)\n", *datalen, padding, (
unsigned)workspace[15]);
6383 *datalen -= padding;
6396 ast_debug(1,
"Decoding mini with length %d\n", *datalen);
6401 padding = 16 + (workspace[15] & 0x0f);
6404 *datalen -= padding;
6413 unsigned char *workspace;
6418 ast_debug(1,
"Encoding full frame %d/%d with length %d\n", fh->
type, fh->
csub, *datalen);
6420 padding = 16 + (padding & 0xf);
6421 memcpy(workspace, poo, padding);
6423 workspace[15] &= 0xf0;
6424 workspace[15] |= (padding & 0xf);
6426 ast_debug(1,
"Encoding full frame %d/%d with length %d + %d padding (15=%02x)\n", fh->
type, fh->
csub, *datalen, padding, (
unsigned)workspace[15]);
6427 *datalen += padding;
6430 memcpy(poo, workspace + *datalen - 32, 32);
6434 ast_debug(1,
"Encoding mini frame with length %d\n", *datalen);
6436 padding = 16 + (padding & 0xf);
6437 memcpy(workspace, poo, padding);
6439 workspace[15] &= 0xf0;
6440 workspace[15] |= (padding & 0x0f);
6441 *datalen += padding;
6444 memcpy(poo, workspace + *datalen - 32, 32);
6455 unsigned char digest[16];
6456 char *tmppw, *stringp;
6460 while ((tmppw =
strsep(&stringp,
";"))) {
6462 MD5Update(&md5, (
unsigned char *)iaxs[callno]->challenge, strlen(iaxs[callno]->challenge));
6463 MD5Update(&md5, (
unsigned char *)tmppw, strlen(tmppw));
6466 res =
decode_frame(&iaxs[callno]->dcx, fh, f, datalen);
6473 res =
decode_frame(&iaxs[callno]->dcx, fh, f, datalen);
6487 unsigned char buffer[4096];
6495 frb.fr2.afdatalen =
sizeof(frb.buffer);
6514 "f->frametype %c= AST_FRAME_VOICE, %sencrypted, %srotation scheduled...\n",
6525 (((fts & 0xFFFF0000L) == (lastsent & 0xFFFF0000L)) ||
6526 ((fts & 0xFFFF0000L) == ((lastsent + 0x10000) & 0xFFFF0000L))))
6543 if (((fts & 0xFFFF8000L) == (pvt->
lastvsent & 0xFFFF8000L)) &&
6587 fh->
ts = htonl(fr->
ts);
6669 mh->
ts = htons(fr->
ts & 0xFFFF);
6690 int havepattern = 0;
6692 #define FORMAT "%-15.15s %-20.20s %-15.15s %-15.15s %-5.5s %-5.10s\n"
6693 #define FORMAT2 "%-15.15s %-20.20s %-15.15d %-15.15s %-5.5s %-5.10s\n"
6702 e->
command =
"iax2 show users [like]";
6704 "Usage: iax2 show users [like <pattern>]\n"
6705 " Lists all known IAX2 users.\n"
6706 " Optional regular expression pattern is used to filter the user list.\n";
6714 if (!strcasecmp(a->
argv[3],
"like")) {
6715 if (regcomp(®exbuf, a->
argv[4], REG_EXTENDED | REG_NOSUB))
6726 ast_cli(a->
fd,
FORMAT,
"Username",
"Secret",
"Authen",
"Def.Context",
"A/C",
"Codec Pref");
6729 if (havepattern && regexec(®exbuf, user->
name, 0, NULL, 0))
6735 snprintf(auth,
sizeof(auth),
"Key: %-15.15s ", user->
inkeys);
6748 user->
ha ?
"Yes" :
"No", pstr);
6763 int havepattern = 0;
6764 int total_peers = 0;
6765 int online_peers = 0;
6766 int offline_peers = 0;
6767 int unmonitored_peers = 0;
6770 #define FORMAT2 "%-15.15s %-15.15s %s %-15.15s %-8s %s %-10s\n"
6771 #define FORMAT "%-15.15s %-15.15s %s %-15.15s %-5d%s %s %-10s\n"
6776 int registeredonly=0;
6777 char idtext[256] =
"";
6780 if (!strcasecmp(argv[3],
"registered"))
6784 if (!strcasecmp(argv[4],
"like")) {
6785 if (regcomp(®exbuf, argv[5], REG_EXTENDED | REG_NOSUB))
6792 if (!strcasecmp(argv[3],
"like")) {
6793 if (regcomp(®exbuf, argv[4], REG_EXTENDED | REG_NOSUB))
6800 if (!strcasecmp(argv[3],
"registered"))
6813 ast_cli(fd,
FORMAT2,
"Name/Username",
"Host",
" ",
"Mask",
"Port",
" ",
"Status");
6820 struct sockaddr_in peer_addr;
6824 if (registeredonly && !peer_addr.sin_addr.s_addr) {
6827 if (havepattern && regexec(®exbuf, peer->
name, 0, NULL, 0)) {
6832 snprintf(name,
sizeof(name),
"%s/%s", peer->
name, peer->
username);
6837 retstatus =
peer_status(peer, status,
sizeof(status));
6840 else if (!retstatus)
6843 unmonitored_peers++;
6849 "Event: PeerEntry\r\n%s"
6850 "Channeltype: IAX2\r\n"
6851 "ObjectName: %s\r\n"
6852 "ChanObjectType: peer\r\n"
6857 "Encryption: %s\r\n"
6858 "Status: %s\r\n\r\n",
6882 ast_cli(fd,
"%d iax2 peers [%d online, %d offline, %d unmonitored]\n",
6883 total_peers, online_peers, offline_peers, unmonitored_peers);
6889 *total = total_peers;
6898 struct iax2_thread *
thread = NULL;
6900 int threadcount = 0, dynamiccount = 0;
6905 e->
command =
"iax2 show threads";
6907 "Usage: iax2 show threads\n"
6908 " Lists status of IAX helper threads\n";
6916 ast_cli(a->
fd,
"IAX2 Thread Information\n");
6921 #ifdef DEBUG_SCHED_MULTITHREAD
6922 ast_cli(a->
fd,
"Thread %d: state=%u, update=%d, actions=%d, func='%s'\n",
6925 ast_cli(a->
fd,
"Thread %d: state=%u, update=%d, actions=%d\n",
6938 #ifdef DEBUG_SCHED_MULTITHREAD
6939 ast_cli(a->
fd,
"Thread %c%d: state=%u, update=%d, actions=%d, func='%s'\n",
6942 ast_cli(a->
fd,
"Thread %c%d: state=%u, update=%d, actions=%d\n",
6951 #ifdef DEBUG_SCHED_MULTITHREAD
6952 ast_cli(a->
fd,
"Thread %d: state=%u, update=%d, actions=%d, func='%s'\n",
6955 ast_cli(a->
fd,
"Thread %d: state=%u, update=%d, actions=%d\n",
6961 ast_cli(a->
fd,
"%d of %d threads accounted for with %d dynamic threads\n", threadcount,
iaxthreadcount, dynamiccount);
6971 e->
command =
"iax2 unregister";
6973 "Usage: iax2 unregister <peername>\n"
6974 " Unregister (force expiration) an IAX2 peer from the registry.\n";
7004 ast_cli(a->
fd,
"Peer unknown: %s. Not unregistered\n", a->
argv[2]);
7014 int wordlen = strlen(word);
7020 if (!strncasecmp(p->
name, word, wordlen) &&
7021 ++which > state && p->
expire > 0) {
7038 e->
command =
"iax2 show peers";
7040 "Usage: iax2 show peers [registered] [like <pattern>]\n"
7041 " Lists all known IAX2 peers.\n"
7042 " Optional 'registered' argument lists only peers with known addresses.\n"
7043 " Optional regular expression pattern is used to filter the peer list.\n";
7068 struct iax_firmware *cur = NULL;
7072 e->
command =
"iax2 show firmware";
7074 "Usage: iax2 show firmware\n"
7075 " Lists all known IAX firmware images.\n";
7084 ast_cli(a->
fd,
"%-15.15s %-15.15s %-15.15s\n",
"Device",
"Version",
"Size");
7100 static const char *
const a[] = {
"iax2",
"show",
"peers" };
7102 char idtext[256] =
"";
7106 snprintf(idtext,
sizeof(idtext),
"ActionID: %s\r\n",
id);
7113 "Event: PeerlistComplete\r\n"
7114 "EventList: Complete\r\n"
7117 "\r\n", total, idtext);
7129 char idtext[256] =
"";
7134 snprintf(idtext,
sizeof(idtext),
"ActionID: %s\r\n",
id);
7136 astman_append(s,
"Response: Success\r\n%sMessage: IAX Peer status list will follow\r\n\r\n", idtext);
7142 astman_append(s,
"Event: PeerEntry\r\n%sChanneltype: IAX\r\n", idtext);
7162 astman_append(s,
"Event: PeerlistComplete\r\n%sListItems: %d\r\n\r\n", idtext, peer_count);
7171 return "Unregistered";
7173 return "Request Sent";
7175 return "Auth. Sent";
7177 return "Registered";
7183 return "No Authentication";
7191 #define FORMAT2 "%-20.20s %-6.6s %-10.10s %-20.20s %8.8s %s\n"
7192 #define FORMAT "%-20.20s %-6.6s %-10.10s %-20.20s %8d %s\n"
7193 struct iax2_registry *reg = NULL;
7200 e->
command =
"iax2 show registry";
7202 "Usage: iax2 show registry\n"
7203 " Lists all registration requests and status.\n";
7210 ast_cli(a->
fd,
FORMAT2,
"Host",
"dnsmgr",
"Username",
"Perceived",
"Refresh",
"State");
7214 if (reg->
us.sin_addr.s_addr)
7215 snprintf(perceived,
sizeof(perceived),
"%s:%d",
ast_inet_ntoa(reg->
us.sin_addr), ntohs(reg->
us.sin_port));
7219 (reg->
dnsmgr) ?
"Y" :
"N",
7224 ast_cli(a->
fd,
"%d IAX2 registrations.\n", counter);
7233 struct iax2_registry *reg = NULL;
7234 char idtext[256] =
"";
7236 char perceived[80] =
"";
7240 snprintf(idtext,
sizeof(idtext),
"ActionID: %s\r\n",
id);
7248 if (reg->
us.sin_addr.s_addr) {
7249 snprintf(perceived,
sizeof(perceived),
"%s:%d",
ast_inet_ntoa(reg->
us.sin_addr), ntohs(reg->
us.sin_port));
7255 "Event: RegistryEntry\r\n"
7258 "DNSmanager: %s\r\n"
7263 "\r\n", idtext, host, (reg->
dnsmgr) ?
"Y" :
"N", reg->
username, perceived,
7271 "Event: RegistrationsComplete\r\n"
7272 "EventList: Complete\r\n"
7275 "\r\n", total, idtext);
7282 #define FORMAT2 "%-20.20s %-15.15s %-10.10s %-11.11s %-11.11s %-7.7s %-6.6s %-6.6s %s %s %9s\n"
7283 #define FORMAT "%-20.20s %-15.15s %-10.10s %5.5d/%5.5d %5.5d/%5.5d %-5.5dms %-4.4dms %-4.4dms %-6.6s %s%s %3s%s\n"
7284 #define FORMATB "%-20.20s %-15.15s %-10.10s %5.5d/%5.5d %5.5d/%5.5d [Native Bridged to ID=%5.5d]\n"
7288 char first_message[10] = { 0, };
7289 char last_message[10] = { 0, };
7293 e->
command =
"iax2 show channels";
7295 "Usage: iax2 show channels\n"
7296 " Lists all currently active IAX channels.\n";
7304 ast_cli(a->
fd,
FORMAT2,
"Channel",
"Peer",
"Username",
"ID (Lo/Rem)",
"Seq (Tx/Rx)",
"Lag",
"Jitter",
"JitBuf",
"Format",
"FirstMsg",
"LastMsg");
7308 int lag, jitter, localdelay;
7325 S_OR(iaxs[x]->username,
"(None)"),
7326 iaxs[x]->
callno, iaxs[x]->peercallno,
7327 iaxs[x]->oseqno, iaxs[x]->iseqno,
7334 (iaxs[x]->last_iax_message & MARK_IAX_SUBCLASS_TX) ?
"Tx:" :
"Rx:",
7337 if (iaxs[x]->owner) {
7343 ast_cli(a->
fd,
"%d active IAX dialog%s\n", numchans, (numchans != 1) ?
"s" :
"");
7344 ast_cli(a->
fd,
"%d used IAX channel%s\n", usedchans, (usedchans != 1) ?
"s" :
"");
7356 char first_message[10] = { 0, };
7357 char last_message[10] = { 0, };
7358 #define ACN_FORMAT1 "%-20.25s %4u %4d %4d %5d %3d %5d %4d %6d %4d %4d %5d %3d %5d %4d %6d %s%s %4s%s\n"
7359 #define ACN_FORMAT2 "%s %u %d %d %d %d %d %d %d %d %d %d %d %d %d %d %s%s %s%s\n"
7363 int localjitter, localdelay, locallost, locallosspct, localdropped, localooo;
7370 localjitter = jbinfo.
jitter;
7373 locallosspct = jbinfo.
losspct/1000;
7386 iaxs[x]->owner ? iaxs[x]->owner->name :
"(None)",
7408 iaxs[x]->owner ? iaxs[x]->owner->name :
"(None)",
7442 e->
command =
"iax2 show netstats";
7444 "Usage: iax2 show netstats\n"
7445 " Lists network status for all currently active IAX channels.\n";
7452 ast_cli(a->
fd,
" -------- LOCAL --------------------- -------- REMOTE --------------------\n");
7453 ast_cli(a->
fd,
"Channel RTT Jit Del Lost %% Drop OOO Kpkts Jit Del Lost %% Drop OOO Kpkts FirstMsg LastMsg\n");
7455 ast_cli(a->
fd,
"%d active IAX channel%s\n", numchans, (numchans != 1) ?
"s" :
"");
7463 e->
command =
"iax2 set debug {on|off|peer}";
7465 "Usage: iax2 set debug {on|off|peer peername}\n"
7466 " Enables/Disables dumping of IAX packets for debugging purposes.\n";
7469 if (a->
pos == 4 && !strcasecmp(a->
argv[3],
"peer"))
7477 if (!strcasecmp(a->
argv[3],
"peer")) {
7479 struct sockaddr_in peer_addr;
7494 debugaddr.sin_addr = peer_addr.sin_addr;
7495 debugaddr.sin_port = peer_addr.sin_port;
7497 ast_cli(a->
fd,
"IAX2 Debugging Enabled for IP: %s:%d\n",
7501 }
else if (!strncasecmp(a->
argv[3],
"on", 2)) {
7503 ast_cli(a->
fd,
"IAX2 Debugging Enabled\n");
7507 ast_cli(a->
fd,
"IAX2 Debugging Disabled\n");
7516 e->
command =
"iax2 set debug trunk {on|off}";
7518 "Usage: iax2 set debug trunk {on|off}\n"
7519 " Enables/Disables debugging of IAX trunking\n";
7528 if (!strncasecmp(a->
argv[e->
args - 1],
"on", 2)) {
7530 ast_cli(a->
fd,
"IAX2 Trunk Debugging Enabled\n");
7533 ast_cli(a->
fd,
"IAX2 Trunk Debugging Disabled\n");
7542 e->
command =
"iax2 set debug jb {on|off}";
7544 "Usage: iax2 set debug jb {on|off}\n"
7545 " Enables/Disables jitterbuffer debugging information\n";
7554 if (!strncasecmp(a->
argv[e->
args -1],
"on", 2)) {
7556 ast_cli(a->
fd,
"IAX2 Jitterbuffer Debugging Enabled\n");
7559 ast_cli(a->
fd,
"IAX2 Jitterbuffer Debugging Disabled\n");
7571 if (!iaxs[callno]->error) {
7583 res =
iax2_send(iaxs[callno], f, 0, -1, 0, 0, 0);
7602 f.
src = __FUNCTION__;
7609 return iax2_send(i, &f, ts, seqno, now, transfer,
final);
7616 ast_debug(2,
"Callno %d: Blocked sending control frame %d.\n",
7620 return __send_command(i, type, command, ts, data, datalen, seqno, 0, 0, 0);
7627 res =
send_command(iaxs[callno], type, command, ts, data, datalen, seqno);
7639 int call_num = i->
callno;
7642 if (!iaxs[call_num])
7644 return __send_command(i, type, command, ts, data, datalen, seqno, 0, 0, 1);
7649 return __send_command(i, type, command, ts, data, datalen, seqno, 1, 0, 0);
7654 return __send_command(i, type, command, ts, data, datalen, 0, 0, 1, 0);
7660 if (!strcmp(con->
context, context) || !strcmp(con->
context,
"*"))
7675 int gotcapability = 0;
7739 !strcmp(iaxs[callno]->username, user->
name))
7753 if (bestscore < 4) {
7762 if (bestscore < 3) {
7773 if (bestscore < 2) {
7782 if (bestscore < 1) {
7807 for (v = user->
vars ; v ; v = v->
next) {
7809 tmpvar->next = iaxs[callno]->
vars;
7810 iaxs[callno]->
vars = tmpvar;
7863 char *family, *key=NULL;
7866 key = strchr(family,
'/');
7871 if (!key ||
ast_db_get(family, key, buf,
sizeof(buf)))
7896 static int raw_hangup(
struct sockaddr_in *sin,
unsigned short src,
unsigned short dst,
int sockfd)
7910 ast_debug(1,
"Raw Hangup %s:%d, src=%d, dst=%d\n",
7911 ast_inet_ntoa(sin->sin_addr), ntohs(sin->sin_port), src, dst);
7912 return sendto(sockfd, &fh,
sizeof(fh), 0, (
struct sockaddr *)sin,
sizeof(*sin));
7939 int res = -1, authreq_restrict = 0;
7943 memset(&ied, 0,
sizeof(ied));
7954 authreq_restrict = 1;
7962 if (authreq_restrict) {
7971 snprintf(challenge,
sizeof(challenge),
"%d", (
int)
ast_random());
7991 char requeststr[256];
7992 char md5secret[256] =
"";
7994 char rsasecret[256] =
"";
8014 ast_log(
LOG_NOTICE,
"Call Terminated, Incoming call is unencrypted while force encrypt is enabled.\n");
8032 keyn =
strsep(&stringp,
":");
8039 ast_log(
LOG_WARNING,
"requested inkey '%s' for RSA authentication does not exist\n", keyn);
8040 keyn =
strsep(&stringp,
":");
8044 unsigned char digest[16];
8045 char *tmppw, *stringp;
8049 while((tmppw =
strsep(&stringp,
";"))) {
8052 MD5Update(&md5, (
unsigned char *)tmppw, strlen(tmppw));
8056 sprintf(requeststr + (x << 1),
"%2.2x", (
unsigned)digest[x]);
8057 if (!strcasecmp(requeststr, md5secret)) {
8063 if (!strcmp(secret, p->
secret))
8072 char requeststr[256] =
"";
8073 char peer[256] =
"";
8074 char md5secret[256] =
"";
8075 char rsasecret[256] =
"";
8107 if (!p || !iaxs[callno]) {
8127 if (authdebug && !p)
8153 keyn =
strsep(&stringp,
":");
8161 keyn =
strsep(&stringp,
":");
8170 ast_log(
LOG_NOTICE,
"Host '%s' trying to do RSA authentication, but we have no inkeys\n", peer);
8175 unsigned char digest[16];
8176 char *tmppw, *stringp;
8180 while((tmppw =
strsep(&stringp,
";"))) {
8182 MD5Update(&md5, (
unsigned char *)iaxs[callno]->challenge, strlen(iaxs[callno]->challenge));
8183 MD5Update(&md5, (
unsigned char *)tmppw, strlen(tmppw));
8186 sprintf(requeststr + (x << 1),
"%2.2x", (
unsigned)digest[x]);
8187 if (!strcasecmp(requeststr, md5secret))
8199 if (strcmp(secret, p->
secret)) {
8219 if (expire && (expire < iaxs[callno]->expiry)) {
8220 iaxs[callno]->
expiry = expire;
8247 if (
ast_sign(key, (
char*)challenge, sig)) {
8261 unsigned char digest[16];
8264 MD5Update(&md5, (
unsigned char *)challenge, strlen(challenge));
8265 MD5Update(&md5, (
unsigned char *)secret, strlen(secret));
8269 sprintf(digres + (x << 1),
"%2.2x", (
unsigned)digest[x]);
8295 uint16_t callno = p->
callno;
8297 memset(&ied, 0,
sizeof(ied));
8317 struct sockaddr_in peer_addr;
8325 && (!peer_addr.sin_addr.s_addr || ((sin->sin_addr.s_addr & peer->
mask.s_addr) == (peer_addr.sin_addr.s_addr & peer->
mask.s_addr)))
8344 if (!(p = iaxs[callno])) {
8353 if (!(p = iaxs[callno]))
8362 ast_log(
LOG_NOTICE,
"Call initiated without encryption while forceencryption=yes option is set\n");
8371 if (variablestore && varlist && p->
owner) {
8372 variablestore->
data = varlist;
8375 for (var = ies->
vars; var; var = var->
next) {
8382 ast_log(
LOG_ERROR,
"Memory allocation error while processing IAX2 variables\n");
8393 ast_log(
LOG_ERROR,
"Memory allocation error while processing IAX2 variables\n");
8410 struct iax2_registry *reg = (
struct iax2_registry *)data;
8417 #ifdef SCHED_MULTITHREADED
8429 struct sockaddr_in new = { 0, };
8431 memset(&ied, 0,
sizeof(ied));
8436 if (!newcall || !
new.sin_addr.s_addr || !
new.sin_port) {
8443 pvt->
transfer.sin_family = AF_INET;
8460 char exten[256] =
"";
8481 if (strcmp(dp->
exten, exten))
8494 if (write(dp->
waiters[x],
"asdf", 4) < 0) {
8513 peercallno = ies->
callno;
8515 if (peercallno < 1) {
8569 struct iax2_registry *reg;
8571 char peer[256] =
"";
8574 char ourip[256] =
"<Unspecified>";
8575 struct sockaddr_in oldus;
8576 struct sockaddr_in us;
8578 struct sockaddr_in reg_addr;
8580 memset(&us, 0,
sizeof(us));
8593 reg = iaxs[callno]->
reg;
8598 memcpy(&oldus, ®->
us,
sizeof(oldus));
8605 memcpy(®->
us, &us,
sizeof(reg->
us));
8617 snprintf(msgstatus,
sizeof(msgstatus),
" with %d new and %d old messages waiting", reg->
messages & 0xff, reg->
messages >> 8);
8619 snprintf(msgstatus,
sizeof(msgstatus),
" with %d new messages waiting", reg->
messages);
8621 ast_copy_string(msgstatus,
" with 1 new message waiting",
sizeof(msgstatus));
8623 ast_copy_string(msgstatus,
" with no messages waiting",
sizeof(msgstatus));
8625 snprintf(ourip,
sizeof(ourip),
"%s:%d",
ast_inet_ntoa(reg->
us.sin_addr), ntohs(reg->
us.sin_port));
8626 ast_verb(3,
"Registered IAX2 to '%s', who sees us as %s%s\n",
ast_inet_ntoa(sin->sin_addr), ourip, msgstatus);
8634 const char *
secret,
const char *porta)
8636 struct iax2_registry *reg;
8641 reg->
addr.
ss.ss_family = AF_INET;
8675 username =
strsep(&stringp,
"@");
8676 hostname =
strsep(&stringp,
"@");
8679 ast_log(
LOG_WARNING,
"Format for registration is user[:secret]@host[:port] at line %d\n", lineno);
8684 username =
strsep(&stringp,
":");
8685 secret =
strsep(&stringp,
":");
8687 hostname =
strsep(&stringp,
":");
8688 porta =
strsep(&stringp,
":");
8690 if (porta && !atoi(porta)) {
8702 char *stringp, *
ext;
8706 while((ext =
strsep(&stringp,
"&"))) {
8743 if (peer->
expire == -1) {
8750 ast_debug(1,
"Expiring registration for peer '%s'\n", peer->
name);
8757 memset(&peer->
addr, 0,
sizeof(peer->
addr));
8775 #ifdef SCHED_MULTITHREADED
8791 expiry = strrchr(data,
':');
8803 p->
expiry = atoi(expiry);
8846 const char *peer_name;
8866 if (sin->sin_addr.s_addr) {
8879 if (refresh > max_reg_expire) {
8880 ast_log(
LOG_NOTICE,
"Restricting registration for peer '%s' to %d seconds (requested %d)\n",
8881 p->
name, max_reg_expire, refresh);
8883 }
else if (refresh < min_reg_expire) {
8884 ast_log(
LOG_NOTICE,
"Restricting registration for peer '%s' to %d seconds (requested %d)\n",
8885 p->
name, min_reg_expire, refresh);
8902 snprintf(data,
sizeof(data),
"%s:%d:%d",
ast_inet_ntoa(sin->sin_addr), ntohs(sin->sin_port), p->
expiry);
8905 ast_verb(3,
"Registered IAX2 '%s' (%s) at %s:%d\n", p->
name,
8929 if (!iaxs[callno]) {
8944 if (p->
expiry && sin->sin_addr.s_addr) {
8951 if (sin->sin_addr.s_addr) {
8952 struct sockaddr_in peer_addr;
8966 context =
"default";
8986 msgcount = (old << 8) |
new;
9012 const char *peer_name;
9027 memset(&ied, 0,
sizeof(ied));
9041 snprintf(challenge,
sizeof(challenge),
"%d", (
int)
ast_random());
9057 struct iax2_registry *reg;
9060 char peer[256] =
"";
9061 char challenge[256] =
"";
9063 int authmethods = 0;
9070 memset(&ied, 0,
sizeof(ied));
9071 reg = iaxs[callno]->
reg;
9073 struct sockaddr_in reg_addr;
9088 if (reg->
secret[0] ==
'[') {
9091 tmpkey[strlen(tmpkey) - 1] =
'\0';
9092 res =
authenticate(challenge, NULL, tmpkey, authmethods, &ied, sin, NULL);
9115 int callno = (int)(
long)(nothing);
9119 memset(&ied, 0,
sizeof(ied));
9134 int callno = (int)(
long)(data);
9137 iaxs[callno]->
authid = -1;
9139 #ifdef SCHED_MULTITHREADED
9164 int callno = (int)(
long)(nothing);
9168 memset(&ied, 0,
sizeof(ied));
9178 int callno = (int)(
long)(data);
9181 iaxs[callno]->
autoid = -1;
9184 #ifdef SCHED_MULTITHREADED
9197 memset(&ied, 0,
sizeof(ied));
9214 if (((
unsigned char) (f->
oseqno - last) < 128) &&
9232 #ifdef SCHED_MULTITHREADED
9239 static int send_trunk(
struct iax2_trunk_peer *tpeer,
struct timeval *now)
9269 calls = tpeer->
calls;
9285 if (now->tv_sec > tpeer->
trunkact.tv_sec + 5)
9293 struct iax2_trunk_peer *tpeer = NULL, *drop = NULL;
9297 ast_verbose(
"Beginning trunk processing. Trunk queue ceiling is %d bytes per host\n", trunkmaxsize);
9336 ast_debug(1,
"Dropping unused iax2 trunk peer '%s:%d'\n",
ast_inet_ntoa(drop->addr.sin_addr), ntohs(drop->addr.sin_port));
9337 if (drop->trunkdata) {
9339 drop->trunkdata = NULL;
9348 ast_verbose(
"Ending trunk processing with %d peers and %d call chunks processed\n", processed,
totalcalls);
9361 static void dp_lookup(
int callno,
const char *
context,
const char *callednum,
const char *callerid,
int skiplock)
9363 unsigned short dpstatus = 0;
9367 memset(&ied1, 0,
sizeof(ied1));
9406 pthread_t newthread;
9437 ast_debug(4,
"IAX Park: Transferer channel %s, Transferee %s\n",
9462 chan1m =
ast_channel_alloc(0,
AST_STATE_DOWN, 0, 0, chan2->
accountcode, chan1->
exten, chan1->
context, chan1->
linkedid, chan1->
amaflags,
"Parking/%s", chan1->
name);
9463 chan2m =
ast_channel_alloc(0,
AST_STATE_DOWN, 0, 0, chan2->
accountcode, chan2->
exten, chan2->
context, chan2->
linkedid, chan2->
amaflags,
"IAXPeer/%s", chan2->
name);
9465 if (!chan1m || !chan2m || !d) {
9548 unsigned int ourver;
9550 snprintf(rsi,
sizeof(rsi),
"si-%s", si);
9553 ast_debug(1,
"Service identifier '%s', we think '%08x', they think '%08x'\n", si, ourver, ver);
9564 memset(iep, 0,
sizeof(*iep));
9589 unsigned int length, offset = 0;
9600 memcpy(full_osptoken + offset, ies->
osptokenblock[i], length);
9607 *(full_osptoken + offset) =
'\0';
9608 if (strlen(full_osptoken) != offset) {
9610 *full_osptoken =
'\0';
9618 int localjitter = -1, localdelay = 0, locallost = -1, locallosspct = -1, localdropped = 0, localooo = -1, localpackets = -1;
9622 if (iaxs[callno] && iaxs[callno]->owner && iaxs[callno]->owner->name) {
9625 localjitter = jbinfo.
jitter;
9628 locallosspct = jbinfo.
losspct/1000;
9633 ast_debug(3,
"JB STATS:%s ping=%u ljitterms=%d ljbdelayms=%d ltotlost=%d lrecentlosspct=%d ldropped=%d looo=%d lrecvd=%d rjitterms=%d rjbdelayms=%d rtotlost=%d rrecentlosspct=%d rdropped=%d rooo=%d rrecvd=%d\n",
9634 iaxs[callno]->owner->name,
9650 manager_event(
EVENT_FLAG_REPORTING,
"JitterBufStats",
"Owner: %s\r\nPing: %u\r\nLocalJitter: %d\r\nLocalJBDelay: %d\r\nLocalTotalLost: %d\r\nLocalLossPercent: %d\r\nLocalDropped: %d\r\nLocalooo: %d\r\nLocalReceived: %d\r\nRemoteJitter: %d\r\nRemoteJBDelay: %d\r\nRemoteTotalLost: %d\r\nRemoteLossPercent: %d\r\nRemoteDropped: %d\r\nRemoteooo: %d\r\nRemoteReceived: %d\r\n",
9651 iaxs[callno]->owner->name,
9685 thread->
buf = pkt_buf->
buf;
9715 memcpy(pkt_buf->
buf, from_here->
buf, pkt_buf->
len);
9739 struct iax2_thread *
thread;
9742 static time_t last_errtime = 0;
9747 if (t != last_errtime) {
9749 ast_debug(1,
"Out of idle IAX2 threads for I/O, pausing!\n");
9755 len =
sizeof(thread->
iosin);
9761 if (
errno != ECONNREFUSED &&
errno != EAGAIN)
9768 if (test_losspct && ((100.0 *
ast_random() / (RAND_MAX + 1.0)) < test_losspct)) {
9779 struct iax2_thread *cur = NULL;
9809 #ifdef DEBUG_SCHED_MULTITHREAD
9820 unsigned char metatype;
9824 struct iax2_trunk_peer *tpeer;
9827 struct timeval rxtrunktime;
9830 if (packet_len <
sizeof(*meta)) {
9831 ast_log(
LOG_WARNING,
"Rejecting packet from '%s.%d' that is flagged as a meta frame but is too short\n",
9839 if (packet_len < (
sizeof(*meta) +
sizeof(*mth))) {
9840 ast_log(
LOG_WARNING,
"midget meta trunk packet received (%d of %d min)\n", packet_len,
9841 (
int) (
sizeof(*meta) +
sizeof(*mth)));
9845 ts = ntohl(mth->
ts);
9847 packet_len -= (
sizeof(*meta) +
sizeof(*mth));
9851 ast_log(
LOG_WARNING,
"Unable to accept trunked packet from '%s:%d': No matching peer\n",
9860 while (packet_len >=
sizeof(*mte)) {
9862 unsigned short callno, trunked_ts,
len;
9866 ptr +=
sizeof(*mtm);
9867 packet_len -=
sizeof(*mtm);
9868 len = ntohs(mtm->
len);
9870 trunked_ts = ntohs(mtm->
mini.
ts);
9873 ptr +=
sizeof(*mte);
9874 packet_len -=
sizeof(*mte);
9875 len = ntohs(mte->
len);
9876 callno = ntohs(mte->
callno);
9883 if (len > packet_len)
9892 memset(&f, 0,
sizeof(f));
9908 fr->
ts = (iaxs[fr->
callno]->
last & 0xFFFF0000L) | (trunked_ts & 0xffff);
9956 if (!variablestore) {
9960 varlist = variablestore->
data;
9964 if (strcmp(var->
name, data) == 0) {
9986 if (!variablestore) {
9988 if (!variablestore) {
10000 variablestore->
data = varlist;
10004 varlist = variablestore->
data;
10008 if (strcmp(var->
name, data) == 0) {
10033 if (iaxs[callno] && iaxs[callno]->owner) {
10037 owner = iaxs[callno]->
owner;
10053 struct sockaddr_in sin;
10055 int updatehistory=1;
10058 char decrypted = 0;
10077 char host_pref_buf[128];
10078 char caller_pref_buf[128];
10080 char *using_prefs =
"mine";
10084 memset(fr, 0,
sizeof(*fr));
10090 memcpy(&sin, &thread->
iosin,
sizeof(sin));
10092 if (res <
sizeof(*mh)) {
10093 ast_log(
LOG_WARNING,
"midget packet received (%d of %d min)\n", res, (
int)
sizeof(*mh));
10096 if ((vh->zeros == 0) && (ntohs(vh->callno) & 0x8000)) {
10097 if (res <
sizeof(*vh)) {
10098 ast_log(
LOG_WARNING,
"Rejecting packet from '%s.%d' that is flagged as a video frame but is too short\n",
ast_inet_ntoa(sin.sin_addr), ntohs(sin.sin_port));
10103 fr->
callno =
find_callno(ntohs(vh->callno) & ~0x8000, dcallno, &sin,
new, fd, 0);
10105 }
else if ((meta->
zeros == 0) && !(ntohs(meta->
metacmd) & 0x8000))
10108 #ifdef DEBUG_SUPPORT
10109 if (res >=
sizeof(*fh))
10113 if (res <
sizeof(*fh)) {
10114 ast_log(
LOG_WARNING,
"Rejecting packet from '%s.%d' that is flagged as a full frame but is too short\n",
ast_inet_ntoa(sin.sin_addr), ntohs(sin.sin_port));
10159 f.
datalen = res -
sizeof(*fh);
10171 memset(&ies, 0,
sizeof(ies));
10178 memset(&ies, 0,
sizeof(ies));
10202 memset(&ies, 0,
sizeof(ies));
10206 int check_dcallno = 0;
10262 #ifdef DEBUG_SUPPORT
10275 unsigned short new_peercallno;
10277 new_peercallno = (
unsigned short) (ntohs(mh->callno) & ~
IAX_FLAG_FULL);
10292 fr->
ts = ntohl(fh->
ts);
10295 ast_debug(1,
"Simulating frame ts resync, was %u now %u\n", fr->
ts, fr->
ts + test_resync);
10296 fr->
ts += test_resync;
10328 ast_debug(1,
"Packet arrived out of order (expecting %d, got %d) (frametype = %u, subclass = %d)\n",
10361 if (res < thread->buf_size)
10362 thread->
buf[res++] =
'\0';
10364 thread->
buf[res - 1] =
'\0';
10373 int call_to_destroy;
10385 ast_debug(1,
"Cancelling transmission of packet %d\n", x);
10386 call_to_destroy = 0;
10393 call_to_destroy = fr->
callno;
10396 if (call_to_destroy) {
10398 ast_debug(1,
"Really destroying %d, having been acked on final message\n", call_to_destroy);
10449 if (!iaxs[fr->
callno]) {
10458 if (variablestore && varlist) {
10459 variablestore->
data = varlist;
10463 for (var = ies.
vars; var; var = var->
next) {
10471 ast_log(
LOG_ERROR,
"Memory allocation error while processing IAX2 variables\n");
10482 ast_log(
LOG_ERROR,
"Memory allocation error while processing IAX2 variables\n");
10483 if (variablestore) {
10494 ast_debug(1,
"No channel, so populating IAXVARs to the pvt, as an intermediate step.\n");
10495 for (var = ies.
vars; var && var->
next; var = var->
next);
10505 ast_debug(1,
"I have IAX variables, but they were not processed\n");
10533 ast_debug(1,
"Neat, somebody took away the channel at a magical time but i found it!\n");
10537 ast_debug(1,
"I can haz iaxvars, but they is no good. :-(\n");
10582 "Uniqueid: %s\r\n",
10601 S_OR(moh_suggest, NULL),
10611 if (!iaxs[fr->
callno]) {
10619 "Uniqueid: %s\r\n",
10647 memset(&ied1, 0,
sizeof(ied1));
10661 if (!iaxs[fr->
callno]) {
10669 fr->
callno = new_callno;
10683 ast_log(
LOG_WARNING,
"Rejected connect attempt. No secret present while force encrypt enabled.\n");
10686 if (strcasecmp(iaxs[fr->
callno]->
exten,
"TBD")) {
10698 if (!iaxs[fr->
callno]) {
10706 if (strcmp(iaxs[fr->
callno]->
exten,
"TBD") && !exists) {
10707 memset(&ied0, 0,
sizeof(ied0));
10711 if (!iaxs[fr->
callno]) {
10721 using_prefs =
"reqonly";
10723 using_prefs =
"disabled";
10726 memset(&pref, 0,
sizeof(pref));
10727 strcpy(caller_pref_buf,
"disabled");
10728 strcpy(host_pref_buf,
"disabled");
10730 using_prefs =
"mine";
10738 using_prefs =
"caller";
10753 memset(&ied0, 0,
sizeof(ied0));
10757 if (!iaxs[fr->
callno]) {
10761 char tmp[256], tmp2[256], tmp3[256];
10763 ast_log(
LOG_NOTICE,
"Rejected connect attempt from %s, requested '%s' incompatible with our capability '%s'.\n",
10768 ast_log(
LOG_NOTICE,
"Rejected connect attempt from %s, requested/capability '%s'/'%s' incompatible with our capability '%s'.\n",
10783 memset(&pref, 0,
sizeof(pref));
10785 strcpy(caller_pref_buf,
"disabled");
10786 strcpy(host_pref_buf,
"disabled");
10788 using_prefs =
"mine";
10795 using_prefs =
"caller";
10804 char tmp[256], tmp2[256], tmp3[256];
10805 memset(&ied0, 0,
sizeof(ied0));
10810 if (!iaxs[fr->
callno]) {
10814 ast_log(
LOG_NOTICE,
"Rejected connect attempt from %s, requested/capability '%s'/'%s' incompatible with our capability '%s'.\n",
10827 memset(&ied1, 0,
sizeof(ied1));
10833 ast_verb(3,
"Accepting UNAUTHENTICATED call from %s:\n"
10834 "%srequested format = %s,\n"
10835 "%srequested prefs = %s,\n"
10836 "%sactual format = %s,\n"
10837 "%shost prefs = %s,\n"
10838 "%spriority = %s\n",
10884 ast_debug(1,
"Immediately destroying %d, having received hangup\n", fr->
callno);
10888 if (!iaxs[fr->
callno]) {
10901 if (!iaxs[fr->
callno]) {
10911 ast_debug(1,
"Immediately destroying %d, having received reject\n",
10927 if (!iaxs[fr->
callno]) {
10952 bridged_chan->
name);
10957 "Async goto of '%s' to '%s@%s' failed\n",
10960 ast_debug(1,
"Async goto of '%s' to '%s@%s' started\n",
10997 memset(&ied0, 0,
sizeof(ied0));
11001 if (!iaxs[fr->
callno]) {
11005 char tmp1[256], tmp2[256];
11006 ast_log(
LOG_NOTICE,
"Rejected call to %s, format %s incompatible with our capability %s.\n",
11016 iaxs[fr->
callno]->owner->nativeformats = iaxs[fr->
callno]->peerformat;
11020 if (iaxs[fr->
callno]->owner->writeformat)
11022 if (iaxs[fr->
callno]->owner->readformat)
11056 if (iaxs[fr->
callno]->peerpoke) {
11057 peer = iaxs[fr->
callno]->peerpoke;
11117 iaxs[fr->
callno]->lag = ts - fr->
ts;
11119 ast_debug(1,
"Peer %s lag measured as %dms\n",
11133 "I don't know how to authenticate %s to %s\n",
11150 memset(&ied0, 0,
sizeof(ied0));
11154 if (strcasecmp(iaxs[fr->
callno]->exten,
"TBD")) {
11159 if (strcmp(iaxs[fr->
callno]->exten,
"TBD") && !exists) {
11162 memset(&ied0, 0,
sizeof(ied0));
11166 if (!iaxs[fr->
callno]) {
11173 using_prefs =
"reqonly";
11175 using_prefs =
"disabled";
11177 format = iaxs[fr->
callno]->peerformat & iaxs[fr->
callno]->capability;
11178 memset(&pref, 0,
sizeof(pref));
11179 strcpy(caller_pref_buf,
"disabled");
11180 strcpy(host_pref_buf,
"disabled");
11182 using_prefs =
"mine";
11187 pref = iaxs[fr->
callno]->rprefs;
11188 using_prefs =
"caller";
11190 pref = iaxs[fr->
callno]->prefs;
11193 pref = iaxs[fr->
callno]->prefs;
11199 char tmp1[256], tmp2[256], tmp3[256];
11201 ast_debug(1,
"We don't do requested format %s, falling back to peer capability '%s'\n",
11204 format = iaxs[fr->
callno]->peercapability & iaxs[fr->
callno]->capability;
11213 ast_log(
LOG_NOTICE,
"Rejected connect attempt from %s, requested/capability '%s'/'%s' incompatible with our capability '%s'.\n",
11220 memset(&ied0, 0,
sizeof(ied0));
11224 if (!iaxs[fr->
callno]) {
11230 if(!(iaxs[fr->
callno]->peerformat & iaxs[fr->
callno]->capability))
11235 memset(&pref, 0,
sizeof(pref));
11238 strcpy(caller_pref_buf,
"disabled");
11239 strcpy(host_pref_buf,
"disabled");
11241 using_prefs =
"mine";
11245 pref = iaxs[fr->
callno]->prefs;
11247 pref = iaxs[fr->
callno]->rprefs;
11248 using_prefs =
"caller";
11256 char tmp1[256], tmp2[256], tmp3[256];
11261 ast_log(
LOG_NOTICE,
"Rejected connect attempt from %s, requested '%s' incompatible with our capability '%s'.\n",
11266 ast_log(
LOG_NOTICE,
"Rejected connect attempt from %s, requested/capability '%s'/'%s' incompatible with our capability '%s'.\n",
11273 memset(&ied0, 0,
sizeof(ied0));
11277 if (!iaxs[fr->
callno]) {
11285 memset(&ied1, 0,
sizeof(ied1));
11289 if (strcmp(iaxs[fr->
callno]->exten,
"TBD")) {
11291 ast_verb(3,
"Accepting AUTHENTICATED call from %s:\n"
11292 "%srequested format = %s,\n"
11293 "%srequested prefs = %s,\n"
11294 "%sactual format = %s,\n"
11295 "%shost prefs = %s,\n"
11296 "%spriority = %s\n",
11312 else if (ies.
vars) {
11318 if (variablestore && varlist) {
11319 variablestore->
data = varlist;
11322 ast_debug(1,
"I can haz IAX vars? w00t\n");
11323 for (var = ies.
vars; var; var = var->
next) {
11330 ast_log(
LOG_ERROR,
"Memory allocation error while processing IAX2 variables\n");
11340 ast_log(
LOG_ERROR,
"Memory allocation error while processing IAX2 variables\n");
11352 goto immediatedial;
11366 memset(&ied0, 0,
sizeof(ied0));
11370 if (!iaxs[fr->
callno]) {
11376 ast_verb(3,
"Accepting DIAL from %s, formats = %s\n",
11383 else if (ies.
vars) {
11389 ast_debug(1,
"I can haz IAX vars? w00t\n");
11390 if (variablestore && varlist) {
11391 variablestore->
data = varlist;
11394 for (var = ies.
vars; var; var = var->
next) {
11401 ast_log(
LOG_ERROR,
"Memory allocation error while processing IAX2 variables\n");
11411 ast_log(
LOG_ERROR,
"Memory allocation error while processing IAX2 variables\n");
11422 iaxs[fr->
callno]->error = ENOTCONN;
11423 ast_debug(1,
"Immediately destroying %d, having received INVAL\n", fr->
callno);
11428 ast_debug(1,
"Received VNAK: resending outstanding frames\n");
11438 if (!iaxs[fr->
callno]) {
11445 if (!iaxs[fr->
callno]) {
11452 memset(&sin, 0,
sizeof(sin));
11453 sin.sin_family = AF_INET;
11458 if (!iaxs[fr->
callno]) {
11478 if (iaxs[fr->
callno]->reg) {
11492 memset(&ied0, 0,
sizeof(ied0));
11500 && iaxs[fr->
callno]->bridgecallno
11504 if (!iaxs[fr->
callno]) {
11509 ast_verb(3,
"Channel '%s' unable to transfer\n", iaxs[fr->
callno]->owner ? iaxs[fr->
callno]->owner->name :
"<Unknown>");
11510 memset(&iaxs[fr->
callno]->transfer, 0,
sizeof(iaxs[fr->
callno]->transfer));
11512 if (!iaxs[fr->
callno]->bridgecallno) {
11516 if (iaxs[iaxs[fr->
callno]->bridgecallno]
11517 && iaxs[iaxs[fr->
callno]->bridgecallno]->transferring) {
11525 && iaxs[fr->
callno]->bridgecallno
11529 if (!iaxs[fr->
callno]) {
11538 if (iaxs[fr->
callno]->bridgecallno) {
11543 ast_verb(3,
"Channel '%s' ready to transfer\n", iaxs[fr->
callno]->owner ? iaxs[fr->
callno]->owner->name :
"<Unknown>");
11545 if (!iaxs[fr->
callno]->bridgecallno) {
11549 if (!iaxs[iaxs[fr->
callno]->bridgecallno]
11561 ast_verb(3,
"Attempting media bridge of %s and %s\n", iaxs[fr->
callno]->owner ? iaxs[fr->
callno]->owner->name :
"<Unknown>",
11562 iaxs[iaxs[fr->
callno]->bridgecallno]->owner ? iaxs[iaxs[fr->
callno]->bridgecallno]->owner->name :
"<Unknown>");
11567 memset(&ied0, 0,
sizeof(ied0));
11568 memset(&ied1, 0,
sizeof(ied1));
11574 ast_verb(3,
"Releasing %s and %s\n", iaxs[fr->
callno]->owner ? iaxs[fr->
callno]->owner->name :
"<Unknown>",
11575 iaxs[iaxs[fr->
callno]->bridgecallno]->owner ? iaxs[iaxs[fr->
callno]->bridgecallno]->owner->name :
"<Unknown>");
11586 memset(&ied0, 0,
sizeof(ied0));
11587 memset(&ied1, 0,
sizeof(ied1));
11599 if (iaxs[fr->
callno]->transferring)
11623 "we've been told to rotate our encryption key, "
11624 "but this isn't an encrypted call. bad things will happen.\n"
11645 memset(&ied0, 0,
sizeof(ied0));
11665 memset(&ied0, 0,
sizeof(ied0));
11672 ast_debug(1,
"I can haz IAX vars, but they is no good :-(\n");
11692 }
else if (minivid) {
11703 f.
datalen = res -
sizeof(*vh);
11710 fr->
ts = (iaxs[fr->
callno]->
last & 0xFFFF8000L) | ((ntohs(vh->ts) + test_resync) & 0x7fff);
11713 fr->
ts = (iaxs[fr->
callno]->
last & 0xFFFF8000L) | (ntohs(vh->ts) & 0x7fff);
11720 ast_debug(1,
"Received mini frame before first full voice frame\n");
11739 fr->
ts = (iaxs[fr->
callno]->
last & 0xFFFF0000L) | ((ntohs(mh->ts) + test_resync) & 0xffff);
11742 fr->
ts = (iaxs[fr->
callno]->
last & 0xFFFF0000L) | ntohs(mh->ts);
11757 ast_debug(2,
"Callno %d: Blocked receiving control frame %d.\n",
11768 ast_debug(2,
"Callno %d: Config blocked receiving control frame %d.\n",
11839 if (iaxdebug && iaxs[fr->
callno]) {
11868 struct iax2_thread *
thread = data;
11880 struct iax2_thread *
thread = data;
11881 struct timeval wait;
11882 struct timespec ts;
11883 int put_into_idle = 0;
11884 int first_time = 1;
11889 pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &old_state);
11896 if (thread->
stop) {
11908 if (put_into_idle) {
11913 struct iax2_thread *t = NULL;
11916 ts.tv_sec = wait.tv_sec;
11917 ts.tv_nsec = wait.tv_usec * 1000;
11921 if (!put_into_idle || thread->
stop) {
11941 ts.tv_sec = wait.tv_sec;
11942 ts.tv_nsec = wait.tv_usec * 1000;
11957 if (thread->
stop) {
11974 #ifdef SCHED_MULTITHREADED
11994 #ifdef DEBUG_SCHED_MULTITHREAD
12012 if (!thread->
stop) {
12014 pthread_detach(pthread_self());
12020 pthread_cleanup_pop(1);
12041 int callno = reg->
callno;
12049 ast_debug(1,
"Unable to send registration request for '%s' without IP address\n", reg->
username);
12057 struct sockaddr_in reg_addr;
12059 ast_debug(3,
"Allocate call number\n");
12076 memset(&ied, 0,
sizeof(ied));
12092 struct sockaddr_in sin;
12096 memset(&cai, 0,
sizeof(cai));
12098 ast_debug(1,
"Provisioning '%s' from template '%s'\n", dest,
template);
12101 ast_debug(1,
"No provisioning found for template '%s'\n",
template);
12106 memcpy(&sin, end,
sizeof(sin));
12112 memset(&ied, 0,
sizeof(ied));
12119 if (iaxs[callno]) {
12122 sched, 15000,
auto_hangup, (
void *)(
long)callno);
12147 opts = strchr(sdata,
'|');
12151 if (chan->
tech != &iax2_tech) {
12155 if (!callno || !iaxs[callno] || !iaxs[callno]->
addr.sin_addr.s_addr) {
12160 ast_verb(3,
"Provisioned IAXY at '%s' with '%s'= %d\n",
12173 e->
command =
"iax2 provision";
12175 "Usage: iax2 provision <host> <template> [forced]\n"
12176 " Provisions the given peer or IP address using a template\n"
12177 " matching either 'template' or '*' if the template is not\n"
12178 " found. If 'forced' is specified, even empty provisioning\n"
12179 " fields will be provisioned as empty fields.\n";
12190 if (!strcasecmp(a->
argv[4],
"forced"))
12197 ast_cli(a->
fd,
"Unable to find peer/address '%s'\n", a->
argv[2]);
12199 ast_cli(a->
fd,
"No template (including wildcard) matching '%s'\n", a->
argv[3]);
12201 ast_cli(a->
fd,
"Provisioning '%s' with template '%s'%s\n", a->
argv[2], a->
argv[3], force ?
", forced" :
"");
12210 if (peer->
lastms > -1) {
12215 if ((callno = peer->
callno) > 0) {
12232 #ifdef SCHED_MULTITHREADED
12252 struct sockaddr_in peer_addr;
12267 if ((callno = peer->
callno) > 0) {
12306 if (iaxs[callno]) {
12334 struct sockaddr_in sin;
12340 memset(&pds, 0,
sizeof(pds));
12345 ast_log(
LOG_WARNING,
"No peer provided in the IAX2 dial string '%s'\n", (
char *) data);
12349 memset(&cai, 0,
sizeof(cai));
12361 sin.sin_port = htons(atoi(pds.
port));
12374 if ((new_callno =
make_trunk(callno, 1)) != -1)
12375 callno = new_callno;
12415 pthread_testcancel();
12429 struct iax2_thread *
thread;
12430 int threadcount = 0;
12470 ast_verb(2,
"%d helper threads started\n", threadcount);
12487 if (strstr(value,
"rsa"))
12489 if (strstr(value,
"md5"))
12491 if (strstr(value,
"plaintext"))
12505 sd = socket(AF_INET, SOCK_DGRAM, 0);
12511 res = bind(sd, sa, salen);
12527 struct sockaddr_in sin;
12537 addr =
strsep(&tmp,
":");
12541 port = atoi(portstr);
12546 sin_tmp.
ss.ss_family = AF_INET;
12553 sin.sin_family = AF_INET;
12554 res =
check_srcaddr((
struct sockaddr *) &sin,
sizeof(sin));
12557 sin.sin_port = htons(port);
12564 unsigned int orig_saddr = sin.sin_addr.s_addr;
12566 sin.sin_addr.s_addr = INADDR_ANY;
12568 sin.sin_addr.s_addr = orig_saddr;
12584 if (nonlocal == 1) {
12585 ast_log(
LOG_WARNING,
"Non-local or unbound address specified (%s) in sourceaddress for '%s', reverting to default\n",
12586 srcaddr, peer->
name);
12588 }
else if (nonlocal == 2) {
12589 ast_log(
LOG_WARNING,
"Unable to bind to sourceaddress '%s' for '%s', reverting to default\n",
12590 srcaddr, peer->
name);
12593 ast_debug(1,
"Using sourceaddress %s for '%s'\n", srcaddr, peer->
name);
12626 struct ast_ha *oldha = NULL;
12651 peer->
addr.
ss.ss_family = AF_INET;
12652 peer->
addr.
len =
sizeof(
struct sockaddr_in);
12690 if (!strcasecmp(v->
name,
"secret")) {
12692 }
else if (!strcasecmp(v->
name,
"mailbox")) {
12694 }
else if (!strcasecmp(v->
name,
"hasvoicemail")) {
12698 }
else if (!strcasecmp(v->
name,
"mohinterpret")) {
12700 }
else if (!strcasecmp(v->
name,
"mohsuggest")) {
12702 }
else if (!strcasecmp(v->
name,
"dbsecret")) {
12704 }
else if (!strcasecmp(v->
name,
"trunk")) {
12707 ast_log(
LOG_WARNING,
"Unable to support trunking on peer '%s' without a timing interface\n", peer->
name);
12710 }
else if (!strcasecmp(v->
name,
"auth")) {
12712 }
else if (!strcasecmp(v->
name,
"encryption")) {
12717 }
else if (!strcasecmp(v->
name,
"forceencryption")) {
12726 }
else if (!strcasecmp(v->
name,
"transfer")) {
12727 if (!strcasecmp(v->
value,
"mediaonly")) {
12733 }
else if (!strcasecmp(v->
name,
"jitterbuffer")) {
12735 }
else if (!strcasecmp(v->
name,
"forcejitterbuffer")) {
12737 }
else if (!strcasecmp(v->
name,
"host")) {
12738 if (!strcasecmp(v->
value,
"dynamic")) {
12761 }
else if (!strcasecmp(v->
name,
"defaultip")) {
12764 peer_defaddr_tmp.
ss.ss_family = AF_INET;
12770 }
else if (!strcasecmp(v->
name,
"sourceaddress")) {
12772 }
else if (!strcasecmp(v->
name,
"permit") ||
12773 !strcasecmp(v->
name,
"deny")) {
12775 }
else if (!strcasecmp(v->
name,
"mask")) {
12778 }
else if (!strcasecmp(v->
name,
"context")) {
12780 }
else if (!strcasecmp(v->
name,
"regexten")) {
12782 }
else if (!strcasecmp(v->
name,
"peercontext")) {
12784 }
else if (!strcasecmp(v->
name,
"port")) {
12790 }
else if (!strcasecmp(v->
name,
"username")) {
12792 }
else if (!strcasecmp(v->
name,
"allow")) {
12794 }
else if (!strcasecmp(v->
name,
"disallow")) {
12796 }
else if (!strcasecmp(v->
name,
"callerid")) {
12808 }
else if (!strcasecmp(v->
name,
"fullname")) {
12811 }
else if (!strcasecmp(v->
name,
"cid_number")) {
12814 }
else if (!strcasecmp(v->
name,
"sendani")) {
12816 }
else if (!strcasecmp(v->
name,
"inkeys")) {
12818 }
else if (!strcasecmp(v->
name,
"outkey")) {
12820 }
else if (!strcasecmp(v->
name,
"qualify")) {
12821 if (!strcasecmp(v->
value,
"no")) {
12823 }
else if (!strcasecmp(v->
value,
"yes")) {
12825 }
else if (sscanf(v->
value,
"%30d", &peer->
maxms) != 1) {
12826 ast_log(
LOG_WARNING,
"Qualification of peer '%s' should be 'yes', 'no', or a number of milliseconds at line %d of iax.conf\n", peer->
name, v->
lineno);
12829 }
else if (!strcasecmp(v->
name,
"qualifysmoothing")) {
12831 }
else if (!strcasecmp(v->
name,
"qualifyfreqok")) {
12833 ast_log(
LOG_WARNING,
"Qualification testing frequency of peer '%s' when OK should a number of milliseconds at line %d of iax.conf\n", peer->
name, v->
lineno);
12835 }
else if (!strcasecmp(v->
name,
"qualifyfreqnotok")) {
12837 ast_log(
LOG_WARNING,
"Qualification testing frequency of peer '%s' when NOT OK should be a number of milliseconds at line %d of iax.conf\n", peer->
name, v->
lineno);
12839 }
else if (!strcasecmp(v->
name,
"timezone")) {
12841 }
else if (!strcasecmp(v->
name,
"adsi")) {
12843 }
else if (!strcasecmp(v->
name,
"connectedline")) {
12846 }
else if (!strcasecmp(v->
value,
"send")) {
12849 }
else if (!strcasecmp(v->
value,
"receive")) {
12855 }
else if (!strcasecmp(v->
name,
"maxcallnumbers")) {
12861 }
else if (!strcasecmp(v->
name,
"requirecalltoken")) {
12865 }
else if (!strcasecmp(v->
value,
"auto")) {
12893 context =
"default";
12921 struct ast_ha *oldha = NULL;
12925 int oldcurauthreq = 0;
12926 char *varname = NULL, *varval = NULL;
12955 memset(user, 0,
sizeof(
struct iax2_user));
12982 if (!strcasecmp(v->
name,
"context")) {
12991 }
else if (!strcasecmp(v->
name,
"permit") ||
12992 !strcasecmp(v->
name,
"deny")) {
12994 }
else if (!strcasecmp(v->
name,
"setvar")) {
12996 if ((varval = strchr(varname,
'='))) {
13001 user->
vars = tmpvar;
13004 }
else if (!strcasecmp(v->
name,
"allow")) {
13006 }
else if (!strcasecmp(v->
name,
"disallow")) {
13008 }
else if (!strcasecmp(v->
name,
"trunk")) {
13011 ast_log(
LOG_WARNING,
"Unable to support trunking on user '%s' without a timing interface\n", user->
name);
13014 }
else if (!strcasecmp(v->
name,
"auth")) {
13016 }
else if (!strcasecmp(v->
name,
"encryption")) {
13021 }
else if (!strcasecmp(v->
name,
"forceencryption")) {
13030 }
else if (!strcasecmp(v->
name,
"transfer")) {
13031 if (!strcasecmp(v->
value,
"mediaonly")) {
13037 }
else if (!strcasecmp(v->
name,
"codecpriority")) {
13038 if(!strcasecmp(v->
value,
"caller"))
13040 else if(!strcasecmp(v->
value,
"disabled"))
13042 else if(!strcasecmp(v->
value,
"reqonly")) {
13046 }
else if (!strcasecmp(v->
name,
"immediate")) {
13048 }
else if (!strcasecmp(v->
name,
"jitterbuffer")) {
13050 }
else if (!strcasecmp(v->
name,
"forcejitterbuffer")) {
13052 }
else if (!strcasecmp(v->
name,
"dbsecret")) {
13054 }
else if (!strcasecmp(v->
name,
"secret")) {
13061 }
else if (!strcasecmp(v->
name,
"callerid")) {
13074 }
else if (!strcasecmp(v->
name,
"fullname")) {
13083 }
else if (!strcasecmp(v->
name,
"cid_number")) {
13092 }
else if (!strcasecmp(v->
name,
"accountcode")) {
13094 }
else if (!strcasecmp(v->
name,
"mohinterpret")) {
13096 }
else if (!strcasecmp(v->
name,
"mohsuggest")) {
13098 }
else if (!strcasecmp(v->
name,
"parkinglot")) {
13100 }
else if (!strcasecmp(v->
name,
"language")) {
13102 }
else if (!strcasecmp(v->
name,
"amaflags")) {
13109 }
else if (!strcasecmp(v->
name,
"inkeys")) {
13111 }
else if (!strcasecmp(v->
name,
"maxauthreq")) {
13115 }
else if (!strcasecmp(v->
name,
"adsi")) {
13117 }
else if (!strcasecmp(v->
name,
"connectedline")) {
13120 }
else if (!strcasecmp(v->
value,
"send")) {
13123 }
else if (!strcasecmp(v->
value,
"receive")) {
13129 }
else if (!strcasecmp(v->
name,
"requirecalltoken")) {
13133 }
else if (!strcasecmp(v->
value,
"auto")) {
13189 struct iax2_registry *reg;
13201 if (iaxs[callno]) {
13249 strcpy(accountcode,
"");
13250 strcpy(language,
"");
13251 strcpy(mohinterpret,
"");
13252 strcpy(mohsuggest,
"");
13271 const char *tosval;
13276 int subscribe_network_change = 1;
13282 static unsigned short int last_port=0;
13297 ast_log(
LOG_ERROR,
"Config file %s is in an invalid format. Aborting.\n", config_file);
13307 ast_log(
LOG_ERROR,
"Config file %s is in an invalid format. Aborting.\n", config_file);
13312 ast_log(
LOG_ERROR,
"Config file users.conf is in an invalid format. Aborting.\n");
13326 memset(&globalflags, 0,
sizeof(globalflags));
13334 default_parkinglot[0] =
'\0';
13361 if (!strcasecmp(v->
name,
"bindport")){
13365 portno = atoi(v->
value);
13366 }
else if (!strcasecmp(v->
name,
"pingtime"))
13367 ping_time = atoi(v->
value);
13368 else if (!strcasecmp(v->
name,
"iaxthreadcount")) {
13382 }
else if (!strcasecmp(v->
name,
"iaxmaxthreadcount")) {
13397 }
else if (!strcasecmp(v->
name,
"nochecksums")) {
13405 ast_log(
LOG_WARNING,
"Disabling RTP checksums is not supported on this operating system!\n");
13408 else if (!strcasecmp(v->
name,
"maxjitterbuffer"))
13409 maxjitterbuffer = atoi(v->
value);
13410 else if (!strcasecmp(v->
name,
"resyncthreshold"))
13411 resyncthreshold = atoi(v->
value);
13412 else if (!strcasecmp(v->
name,
"maxjitterinterps"))
13413 maxjitterinterps = atoi(v->
value);
13414 else if (!strcasecmp(v->
name,
"jittertargetextra"))
13415 jittertargetextra = atoi(v->
value);
13416 else if (!strcasecmp(v->
name,
"lagrqtime"))
13417 lagrq_time = atoi(v->
value);
13418 else if (!strcasecmp(v->
name,
"maxregexpire"))
13419 max_reg_expire = atoi(v->
value);
13420 else if (!strcasecmp(v->
name,
"minregexpire"))
13421 min_reg_expire = atoi(v->
value);
13422 else if (!strcasecmp(v->
name,
"bindaddr")) {
13429 if (strchr(v->
value,
':'))
13432 ast_verb(2,
"Binding IAX2 to '%s:%d'\n", v->
value, portno);
13433 if (defaultsockfd < 0)
13438 }
else if (!strcasecmp(v->
name,
"authdebug")) {
13440 }
else if (!strcasecmp(v->
name,
"encryption")) {
13442 if (!iax2_encryption) {
13445 }
else if (!strcasecmp(v->
name,
"forceencryption")) {
13450 if (iax2_encryption) {
13454 }
else if (!strcasecmp(v->
name,
"transfer")) {
13455 if (!strcasecmp(v->
value,
"mediaonly")) {
13461 }
else if (!strcasecmp(v->
name,
"codecpriority")) {
13462 if(!strcasecmp(v->
value,
"caller"))
13464 else if(!strcasecmp(v->
value,
"disabled"))
13466 else if(!strcasecmp(v->
value,
"reqonly")) {
13470 }
else if (!strcasecmp(v->
name,
"jitterbuffer"))
13472 else if (!strcasecmp(v->
name,
"forcejitterbuffer"))
13474 else if (!strcasecmp(v->
name,
"delayreject"))
13476 else if (!strcasecmp(v->
name,
"allowfwdownload"))
13478 else if (!strcasecmp(v->
name,
"rtcachefriends"))
13480 else if (!strcasecmp(v->
name,
"rtignoreregexpire"))
13482 else if (!strcasecmp(v->
name,
"rtupdate"))
13484 else if (!strcasecmp(v->
name,
"rtsavesysname"))
13486 else if (!strcasecmp(v->
name,
"trunktimestamps"))
13488 else if (!strcasecmp(v->
name,
"rtautoclear")) {
13489 int i = atoi(v->
value);
13491 global_rtautoclear = i;
13495 }
else if (!strcasecmp(v->
name,
"trunkfreq")) {
13496 trunkfreq = atoi(v->
value);
13497 if (trunkfreq < 10) {
13498 ast_log(
LOG_NOTICE,
"trunkfreq must be between 10ms and 1000ms, using 10ms instead.\n");
13500 }
else if (trunkfreq > 1000) {
13501 ast_log(
LOG_NOTICE,
"trunkfreq must be between 10ms and 1000ms, using 1000ms instead.\n");
13507 }
else if (!strcasecmp(v->
name,
"trunkmtu")) {
13508 mtuv = atoi(v->
value);
13510 global_max_trunk_mtu = 0;
13511 else if (mtuv >= 172 && mtuv < 4000)
13512 global_max_trunk_mtu = mtuv;
13516 }
else if (!strcasecmp(v->
name,
"trunkmaxsize")) {
13517 trunkmaxsize = atoi(v->
value);
13518 if (trunkmaxsize == 0)
13520 }
else if (!strcasecmp(v->
name,
"autokill")) {
13521 if (sscanf(v->
value,
"%30d", &x) == 1) {
13531 }
else if (!strcasecmp(v->
name,
"bandwidth")) {
13532 if (!strcasecmp(v->
value,
"low")) {
13534 }
else if (!strcasecmp(v->
value,
"medium")) {
13536 }
else if (!strcasecmp(v->
value,
"high")) {
13540 }
else if (!strcasecmp(v->
name,
"allow")) {
13542 }
else if (!strcasecmp(v->
name,
"disallow")) {
13544 }
else if (!strcasecmp(v->
name,
"register")) {
13546 }
else if (!strcasecmp(v->
name,
"iaxcompat")) {
13548 }
else if (!strcasecmp(v->
name,
"regcontext")) {
13552 }
else if (!strcasecmp(v->
name,
"tos")) {
13555 }
else if (!strcasecmp(v->
name,
"cos")) {
13558 }
else if (!strcasecmp(v->
name,
"parkinglot")) {
13560 }
else if (!strcasecmp(v->
name,
"accountcode")) {
13562 }
else if (!strcasecmp(v->
name,
"mohinterpret")) {
13564 }
else if (!strcasecmp(v->
name,
"mohsuggest")) {
13566 }
else if (!strcasecmp(v->
name,
"amaflags")) {
13573 }
else if (!strcasecmp(v->
name,
"language")) {
13575 }
else if (!strcasecmp(v->
name,
"maxauthreq")) {
13576 maxauthreq = atoi(v->
value);
13577 if (maxauthreq < 0)
13579 }
else if (!strcasecmp(v->
name,
"adsi")) {
13581 }
else if (!strcasecmp(v->
name,
"srvlookup")) {
13583 }
else if (!strcasecmp(v->
name,
"connectedline")) {
13586 }
else if (!strcasecmp(v->
value,
"send")) {
13589 }
else if (!strcasecmp(v->
value,
"receive")) {
13595 }
else if (!strcasecmp(v->
name,
"maxcallnumbers")) {
13596 if (sscanf(v->
value,
"%10hu", &global_maxcallno) != 1) {
13599 }
else if (!strcasecmp(v->
name,
"maxcallnumbers_nonvalidated")) {
13600 if (sscanf(v->
value,
"%10hu", &global_maxcallno_nonval) != 1) {
13603 }
else if (!strcasecmp(v->
name,
"calltokenoptional")) {
13607 }
else if (!strcasecmp(v->
name,
"subscribe_network_change_event")) {
13609 subscribe_network_change = 1;
13611 subscribe_network_change = 0;
13615 }
else if (!strcasecmp(v->
name,
"shrinkcallerid")) {
13628 if (subscribe_network_change) {
13634 if (defaultsockfd < 0) {
13638 ast_verb(2,
"Binding IAX2 to default address 0.0.0.0:%d\n", portno);
13653 if (min_reg_expire > max_reg_expire) {
13654 ast_log(
LOG_WARNING,
"Minimum registration interval of %d is more than maximum of %d, resetting minimum to %d\n",
13655 min_reg_expire, max_reg_expire, max_reg_expire);
13663 int genregisteriax;
13664 const char *hasiax, *registeriax;
13671 if (strcasecmp(cat,
"general")) {
13674 if (
ast_true(hasiax) || (!hasiax && genhasiax)) {
13689 if (
ast_true(registeriax) || (!registeriax && genregisteriax)) {
13702 snprintf(tmp,
sizeof(tmp),
"%s:%s@%s", username, secret, host);
13704 snprintf(tmp,
sizeof(tmp),
"%s@%s", username, host);
13716 if (strcasecmp(cat,
"general")) {
13718 if (!strcasecmp(cat,
"callnumberlimits")) {
13720 }
else if (utype) {
13721 if (!strcasecmp(utype,
"user") || !strcasecmp(utype,
"friend")) {
13728 if (!strcasecmp(utype,
"peer") || !strcasecmp(utype,
"friend")) {
13736 }
else if (strcasecmp(utype,
"user")) {
13737 ast_log(
LOG_WARNING,
"Unknown type '%s' for '%s' in %s\n", utype, cat, config_file);
13762 static const char config[] =
"iax.conf";
13763 struct iax2_registry *reg;
13771 trunk_timed = trunk_untimed = 0;
13772 trunk_nmaxmtu = trunk_maxmtu = 0;
13797 "Usage: iax2 reload\n"
13798 " Reloads IAX configuration from iax.conf\n";
13816 struct sockaddr_in sin;
13824 for (x = 0; x <
ARRAY_LEN(iaxs); x++) {
13828 if (iaxs[x] && !strcasecmp(data, iaxs[x]->dproot))
13836 memset(&cai, 0,
sizeof(cai));
13837 memset(&ied, 0,
sizeof(ied));
13838 memset(&pds, 0,
sizeof(pds));
13852 ast_debug(1,
"peer: %s, username: %s, password: %s, context: %s\n",
13891 int x, com[2], timeout, old = 0, outfd, doabort, callno;
13940 struct timeval start;
13959 timeout = iaxdefaulttimeout * 1000;
14005 if (write(dp->
waiters[x],
"asdf", 4) < 0) {
14025 ast_log(
LOG_NOTICE,
"iax2_exists: con: %s, exten: %s, pri: %d, cid: %s, data: %s\n", context, exten, priority, callerid ? callerid :
"<unknown>", data);
14027 if ((priority != 1) && (priority != 2))
14031 if ((dp =
find_cache(chan, data, context, exten, priority))) {
14048 ast_log(
LOG_NOTICE,
"iax2_canmatch: con: %s, exten: %s, pri: %d, cid: %s, data: %s\n", context, exten, priority, callerid ? callerid :
"<unknown>", data);
14050 if ((priority != 1) && (priority != 2))
14054 if ((dp =
find_cache(chan, data, context, exten, priority))) {
14071 ast_log(
LOG_NOTICE,
"iax2_matchmore: con: %s, exten: %s, pri: %d, cid: %s, data: %s\n", context, exten, priority, callerid ? callerid :
"<unknown>", data);
14073 if ((priority != 1) && (priority != 2))
14077 if ((dp =
find_cache(chan, data, context, exten, priority))) {
14097 ast_log(
LOG_NOTICE,
"iax2_exec: con: %s, exten: %s, pri: %d, cid: %s, data: %s, newstack: %d\n", context, exten, priority, callerid ? callerid :
"<unknown>", data, newstack);
14099 if (priority == 2) {
14108 }
else if (priority != 1)
14112 if ((dp =
find_cache(chan, data, context, exten, priority))) {
14115 ncontext = strchr(odata,
'/');
14119 snprintf(req,
sizeof(req),
"IAX2/%s/%s@%s", odata, exten, ncontext);
14121 snprintf(req,
sizeof(req),
"IAX2/%s/%s", odata, exten);
14123 ast_verb(3,
"Executing Dial('%s')\n", req);
14126 ast_log(
LOG_WARNING,
"Can't execute nonexistent extension '%s[@%s]' in data '%s'\n", exten, context, data);
14143 char *peername, *colname;
14148 if (!strcmp(peername,
"CURRENTCHANNEL")) {
14150 if (!chan || chan->
tech != &iax2_tech) {
14158 if ((colname = strchr(peername,
',')))
14166 if (!strcasecmp(colname,
"ip")) {
14168 }
else if (!strcasecmp(colname,
"status")) {
14170 }
else if (!strcasecmp(colname,
"mailbox")) {
14172 }
else if (!strcasecmp(colname,
"context")) {
14174 }
else if (!strcasecmp(colname,
"expire")) {
14175 snprintf(buf, len,
"%d", peer->
expire);
14176 }
else if (!strcasecmp(colname,
"dynamic")) {
14178 }
else if (!strcasecmp(colname,
"callerid_name")) {
14180 }
else if (!strcasecmp(colname,
"callerid_num")) {
14182 }
else if (!strcasecmp(colname,
"codecs")) {
14184 }
else if (!strncasecmp(colname,
"codec[", 6)) {
14185 char *codecnum, *ptr;
14189 codecnum = colname + 5;
14192 if ((ptr = strchr(codecnum,
']'))) {
14220 if (!chan || chan->
tech != &iax2_tech) {
14227 if (!(pvt = iaxs[callno])) {
14232 if (!strcasecmp(args,
"osptoken")) {
14234 }
else if (!strcasecmp(args,
"peerip")) {
14236 }
else if (!strcasecmp(args,
"peername")) {
14238 }
else if (!strcasecmp(args,
"secure_signaling") || !strcasecmp(args,
"secure_media")) {
14257 memset(&pds, 0,
sizeof(pds));
14261 ast_log(
LOG_WARNING,
"No peer provided in the IAX2 dial string '%s'\n", (
char *) data);
14265 ast_debug(3,
"Checking device state for device %s\n", pds.
peer);
14272 ast_debug(3,
"Found peer. What's device state of %s? addr=%u, defaddr=%u maxms=%d, lastms=%d\n",
14292 .description =
"IAX Remote Dialplan Switch",
14425 AST_CLI_DEFINE(handle_cli_iax2_test_jitter,
"Simulates jitter for testing"),
14426 AST_CLI_DEFINE(handle_cli_iax2_test_late,
"Test the receipt of a late frame"),
14427 AST_CLI_DEFINE(handle_cli_iax2_test_resync,
"Test a resync in received timestamps"),
14431 #ifdef TEST_FRAMEWORK
14435 .
path =
"/asterisk/channel/iax2/peers",
14436 .search =
"peers/peer/name=test_peer_data_provider"
14443 info->name =
"iax2_peers_get_data_test";
14444 info->category =
"/main/data/iax2/peers/";
14445 info->summary =
"IAX2 peers data providers unit test";
14446 info->description =
14447 "Tests whether the IAX2 peers data provider implementation works as expected.";
14454 peer =
build_peer(
"test_peer_data_provider", NULL, NULL, 0);
14495 .
path =
"/asterisk/channel/iax2/users",
14496 .search =
"users/user/name=test_user_data_provider"
14503 info->name =
"iax2_users_get_data_test";
14504 info->category =
"/main/data/iax2/users/";
14505 info->summary =
"IAX2 users data providers unit test";
14506 info->description =
14507 "Tests whether the IAX2 users data provider implementation works as expected.";
14513 user =
build_user(
"test_user_data_provider", NULL, NULL, 0);
14530 ast_test_status_update(test,
"Our data results did not return the test user created in the previous step.\n");
14557 struct iax2_thread_list *list_head = head;
14558 struct iax2_thread *
thread;
14562 pthread_t thread_id = thread->
threadid;
14568 pthread_join(thread_id, NULL);
14591 pthread_cancel(netthreadid);
14592 pthread_kill(netthreadid, SIGURG);
14593 pthread_join(netthreadid, NULL);
14596 for (x = 0; x <
ARRAY_LEN(iaxs); x++) {
14609 for (x = 0; x <
ARRAY_LEN(iaxs); x++) {
14619 #ifdef TEST_FRAMEWORK
14631 for (x = 0; x <
ARRAY_LEN(iaxsl); x++) {
14637 ao2_ref(iax_peercallno_pvts, -1);
14638 ao2_ref(iax_transfercallno_pvts, -1);
14641 ao2_ref(calltoken_ignores, -1);
14643 ao2_ref(callno_pool_trunk, -1);
14689 return match(&pvt2->addr, pvt2->peercallno, pvt2->callno, pvt,
14707 return match(&pvt2->transfer, pvt2->transfercallno, pvt2->callno, pvt,
14713 peers = users = iax_peercallno_pvts = iax_transfercallno_pvts = NULL;
14714 peercnts = callno_limits = calltoken_ignores = callno_pool = callno_pool_trunk = NULL;
14717 goto container_fail;
14719 goto container_fail;
14721 goto container_fail;
14723 goto container_fail;
14725 goto container_fail;
14727 goto container_fail;
14729 goto container_fail;
14731 goto container_fail;
14733 goto container_fail;
14745 if (iax_peercallno_pvts) {
14746 ao2_ref(iax_peercallno_pvts, -1);
14748 if (iax_transfercallno_pvts) {
14749 ao2_ref(iax_transfercallno_pvts, -1);
14754 if (callno_limits) {
14757 if (calltoken_ignores) {
14758 ao2_ref(calltoken_ignores, -1);
14763 if (callno_pool_trunk) {
14764 ao2_ref(callno_pool_trunk, -1);
14770 #define DATA_EXPORT_IAX2_PEER(MEMBER) \
14771 MEMBER(iax2_peer, name, AST_DATA_STRING) \
14772 MEMBER(iax2_peer, username, AST_DATA_STRING) \
14773 MEMBER(iax2_peer, secret, AST_DATA_PASSWORD) \
14774 MEMBER(iax2_peer, dbsecret, AST_DATA_PASSWORD) \
14775 MEMBER(iax2_peer, outkey, AST_DATA_STRING) \
14776 MEMBER(iax2_peer, regexten, AST_DATA_STRING) \
14777 MEMBER(iax2_peer, context, AST_DATA_STRING) \
14778 MEMBER(iax2_peer, peercontext, AST_DATA_STRING) \
14779 MEMBER(iax2_peer, mailbox, AST_DATA_STRING) \
14780 MEMBER(iax2_peer, mohinterpret, AST_DATA_STRING) \
14781 MEMBER(iax2_peer, mohsuggest, AST_DATA_STRING) \
14782 MEMBER(iax2_peer, inkeys, AST_DATA_STRING) \
14783 MEMBER(iax2_peer, cid_num, AST_DATA_STRING) \
14784 MEMBER(iax2_peer, cid_name, AST_DATA_STRING) \
14785 MEMBER(iax2_peer, zonetag, AST_DATA_STRING) \
14786 MEMBER(iax2_peer, parkinglot, AST_DATA_STRING) \
14787 MEMBER(iax2_peer, expiry, AST_DATA_SECONDS) \
14788 MEMBER(iax2_peer, callno, AST_DATA_INTEGER) \
14789 MEMBER(iax2_peer, lastms, AST_DATA_MILLISECONDS) \
14790 MEMBER(iax2_peer, maxms, AST_DATA_MILLISECONDS) \
14791 MEMBER(iax2_peer, pokefreqok, AST_DATA_MILLISECONDS) \
14792 MEMBER(iax2_peer, pokefreqnotok, AST_DATA_MILLISECONDS) \
14793 MEMBER(iax2_peer, historicms, AST_DATA_INTEGER) \
14794 MEMBER(iax2_peer, smoothing, AST_DATA_BOOLEAN) \
14795 MEMBER(iax2_peer, maxcallno, AST_DATA_INTEGER)
14847 #define DATA_EXPORT_IAX2_USER(MEMBER) \
14848 MEMBER(iax2_user, name, AST_DATA_STRING) \
14849 MEMBER(iax2_user, dbsecret, AST_DATA_PASSWORD) \
14850 MEMBER(iax2_user, accountcode, AST_DATA_STRING) \
14851 MEMBER(iax2_user, mohinterpret, AST_DATA_STRING) \
14852 MEMBER(iax2_user, mohsuggest, AST_DATA_STRING) \
14853 MEMBER(iax2_user, inkeys, AST_DATA_STRING) \
14854 MEMBER(iax2_user, language, AST_DATA_STRING) \
14855 MEMBER(iax2_user, cid_num, AST_DATA_STRING) \
14856 MEMBER(iax2_user, cid_name, AST_DATA_STRING) \
14857 MEMBER(iax2_user, parkinglot, AST_DATA_STRING) \
14858 MEMBER(iax2_user, maxauthreq, AST_DATA_INTEGER) \
14859 MEMBER(iax2_user, curauthreq, AST_DATA_INTEGER)
14866 struct ast_data *data_user, *data_authmethods, *data_enum_node;
14886 snprintf(auth,
sizeof(auth),
"Key: %s", user->
inkeys);
14896 if (!data_authmethods) {
14906 if (!data_enum_node) {
14944 AST_DATA_ENTRY(
"asterisk/channel/iax2/peers", &peers_data_provider),
14945 AST_DATA_ENTRY(
"asterisk/channel/iax2/users", &users_data_provider),
14951 static const char config[] =
"iax.conf";
14953 struct iax2_registry *reg = NULL;
14959 memset(iaxs, 0,
sizeof(iaxs));
14961 for (x = 0; x <
ARRAY_LEN(iaxsl); x++) {
15011 #ifdef TEST_FRAMEWORK
15045 ast_verb(2,
"IAX Ready and Listening\n");
15060 ast_realtime_require_field(
"iaxpeers",
"name",
RQ_CHAR, 10,
"ipaddr",
RQ_CHAR, 15,
"port",
RQ_UINTEGER2, 5,
"regseconds",
RQ_UINTEGER2, 6,
SENTINEL);
15072 .nonoptreq =
"res_crypto",
static char * ast_sockaddr_stringify_addr(const struct ast_sockaddr *addr)
Wrapper around ast_sockaddr_stringify_fmt() to return an address only.
int ast_io_wait(struct io_context *ioc, int howlong)
Waits for IO.
static ast_mutex_t iaxsl[ARRAY_LEN(iaxs)]
chan_iax2_pvt structure locks
static int iaxdefaultdpcache
static int peercnt_add(struct sockaddr_in *sin)
static void requirecalltoken_mark_auto(const char *name, int subclass)
static struct iax_frame * iaxfrdup2(struct iax_frame *fr)
static int acf_iaxvar_read(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
char mohsuggest[MAX_MUSICCLASS]
struct ast_channel * ast_waitfor_n(struct ast_channel **chan, int n, int *ms)
Waits for input on a group of channels Wait for input on an array of channels for a given # of millis...
Require call token validation after a successful registration using call token validation occurs...
int ast_queue_hangup(struct ast_channel *chan)
Queue a hangup frame.
union ast_frame_subclass subclass
int ast_hangup(struct ast_channel *chan)
Hang up a channel.
static char * handle_cli_iax2_set_debug(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
struct sockaddr_storage ss
static int load_module(void)
Load IAX2 module, load configuraiton —.
static int manager_iax2_show_registry(struct mansession *s, const struct message *m)
static uint16_t global_maxcallno_nonval
static void jb_error_output(const char *fmt,...)
void ast_party_connected_line_init(struct ast_party_connected_line *init)
Initialize the given connected line structure.
static char accountcode[AST_MAX_ACCOUNT_CODE]
int presentation
Q.931 encoded presentation-indicator encoded field.
static int iax2_sendhtml(struct ast_channel *c, int subclass, const char *data, int datalen)
unsigned int trunkdatalen
static int socket_process(struct iax2_thread *thread)
static char * complete_iax2_peers(const char *line, const char *word, int pos, int state, uint64_t flags)
void ast_set_callerid(struct ast_channel *chan, const char *cid_num, const char *cid_name, const char *cid_ani)
Set caller ID number, name and ANI and generate AMI event.
static int handle_error(void)
#define IAX_IE_IAX_UNKNOWN
int ast_matchmore_extension(struct ast_channel *c, const char *context, const char *exten, int priority, const char *callerid)
Looks to see if adding anything to this extension might match something. (exists ^ canmatch) ...
static char * handle_cli_iax2_show_threads(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
const ast_string_field secret
void iax_frame_subclass2str(enum iax_frame_subclass subclass, char *str, size_t len)
const ast_string_field rdnis
static char exten[AST_MAX_EXTENSION]
Main Channel structure associated with a channel.
struct timeval lasttxtime
static uint16_t DEFAULT_MAXCALLNO_LIMIT_NONVAL
static void build_rand_pad(unsigned char *buf, ssize_t len)
#define DIRECTION_INGRESS
#define AST_CLI_DEFINE(fn, txt,...)
#define IAX_RTSAVE_SYSNAME
char * str
Subscriber phone number (Malloced)
static int iax2_fixup(struct ast_channel *oldchannel, struct ast_channel *newchan)
#define IAX_TRUNKTIMESTAMPS
struct ast_party_connected_line connected
Channel Connected Line ID information.
#define IAX_IE_CAPABILITY2
#define IAX_CALLENCRYPTED(pvt)
#define AST_LIST_LOCK(head)
Locks a list.
static void free_context(struct iax2_context *con)
Asterisk locking-related definitions:
int iax_parse_ies(struct iax_ies *ies, unsigned char *data, int datalen)
void astman_append(struct mansession *s, const char *fmt,...)
static int make_trunk(unsigned short callno, int locked)
#define IAX_IE_CALLINGTNS
const ast_string_field osptoken
Asterisk main include file. File version handling, generic pbx functions.
#define AST_BRIDGE_IGNORE_SIGS
Ignore all signal frames except NULL.
#define ao2_link(arg1, arg2)
static const char config_file[]
#define AST_OPTION_AUDIO_MODE
static char language[MAX_LANGUAGE]
struct iax2_thread::@95 full_frames
struct ast_sched_thread * ast_sched_thread_destroy(struct ast_sched_thread *st)
Destroy a scheduler and its thread.
int ao2_container_count(struct ao2_container *c)
Returns the number of elements in a container.
const char * ast_variable_retrieve(const struct ast_config *config, const char *category, const char *variable)
Gets a variable.
void iax_showframe(struct iax_frame *f, struct ast_iax2_full_hdr *fhi, int rx, struct sockaddr_in *sin, int datalen)
static void free_signaling_queue_entry(struct signaling_queue_entry *s)
static struct iax2_peer * realtime_peer(const char *peername, struct sockaddr_in *sin)
#define AST_LIST_HEAD(name, type)
Defines a structure to be used to hold a list of specified type.
static const char config[]
const ast_string_field cid_num
The data tree to be returned by the callbacks and managed by functions local to this file...
char * str
Subscriber phone number (Malloced)
void ast_module_unref(struct ast_module *)
static int jittertargetextra
#define ast_copy_flags64(dest, src, flagz)
static struct iax2_peer * find_peer(const char *name, int realtime)
void ast_data_free(struct ast_data *root)
Release the allocated memory of a tree.
static char parkinglot[AST_MAX_CONTEXT]
void iax_set_output(void(*func)(const char *))
struct ast_frame ast_null_frame
struct ast_party_caller caller
Channel Caller ID information.
static int prune_addr_range_cb(void *obj, void *arg, int flags)
int iax_provision_build(struct iax_ie_data *provdata, unsigned int *signature, const char *template, int force)
static char * handle_cli_iax2_set_debug_jb(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
const ast_string_field exten
char * strsep(char **str, const char *delims)
static int create_addr(const char *peername, struct ast_channel *c, struct sockaddr_in *sin, struct create_addr_info *cai)
struct ast_app * pbx_findapp(const char *app)
Look up an application.
static int iax2_trunk_queue(struct chan_iax2_pvt *pvt, struct iax_frame *fr)
static int iax2_predestroy(int callno)
unsigned char calltoken_ie_len
static char * complete_iax2_unregister(const char *line, const char *word, int pos, int state)
static uint16_t DEFAULT_MAXCALLNO_LIMIT
int ast_callerid_split(const char *src, char *name, int namelen, char *num, int numlen)
static void __auth_reject(const void *nothing)
static pthread_t netthreadid
struct ast_sched_thread * ast_sched_thread_create(void)
Create a scheduler with a dedicated thread.
int pbx_exec(struct ast_channel *c, struct ast_app *app, const char *data)
Execute an application.
const ast_string_field uniqueid
static int send_apathetic_reply(unsigned short callno, unsigned short dcallno, struct sockaddr_in *sin, int command, int ts, unsigned char seqno, int sockfd, struct iax_ie_data *ied)
#define DIRECTION_OUTGRESS
int ast_codec_pref_string(struct ast_codec_pref *pref, char *buf, size_t size)
Dump audio codec preference list into a string.
#define DATA_EXPORT_IAX2_PEER(MEMBER)
String manipulation functions.
const ast_string_field dnid
int presentation
Q.931 presentation-indicator and screening-indicator encoded fields.
static void handle_deferred_full_frames(struct iax2_thread *thread)
Handle any deferred full frames for this thread.
static void realtime_update_peer(const char *peername, struct ast_sockaddr *sockaddr, time_t regtime)
int ast_channel_masquerade(struct ast_channel *original, struct ast_channel *clone)
Weird function made for call transfers.
CallerID (and other GR30) management and generation Includes code and algorithms from the Zapata libr...
static struct iax2_peer * peer_unref(struct iax2_peer *peer)
#define CALLTOKEN_HASH_FORMAT
#define ast_pthread_create_detached(a, b, c, d)
int ast_sockaddr_parse(struct ast_sockaddr *addr, const char *str, int flags)
Parse an IPv4 or IPv6 address string.
#define ast_alloca(size)
call __builtin_alloca to ensure we get gcc builtin semantics
struct ast_party_id id
Connected party ID.
static struct ao2_container * iax_peercallno_pvts
Another container of iax2_pvt structures.
static int iax2_write(struct ast_channel *c, struct ast_frame *f)
int ast_cli_unregister_multiple(struct ast_cli_entry *e, int len)
Unregister multiple commands.
void iax_frame_wrap(struct iax_frame *fr, struct ast_frame *f)
static void __attempt_transmit(const void *data)
#define ast_channel_unref(c)
Decrease channel reference count.
static int transfercallno_pvt_hash_cb(const void *obj, const int flags)
struct iax2_registry * reg
static int send_command_locked(unsigned short callno, char, int, unsigned int, const unsigned char *, int, int)
static const unsigned int CALLNO_POOL_BUCKETS
static int iax2_canmatch(struct ast_channel *chan, const char *context, const char *exten, int priority, const char *callerid, const char *data)
part of the IAX2 dial plan switch interface
struct ast_codec_pref prefs
int ast_db_get(const char *family, const char *key, char *out, int outlen)
Get key value specified by family/key.
static int check_provisioning(struct sockaddr_in *sin, int sockfd, char *si, unsigned int ver)
int ast_aes_set_encrypt_key(const unsigned char *key, ast_aes_encrypt_key *ctx)
Set an encryption key.
static int send_lagrq(const void *data)
#define ast_test_flag(p, flag)
static void mwi_event_cb(const struct ast_event *event, void *userdata)
static int addr_range_delme_cb(void *obj, void *arg, int flags)
static int exists(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
int ast_netsock_sockfd(const struct ast_netsock *ns)
static int ast_codec_interp_len(format_t format)
Gets duration in ms of interpolation frame for a format.
Support for translation of data formats. translate.c.
int ast_unload_realtime(const char *family)
Release any resources cached for a realtime family.
#define IAX_SHRINKCALLERID
const char * ast_var_value(const struct ast_var_t *var)
static void build_ecx_key(const unsigned char *digest, struct chan_iax2_pvt *pvt)
struct ast_party_name name
Subscriber name.
void ast_channel_unregister(const struct ast_channel_tech *tech)
Unregister a channel technology.
struct ast_party_id from
Who is redirecting the call (Sent to the party the call is redirected toward)
const ast_string_field name
static int register_verify(int callno, struct sockaddr_in *sin, struct iax_ies *ies)
Verify inbound registration.
static void __iax2_do_register_s(const void *data)
struct ast_var_t * ast_var_assign(const char *name, const char *value)
#define IAX_META_TRUNK_MINI
static struct sockaddr_in debugaddr
#define schedule_action(func, data)
static char * handle_cli_iax2_reload(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
struct ast_variable * vars
static int iax2_matchmore(struct ast_channel *chan, const char *context, const char *exten, int priority, const char *callerid, const char *data)
Part of the IAX2 Switch interface.
static void unlink_peer(struct iax2_peer *peer)
static int handle_call_token(struct ast_iax2_full_hdr *fh, struct iax_ies *ies, struct sockaddr_in *sin, int fd)
int ast_taskprocessor_push(struct ast_taskprocessor *tps, int(*task_exe)(void *datap), void *datap)
Push a task into the specified taskprocessor queue and signal the taskprocessor thread.
static struct ast_data_handler peers_data_provider
char context[AST_MAX_CONTEXT]
struct iax_frame * iax_frame_new(int direction, int datalen, unsigned int cacheable)
int iax_provision_reload(int reload)
int ast_apply_ha(const struct ast_ha *ha, const struct ast_sockaddr *addr)
Apply a set of rules to a given IP address.
struct ast_channel * ast_channel_release(struct ast_channel *chan)
Unlink and release reference to a channel.
const char * ast_var_name(const struct ast_var_t *var)
static int iax_park(struct ast_channel *chan1, struct ast_channel *chan2, const char *park_exten, const char *park_context)
static int iax_firmware_append(struct iax_ie_data *ied, const unsigned char *dev, unsigned int desc)
struct sockaddr_in * apparent_addr
#define ao2_iterator_next(arg1)
int ast_netsock_release(struct ast_netsock_list *list)
#define ast_set_flag(p, flag)
static int send_ping(const void *data)
void jb_setoutput(jb_output_function_t err, jb_output_function_t warn, jb_output_function_t dbg)
struct iax2_context * next
static int peercnt_hash_cb(const void *obj, const int flags)
struct sockaddr_in defaddr
static int max_reg_expire
static int iax2_poke_peer(struct iax2_peer *peer, int heldcall)
#define update_max_trunk()
#define DEADLOCK_AVOIDANCE(lock)
static struct ast_netsock_list * netsock
descriptor for a cli entry.
static int update_packet(struct iax_frame *f)
enum ast_pbx_result ast_pbx_start(struct ast_channel *c)
Create a new thread and start the PBX.
static int iax2_queue_frame(int callno, struct ast_frame *f)
Queue a frame to a call's owning asterisk channel.
const ast_string_field dbsecret
static int iax2_devicestate(void *data)
Part of the device state notification system —.
#define AST_LIST_UNLOCK(head)
Attempts to unlock a list.
static const time_t MAX_CALLTOKEN_DELAY
static char * handle_cli_iax2_show_users(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
struct ast_variable * ast_variable_browse(const struct ast_config *config, const char *category)
Goes through variables.
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
static void lock_both(unsigned short callno0, unsigned short callno1)
#define MARK_IAX_SUBCLASS_TX
enum iax_transfer_state transferring
static struct ast_datastore_info iax2_variable_datastore_info
int ast_party_id_presentation(const struct ast_party_id *id)
Determine the overall presentation value for the given party.
#define ao2_callback(c, flags, cb_fn, arg)
static int iax2_queryoption(struct ast_channel *c, int option, void *data, int *datalen)
struct ast_taskprocessor * ast_taskprocessor_get(const char *name, enum ast_tps_options create)
Get a reference to a taskprocessor with the specified name and create the taskprocessor if necessary...
Provide cryptographic signature routines.
static void __get_from_jb(const void *p)
unsigned char semirand[32]
#define IAX_ENCRYPT_KEYROTATE
void ast_verbose(const char *fmt,...)
enum iax_reg_state regstate
static int iax2_transmit(struct iax_frame *fr)
static int iaxmaxthreadcount
const ast_string_field language
static int auto_congest(const void *data)
#define IAX_FORCE_ENCRYPT
static int acf_channel_read(struct ast_channel *chan, const char *funcname, char *preparse, char *buf, size_t buflen)
static unsigned int iax2_datetime(const char *tz)
const ast_string_field inkeys
static void register_peer_exten(struct iax2_peer *peer, int onoff)
struct ast_tm * ast_localtime(const struct timeval *timep, struct ast_tm *p_tm, const char *zone)
Timezone-independent version of localtime_r(3).
#define IAX_DEFAULT_REG_EXPIRE
#define IAX_DELAYPBXSTART
#define IAX_LINGER_TIMEOUT
This entries are for multiple registers.
#define AST_CAUSE_FACILITY_REJECTED
#define AST_OPTION_DIGIT_DETECT
#define DEFAULT_MAX_THREAD_COUNT
static int load_objects(void)
static int iax2_exec(struct ast_channel *chan, const char *context, const char *exten, int priority, const char *callerid, const char *data)
Execute IAX2 dialplan switch.
struct sockaddr_in transfer
Structure for variables, used for configurations and for channel variables.
static void unwrap_timestamp(struct iax_frame *fr)
static unsigned int calc_timestamp(struct chan_iax2_pvt *p, unsigned int ts, struct ast_frame *f)
#define IAX_IE_MD5_RESULT
const ast_string_field challenge
static void iax_debug_output(const char *data)
void MD5Final(unsigned char digest[16], struct MD5Context *context)
#define MAX_TIMESTAMP_SKEW
unsigned short bridgecallno
struct ast_variable * iaxvars
#define ast_sched_thread_del(st, id)
Delete a scheduler entry.
#define IAX_DPSTATUS_MATCHMORE
#define IAX_DEFAULT_PORTNO
#define AST_MAX_ACCOUNT_CODE
#define IAX_IE_FIRMWAREVER
static force_inline int inaddrcmp(const struct sockaddr_in *sin1, const struct sockaddr_in *sin2)
Compares the source address and port of two sockaddr_in.
static int send_trunk(struct iax2_trunk_peer *tpeer, struct timeval *now)
enum jb_return_code jb_put(jitterbuf *jb, void *data, const enum jb_frame_type type, long ms, long ts, long now)
queue a frame
struct iax2_trunk_peer::@85 list
int ast_tvzero(const struct timeval t)
Returns true if the argument is 0,0.
format_t ast_codec_pref_index(struct ast_codec_pref *pref, int index)
Codec located at a particular place in the preference index.
return a reference to a taskprocessor, create one if it does not exist
struct ast_frame * ast_read(struct ast_channel *chan)
Reads a frame.
static int peercnt_remove_by_addr(struct sockaddr_in *sin)
struct ast_party_redirecting redirecting
Redirecting/Diversion information.
static struct iax2_user * user_ref(struct iax2_user *user)
const ast_string_field name
const ast_string_field language
#define AST_OPTION_OPRMODE
#define AST_TEST_REGISTER(cb)
static struct iax2_thread * find_idle_thread(void)
struct ast_event * ast_event_get_cached(enum ast_event_type,...)
Retrieve an event from the cache.
void ast_timer_close(struct ast_timer *handle)
Close an opened timing handle.
static void unlock_both(unsigned short callno0, unsigned short callno1)
static char * handle_cli_iax2_provision(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static struct ast_channel * iax2_request(const char *type, format_t format, const struct ast_channel *requestor, void *data, int *cause)
static void jb_debug_output(const char *fmt,...)
int ast_ignore_pattern(const char *context, const char *pattern)
Checks to see if a number should be ignored.
Structure for a data store type.
Continue if a match is not found in the hashed out bucket.
Configuration File Parser.
static char * handle_cli_iax2_show_netstats(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
struct ast_timer * ast_timer_open(void)
Open a timer.
static int wait_for_peercallno(struct chan_iax2_pvt *pvt)
unsigned char semirand[32]
char * str
Subscriber name (Malloced)
int * ast_io_add(struct io_context *ioc, int fd, ast_io_cb callback, short events, void *data)
Adds an IO context.
static int registry_authrequest(int callno)
void ast_unregister_switch(struct ast_switch *sw)
Unregister an alternative switch.
struct ast_variable * ast_load_realtime(const char *family,...) attribute_sentinel
Retrieve realtime configuration.
static void build_encryption_keys(const unsigned char *digest, struct chan_iax2_pvt *pvt)
uint32_t ast_sockaddr_ipv4(const struct ast_sockaddr *addr)
Get an IPv4 address of an ast_sockaddr.
#define ast_cond_wait(cond, mutex)
#define IAX_CODEC_NOPREFS
static int iax2_ack_registry(struct iax_ies *ies, struct sockaddr_in *sin, int callno)
Acknowledgment received for OUR registration.
Background DNS update manager.
int ast_str_append(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Append to a thread local dynamic string.
#define ast_cond_init(cond, attr)
static char * handle_cli_iax2_test_losspct(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
struct ast_netsock_list * ast_netsock_list_alloc(void)
#define IAX_CAPABILITY_FULLBANDWIDTH
struct ast_data * ast_data_get(const struct ast_data_query *query)
Retrieve a subtree from the asterisk data API.
static int matchmore(struct ast_channel *chan, const char *context, const char *exten, int priority, const char *callerid, const char *data)
unsigned short transfercallno
static int auto_hangup(const void *data)
format_t ast_best_codec(format_t fmts)
Pick the best audio codec.
static int copy(char *infile, char *outfile)
Utility function to copy a file.
#define IAX_IE_AUTOANSWER
struct timeval ast_tvnow(void)
Returns current timeval. Meant to replace calls to gettimeofday().
#define AST_DECLARE_STRING_FIELDS(field_list)
Declare the fields needed in a structure.
struct ast_dnsmgr_entry * dnsmgr
Number of new messages Used by: AST_EVENT_MWI Payload type: UINT.
static force_inline int ast_format_rate(format_t format)
Get the sample rate for a given format.
struct ast_data * ast_data_add_bool(struct ast_data *root, const char *childname, unsigned int boolean)
Add a boolean node type.
#define ast_set_flag64(p, flag)
Number of Used by: AST_EVENT_MWI Payload type: UINT.
#define AST_OPTION_TONE_VERIFY
#define ast_frame_byteswap_be(fr)
#define IAX_CODEC_USER_FIRST
#define ast_mutex_lock(a)
struct ast_codec_pref prefs
static void add_empty_calltoken_ie(struct chan_iax2_pvt *pvt, struct iax_ie_data *ied)
#define IAX_MAX_OSPTOKEN_SIZE
#define IAX_DPSTATUS_IGNOREPAT
static int iax2_sched_add(struct ast_sched_thread *st, int when, ast_sched_cb callback, const void *data)
static void user_destructor(void *obj)
static void set_hangup_source_and_cause(int callno, unsigned char causecode)
int ast_channel_register(const struct ast_channel_tech *tech)
Register a channel technology (a new channel driver) Called by a channel module to register the kind ...
struct ao2_iterator ao2_iterator_init(struct ao2_container *c, int flags)
Create an iterator for a container.
#define AST_MODULE_INFO(keystr, flags_to_set, desc, fields...)
#define ast_str_alloca(init_len)
int64_t ast_tvdiff_ms(struct timeval end, struct timeval start)
Computes the difference (in milliseconds) between two struct timeval instances.
Structure for a data store object.
static char * handle_cli_iax2_show_registry(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static int socket_read(int *id, int fd, short events, void *cbdata)
void ast_party_connected_line_free(struct ast_party_connected_line *doomed)
Destroy the connected line information contents.
static int peers_data_provider_get(const struct ast_data_search *search, struct ast_data *data_root)
struct ast_datastore * ast_channel_datastore_find(struct ast_channel *chan, const struct ast_datastore_info *info, const char *uid)
Find a datastore on a channel.
void ast_variables_destroy(struct ast_variable *var)
Free variable list.
static void * iax_park_thread(void *stuff)
#define IAX_DEBUGDIGEST(msg, key)
int ast_str2tos(const char *value, unsigned int *tos)
Convert a string to the appropriate TOS value.
static void log_jitterstats(unsigned short callno)
int iax_get_iframes(void)
static int iax2_sched_replace(int id, struct ast_sched_thread *st, int when, ast_sched_cb callback, const void *data)
static void network_change_event_subscribe(void)
int ast_sockaddr_cmp(const struct ast_sockaddr *a, const struct ast_sockaddr *b)
Compares two ast_sockaddr structures.
calltoken_peer_enum
Call token validation settings.
static int raw_hangup(struct sockaddr_in *sin, unsigned short src, unsigned short dst, int sockfd)
#define AST_CAUSE_NO_USER_RESPONSE
enum jb_return_code jb_get(jitterbuf *jb, jb_frame *frame, long now, long interpl)
get a frame for time now (receiver's time) return value is one of JB_OK: You've got frame! JB_DROP: H...
I/O Management (derived from Cheops-NG)
char * ast_cdr_flags2str(int flags)
static void send_signaling(struct chan_iax2_pvt *pvt)
This function must be called once we are sure the other side has given us a call number. All signaling is held here until that point.
static int iax2_getpeertrunk(struct sockaddr_in sin)
static int acf_iaxvar_write(struct ast_channel *chan, const char *cmd, char *data, const char *value)
static int schedule_delivery(struct iax_frame *fr, int updatehistory, int fromtrunk, unsigned int *tsout)
char * iax_prov_complete_template(const char *line, const char *word, int pos, int state)
int ast_dnsmgr_refresh(struct ast_dnsmgr_entry *entry)
Force a refresh of a dnsmgr entry.
static int manager_iax2_show_netstats(struct mansession *s, const struct message *m)
void ast_cli(int fd, const char *fmt,...)
struct ast_netsock * ast_netsock_find(struct ast_netsock_list *list, struct sockaddr_in *sa)
#define AST_LIST_REMOVE(head, elm, field)
Removes a specific entry from a list.
static char mohinterpret[MAX_MUSICCLASS]
static char * handle_cli_iax2_set_debug_trunk(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static struct iax2_user * build_user(const char *name, struct ast_variable *v, struct ast_variable *alt, int temponly)
Create in-memory user structure from configuration.
const ast_string_field linkedid
#define AST_DATA_ENTRY(__path, __handler)
#define update_max_nontrunk()
Structure used to handle a large number of boolean flags == used only in app_dial?
int iax_ie_append_versioned_uint64(struct iax_ie_data *ied, unsigned char ie, unsigned char version, uint64_t value)
static int iax2_digit_end(struct ast_channel *c, char digit, unsigned int duration)
enum ast_channel_adsicpe adsicpe
int ast_unregister_application(const char *app)
Unregister an application.
static char default_parkinglot[AST_MAX_CONTEXT]
static void network_change_event_cb(const struct ast_event *, void *)
static void set_config_destroy(void)
void ast_moh_stop(struct ast_channel *chan)
Turn off music on hold on a given channel.
#define AST_LIST_TRAVERSE_SAFE_END
Closes a safe loop traversal block.
void ast_free_ptr(void *ptr)
Socket address structure.
static char cid_num[AST_MAX_EXTENSION]
#define ast_cond_signal(cond)
struct ast_channel * ast_waitfor_nandfds(struct ast_channel **chan, int n, int *fds, int nfds, int *exception, int *outfd, int *ms)
Waits for activity on a group of channels.
struct ast_codec_pref prefs
static int iaxactivethreadcount
void ast_var_delete(struct ast_var_t *var)
#define ast_pthread_create_detached_background(a, b, c, d)
#define ast_verb(level,...)
int ast_sockaddr_cmp_addr(const struct ast_sockaddr *a, const struct ast_sockaddr *b)
Compares the addresses of two ast_sockaddr structures.
static struct callno_entry * get_unused_callno(int trunk, int validated)
struct ast_netsock * ast_netsock_bind(struct ast_netsock_list *list, struct io_context *ioc, const char *bindinfo, int defaultport, int tos, int cos, ast_io_cb callback, void *data)
static void pvt_destructor(void *obj)
void ast_config_destroy(struct ast_config *config)
Destroys a config.
static int manager_iax2_show_peer_list(struct mansession *s, const struct message *m)
callback to display iax peers in manager format
void MD5Init(struct MD5Context *context)
int ast_atomic_fetchadd_int(volatile int *p, int v)
Atomically add v to *p and return * the previous value of *p. This can be used to handle reference co...
const ast_string_field inkeys
int ast_custom_function_unregister(struct ast_custom_function *acf)
Unregister a custom function.
int ast_datastore_free(struct ast_datastore *datastore)
Free a data store object.
#define IAX_IE_CALLING_NUMBER
struct ast_channel * ast_channel_alloc(int needqueue, int state, const char *cid_num, const char *cid_name, const char *acctcode, const char *exten, const char *context, const char *linkedid, const int amaflag, const char *name_fmt,...)
int ast_canmatch_extension(struct ast_channel *c, const char *context, const char *exten, int priority, const char *callerid)
Looks for a valid matching extension.
ast_aes_decrypt_key mydcx
void ast_aes_decrypt(const unsigned char *in, unsigned char *out, const ast_aes_decrypt_key *ctx)
AES decrypt data.
static char * handle_cli_iax2_unregister(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
const char * pbx_builtin_getvar_helper(struct ast_channel *chan, const char *name)
Return a pointer to the value of the corresponding channel variable.
static struct ast_custom_function iaxpeer_function
const ast_string_field parkinglot
static struct iax2_context * build_context(const char *context)
static struct ao2_container * iax_transfercallno_pvts
Another container of iax2_pvt structures.
#define IAX_IE_CALLING_ANI
static struct ast_event_sub * network_change_event_subscription
int ast_context_remove_extension(const char *context, const char *extension, int priority, const char *registrar)
Simply remove extension from context.
String fields in structures.
static void ast_sockaddr_setnull(struct ast_sockaddr *addr)
Sets address addr to null.
#define IAX_META_TRUNK_SUPERMINI
int args
This gets set in ast_cli_register()
const char * astman_get_header(const struct message *m, char *var)
Get header from mananger transaction.
static int send_command_transfer(struct chan_iax2_pvt *, char, int, unsigned int, const unsigned char *, int)
#define IAX_CAPABILITY_LOWBANDWIDTH
static char * handle_cli_iax2_show_cache(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
pthread_cond_t ast_cond_t
struct chan_iax2_pvt::signaling_queue signaling_queue
static int resyncthreshold
static int iax2_queue_control_data(int callno, enum ast_control_frame_type control, const void *data, size_t datalen)
Queue a control frame on the ast_channel owner.
#define AST_LIST_HEAD_DESTROY(head)
Destroys a list head structure.
static void iax2_destroy_helper(struct chan_iax2_pvt *pvt)
#define ast_manager_event(chan, category, event, contents,...)
char * ast_cli_complete(const char *word, const char *const choices[], int pos)
int ast_channel_defer_dtmf(struct ast_channel *chan)
Defers DTMF so that you only read things like hangups and audio.
#define ast_pthread_create_background(a, b, c, d)
const char * ast_config_AST_SYSTEM_NAME
static void defer_full_frame(struct iax2_thread *from_here, struct iax2_thread *to_here)
Queue the last read full frame for processing by a certain thread.
#define IAX_IE_ENCRYPTION
int iax_get_oframes(void)
jitterbuf * jb_new(void)
new jitterbuf
#define ast_sockaddr_port(addr)
Get the port number of a socket address.
Custom localtime functions for multiple timezones.
internal representation of acl entries In principle user applications would have no need for this...
static int iax2_send(struct chan_iax2_pvt *pvt, struct ast_frame *f, unsigned int ts, int seqno, int now, int transfer, int final)
int ast_str_set(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Set a dynamic string using variable arguments.
struct ast_party_id id
Caller party ID.
static int __unload_module(void)
#define AST_OPTION_SECURE_MEDIA
int ast_set_write_format(struct ast_channel *chan, format_t format)
Sets write format on channel chan Set write format for channel to whichever component of "format" is ...
static void iax2_dprequest(struct iax2_dpcache *dp, int callno)
int ast_update_realtime(const char *family, const char *keyfield, const char *lookup,...) attribute_sentinel
Update realtime configuration.
static void sched_delay_remove(struct sockaddr_in *sin, struct callno_entry *callno_entry)
static int iax2_getpeername(struct sockaddr_in sin, char *host, int len)
AES_KEY ast_aes_encrypt_key
static int transmit_trunk(struct iax_frame *f, struct sockaddr_in *sin, int sockfd)
void ast_aes_encrypt(const unsigned char *in, unsigned char *out, const ast_aes_encrypt_key *ctx)
AES encrypt data.
struct iax2_context * contexts
int ast_get_time_t(const char *src, time_t *dst, time_t _default, int *consumed)
get values from config variables.
char * ast_strip_quoted(char *s, const char *beg_quotes, const char *end_quotes)
Strip leading/trailing whitespace and quotes from a string.
static int global_max_trunk_mtu
#define EVENT_FLAG_SYSTEM
static struct iax2_peer * build_peer(const char *name, struct ast_variable *v, struct ast_variable *alt, int temponly)
Create peer structure based on configuration.
static struct ast_data_handler users_data_provider
int ast_set_read_format(struct ast_channel *chan, format_t format)
Sets read format on channel chan Set read format for channel to whichever component of "format" is be...
#define ast_debug(level,...)
Log a DEBUG message.
static unsigned char compress_subclass(format_t subclass)
long jb_next(jitterbuf *jb)
when is the next frame due out, in receiver's time (0=EMPTY) This value may change as frames are adde...
#define MAX_TRUNK_MTU
Maximum transmission unit for the UDP packet in the trunk not to be fragmented. This is based on 1516...
static void * iax2_process_thread(void *data)
Context IE Used by AST_EVENT_MWI Payload type: str.
static struct iax2_user * realtime_user(const char *username, struct sockaddr_in *sin)
#define AST_DATA_HANDLER_VERSION
The Data API structures version.
#define IAX_MAX_OSPBLOCK_NUM
static struct ao2_container * callno_pool_trunk
void ast_netsock_unref(struct ast_netsock *ns)
int iax_ie_append_addr(struct iax_ie_data *ied, unsigned char ie, const struct sockaddr_in *sin)
int ast_devstate_changed(enum ast_device_state state, enum ast_devstate_cache cachable, const char *fmt,...)
Tells Asterisk the State for Device is changed.
char * ast_callerid_merge(char *buf, int bufsiz, const char *name, const char *num, const char *unknown)
static int authenticate_verify(struct chan_iax2_pvt *p, struct iax_ies *ies)
static int scheduled_destroy(const void *vid)
struct ast_party_id ani
Automatic Number Identification (ANI)
static void __send_lagrq(const void *data)
unsigned char * calltokendata
General Asterisk PBX channel definitions.
static void * iax2_dup_variable_datastore(void *)
static void iax_outputframe(struct iax_frame *f, struct ast_iax2_full_hdr *fhi, int rx, struct sockaddr_in *sin, int datalen)
static void memcpy_decrypt(unsigned char *dst, const unsigned char *src, int len, ast_aes_decrypt_key *dcx)
static int iax2_transfer(struct ast_channel *c, const char *dest)
static void resend_with_token(int callno, struct iax_frame *f, const char *newtoken)
static void iax2_destroy(int callno)
struct ast_codec_pref rprefs
struct timeval txtrunktime
struct ast_party_dialed::@155 number
Dialed/Called number.
static struct ao2_container * users
static void * dp_lookup_thread(void *data)
struct iax2_thread::@94 ffinfo
#define DEFAULT_RETRY_TIME
#define DEFAULT_THREAD_COUNT
#define AST_FRIENDLY_OFFSET
Offset into a frame's data buffer.
void ast_set_hangupsource(struct ast_channel *chan, const char *source, int force)
Set the source of the hangup in this channel and it's bridge.
Asterisk file paths, configured in asterisk.conf.
struct ast_channel * chan2
void io_context_destroy(struct io_context *ioc)
Destroys a context.
static struct ao2_container * peers
#define ast_sockaddr_from_sin(addr, sin)
Converts a struct sockaddr_in to a struct ast_sockaddr.
void ast_channel_undefer_dtmf(struct ast_channel *chan)
Unset defer DTMF flag on channel.
#define ast_mutex_trylock(a)
struct ast_sockaddr netmask
char exten[AST_MAX_EXTENSION]
static int authenticate_reply(struct chan_iax2_pvt *p, struct sockaddr_in *sin, struct iax_ies *ies, const char *override, const char *okey)
#define ast_test_status_update(a, b, c...)
static struct ast_generator gen
void ast_dnsmgr_release(struct ast_dnsmgr_entry *entry)
Free a DNS manager entry.
static int peer_hash_cb(const void *obj, const int flags)
#define ast_string_field_init(x, size)
Initialize a field pool and fields.
void(* schedfunc)(const void *)
#define ast_config_load(filename, flags)
Load a config file.
#define ast_manager_register_xml(a, b, c)
Register a manager callback using XML documentation to describe the manager.
#define AST_PTHREADT_NULL
static force_inline int attribute_pure ast_strlen_zero(const char *s)
enum iax2_thread_type type
unsigned char iax_unknown
struct sla_ringing_trunk * last
Data structure associated with a custom dialplan function.
Access Control of various sorts.
Asterisk internal frame definitions.
struct ast_data * ast_data_add_node(struct ast_data *root, const char *childname)
Add a container child.
Global IO variables are now in a struct in order to be made threadsafe.
static int callno_hash(const void *obj, const int flags)
#define IAX_RTCACHEFRIENDS
static char mohsuggest[MAX_MUSICCLASS]
#define AST_MAX_EXTENSION
unsigned short peercallno
Scheduler Routines (derived from cheops)
enum iax2_thread_iostate iostate
const ast_string_field zonetag
const ast_string_field mohinterpret
#define AST_STRING_FIELD(name)
Declare a string field.
#define ast_data_unregister(path)
char * osptokenblock[IAX_MAX_OSPBLOCK_NUM]
#define IAX_FIRMWARE_MAGIC
static char * handle_cli_iax2_show_peers(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
#define IAX_DPSTATUS_NONEXISTENT
#define AST_LIST_REMOVE_CURRENT(field)
Removes the current entry from a list during a traversal.
int iax_ie_append_short(struct iax_ie_data *ied, unsigned char ie, unsigned short value)
static int complete_transfer(int callno, struct iax_ies *ies)
char * ast_category_browse(struct ast_config *config, const char *prev)
Goes through categories.
#define ao2_ref(o, delta)
#define S_COR(a, b, c)
returns the equivalent of logic or for strings, with an additional boolean check: second one if not e...
#define IAX_IE_CALLING_NAME
static struct @82 frame_queue[IAX_MAX_CALLS]
a list of frames that may need to be retransmitted
const ast_string_field regexten
static int socket_process_meta(int packet_len, struct ast_iax2_meta_hdr *meta, struct sockaddr_in *sin, int sockfd, struct iax_frame *fr)
static int iax2_call(struct ast_channel *c, char *dest, int timeout)
long int ast_random(void)
const ast_string_field username
struct timeval ast_samp2tv(unsigned int _nsamp, unsigned int _rate)
Returns a timeval corresponding to the duration of n samples at rate r. Useful to convert samples to ...
static uint16_t total_nonval_callno_used
const ast_string_field parkinglot
#define IAX_IE_PROVISIONING
static void __auto_hangup(const void *nothing)
Require call token validation.
static int __send_command(struct chan_iax2_pvt *i, char type, int command, unsigned int ts, const unsigned char *data, int datalen, int seqno, int now, int transfer, int final)
static int try_firmware(char *s)
#define AST_BRIDGE_DTMF_CHANNEL_1
Report DTMF on channel 1.
static struct ao2_container * calltoken_ignores
static struct chan_iax2_pvt * new_iax(struct sockaddr_in *sin, const char *host)
static int function_iaxpeer(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
int ast_atomic_dec_and_test(volatile int *p)
decrement *p by 1 and return true if the variable has reached 0. Useful e.g. to check if a refcount h...
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)
Default calltoken required unless the ip is in the ignorelist.
A set of macros to manage forward-linked lists.
int ast_data_add_codecs(struct ast_data *root, const char *node_name, format_t capability)
Add the list of codecs in the root node based on the capability parameter.
static void __send_ping(const void *data)
#define AST_LIST_REMOVE_HEAD(head, field)
Removes and returns the head entry from a list.
static void delete_users(void)
int ast_app_inboxcount(const char *mailbox, int *newmsgs, int *oldmsgs)
Determine number of new/old messages in a mailbox.
static void dp_lookup(int callno, const char *context, const char *callednum, const char *callerid, int skiplock)
int ast_exists_extension(struct ast_channel *c, const char *context, const char *exten, int priority, const char *callerid)
Determine whether an extension exists.
struct ast_party_id ani
Automatic Number Identification (ANI)
#define ast_data_register_multiple(data_entries, entries)
static int unload_module(void)
int iax_provision_version(unsigned int *version, const char *template, int force)
#define IAX2_TRUNK_PREFACE
static void iax2_free_variable_datastore(void *)
static int timing_read(int *id, int fd, short events, void *cbdata)
const ast_string_field accountcode
static int calltoken_required(struct sockaddr_in *sin, const char *name, int subclass)
Structure to describe a channel "technology", ie a channel driver See for examples: ...
static int peercnt_remove_cb(const void *obj)
Core PBX routines and definitions.
static int user_delme_cb(void *obj, void *arg, int flags)
int ast_queue_frame(struct ast_channel *chan, struct ast_frame *f)
Queue one or more frames to a channel's frame queue.
int ast_check_hangup(struct ast_channel *chan)
Check to see if a channel is needing hang up.
static int complete_dpreply(struct chan_iax2_pvt *pvt, struct iax_ies *ies)
static int __do_deliver(void *data)
static void poke_all_peers(void)
#define AST_OPTION_FAX_DETECT
#define IAX_RECVCONNECTEDLINE
enum calltoken_peer_enum calltoken_required
#define AST_CAUSE_DESTINATION_OUT_OF_ORDER
#define ast_data_add_structure(structure_name, root, structure)
static void store_by_peercallno(struct chan_iax2_pvt *pvt)
struct iax2_trunk_peer * next
static int peer_status(struct iax2_peer *peer, char *status, int statuslen)
peer_status: Report Peer status in character string
static struct sched_context * sched
The list of nodes with their search requirement.
char peercontext[AST_MAX_CONTEXT]
static struct ao2_container * callno_pool
void ast_sha1_hash(char *output, const char *input)
Produces SHA1 hash based on input string.
#define AST_LIST_HEAD_STATIC(name, type)
Defines a structure to be used to hold a list of specified type, statically initialized.
static int maxjitterbuffer
jitterbuf: an application-independent jitterbuffer jitterbuf.c
static int iax2_answer(struct ast_channel *c)
static int set_config(const char *config_file, int reload)
Load configuration.
struct ast_party_dialed dialed
Dialed/Called information.
static int iax2_queue_hangup(int callno)
Queue a hangup frame on the ast_channel owner.
static int iax2_provision(struct sockaddr_in *end, int sockfd, const char *dest, const char *template, int force)
static int attribute_pure iax2_allow_new(int frametype, int subclass, int inbound)
static int iax2_register(const char *value, int lineno)
const char * ast_config_AST_DATA_DIR
static int replace_callno(const void *obj)
static void reload_firmware(int unload)
static struct ast_taskprocessor * transmit_processor
void MD5Update(struct MD5Context *context, unsigned char const *buf, unsigned len)
The AMI - Asterisk Manager Interface - is a TCP protocol created to manage Asterisk with third-party ...
#define AST_LIST_HEAD_NOLOCK(name, type)
Defines a structure to be used to hold a list of specified type (with no lock).
#define ast_strdupa(s)
duplicate a string in memory from the stack
ast_aes_decrypt_key mydcx
#define IAX_IE_CALLED_NUMBER
static int iax2_setoption(struct ast_channel *c, int option, void *data, int datalen)
int ast_connected_line_parse_data(const unsigned char *data, size_t datalen, struct ast_party_connected_line *connected)
Parse connected line indication frame data.
const ast_string_field outkey
static int iaxdynamicthreadcount
static int iax2_poke_peer_s(const void *data)
#define AST_CAUSE_FACILITY_NOT_SUBSCRIBED
static void iax2_frame_free(struct iax_frame *fr)
int ast_timer_ack(const struct ast_timer *handle, unsigned int quantity)
Acknowledge a timer event.
char * path
Path to the node to retrieve.
static void set_peercnt_limit(struct peercnt *peercnt)
ast_control_frame_type
Internal control frame subtype field values.
char * ast_getformatname(format_t format)
Get the name of a format.
#define IAX_MAX_OSPBLOCK_SIZE
#define AST_OPTION_FLAG_REQUEST
int ast_tvcmp(struct timeval _a, struct timeval _b)
Compres two struct timeval instances returning -1, 0, 1 if the first arg is smaller, equal or greater to the second.
static int iax2_indicate(struct ast_channel *c, int condition, const void *data, size_t datalen)
#define AST_LIST_INSERT_TAIL(head, elm, field)
Appends a list entry to the tail of a list.
static struct ast_data_entry iax2_data_providers[]
int attribute_pure ast_true(const char *val)
Make sure something is true. Determine if a string containing a boolean value is "true". This function checks to see whether a string passed to it is an indication of an "true" value. It checks to see if the string is "yes", "true", "y", "t", "on" or "1".
const ast_string_field accountcode
Implementation of Inter-Asterisk eXchange, version 2 iax2-parser.c iax2-parser.h chan_iax2.c.
The descriptor of a dynamic string XXX storage will be optimized later if needed We use the ts field ...
static int iax2_vnak(int callno)
const ast_string_field mohinterpret
static void destroy_firmware(struct iax_firmware *cur)
const ast_string_field parkinglot
const ast_string_field peer
static unsigned int fix_peerts(struct timeval *rxtrunktime, int callno, unsigned int ts)
static int peer_set_sock_cb(void *obj, void *arg, int flags)
#define ast_sockaddr_set_port(addr, port)
Sets the port number of a socket address.
void ast_data_remove_node(struct ast_data *root, struct ast_data *child)
Remove a node that was added using ast_data_add_.
#define AST_OPTION_RELAXDTMF
static struct chan_iax2_pvt * iaxs[IAX_MAX_CALLS]
an array of iax2 pvt structures
int plan
Q.931 Type-Of-Number and Numbering-Plan encoded fields.
#define AST_TEST_UNREGISTER(cb)
static void iax2_process_thread_cleanup(void *data)
static struct ast_codec_pref prefs
int ast_remaining_ms(struct timeval start, int max_ms)
Calculate remaining milliseconds given a starting timestamp and upper bound.
static void iax_error_output(const char *data)
static char * handle_cli_iax2_show_peer(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
Show one peer in detail.
enum jb_return_code jb_setconf(jitterbuf *jb, jb_conf *conf)
set jitterbuf conf
static struct ast_frame * iax2_read(struct ast_channel *c)
const ast_string_field mohsuggest
static struct ast_netsock_list * outsock
#define IAX_FORCEJITTERBUF
#define IAX_IE_AUTHMETHODS
int ast_aes_set_decrypt_key(const unsigned char *key, ast_aes_decrypt_key *ctx)
Set a decryption key.
static void __iax2_poke_peer_s(const void *data)
struct iax2_peer * peerpoke
static int len(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)
static struct iax2_user * user_unref(struct iax2_user *user)
int ast_cdr_amaflags2int(const char *flag)
Convert a string to a detail record AMA flag.
enum ast_channel_state _state
struct ast_channel * ast_bridged_channel(struct ast_channel *chan)
Find bridged channel.
char mohinterpret[MAX_MUSICCLASS]
const ast_string_field inkeys
static int network_change_event_sched_cb(const void *data)
const ast_string_field mohinterpret
static int iax2_sendtext(struct ast_channel *c, const char *text)
struct timeval ast_tvadd(struct timeval a, struct timeval b)
Returns the sum of two timevals a + b.
Connected Line/Party information.
static void peercnt_modify(unsigned char reg, uint16_t limit, struct ast_sockaddr *sockaddr)
static int set_peercnt_limit_all_cb(void *obj, void *arg, int flags)
static char * ast_sockaddr_stringify(const struct ast_sockaddr *addr)
Wrapper around ast_sockaddr_stringify_fmt() with default format.
const ast_string_field name
static int min_reg_expire
static int iax2_sendimage(struct ast_channel *c, struct ast_frame *img)
static struct ast_channel_tech iax2_tech
int ast_moh_start(struct ast_channel *chan, const char *mclass, const char *interpclass)
Turn on music on hold on a given channel.
static int send_command_immediate(struct chan_iax2_pvt *, char, int, unsigned int, const unsigned char *, int, int)
static int transmit_frame(void *data)
const ast_string_field mohsuggest
static void save_osptoken(struct iax_frame *fr, struct iax_ies *ies)
void ast_log(int level, const char *file, int line, const char *function, const char *fmt,...)
Used for sending a log message This is the standard logger function. Probably the only way you will i...
#define AST_OPTION_SECURE_SIGNALING
Do not require call token validation.
static int iax2_poke_peer_cb(void *obj, void *arg, int flags)
#define ast_cond_destroy(cond)
format_t ast_codec_choose(struct ast_codec_pref *pref, format_t formats, int find_best)
Select the best audio format according to preference list from supplied options. If "find_best" is no...
static int iaxdynamicthreadnum
#define ao2_alloc(data_size, destructor_fn)
struct ast_datastore * ast_datastore_alloc(const struct ast_datastore_info *info, const char *uid)
#define AST_PRES_NUMBER_NOT_AVAILABLE
int ast_get_ip(struct ast_sockaddr *addr, const char *hostname)
Get the IP address given a hostname.
#define AST_LIST_LAST(head)
Returns the last entry contained in a list.
const ast_string_field username
#define IAX_ALLOWFWDOWNLOAD
static int pvt_cmp_cb(void *obj, void *arg, int flags)
const ast_string_field ani
static int maxjitterinterps
static int ast_data_retrieve_int(struct ast_data *tree, const char *path)
Retrieve the integer value of a node.
struct ast_bridge * bridge
#define AST_LIST_TRAVERSE(head, var, field)
Loops over (traverses) the entries in a list.
static struct ast_flags64 globalflags
void iax_set_error(void(*func)(const char *))
#define AST_LIST_ENTRY(type)
Declare a forward link structure inside a list entry.
static struct ast_threadstorage buf1
#define AST_LIST_INSERT_HEAD(head, elm, field)
Inserts a list entry at the head of a list.
static int peer_set_srcaddr(struct iax2_peer *peer, const char *srcaddr)
Parse the "sourceaddress" value, lookup in netsock list and set peer's sockfd. Defaults to defaults...
static int decrypt_frame(int callno, struct ast_iax2_full_hdr *fh, struct ast_frame *f, int *datalen)
int ast_sign(struct ast_key *key, char *msg, char *sig)
Sign a message signature using a given private key.
const ast_string_field host
static int iax2_encryption
static const char tdesc[]
struct sched_context * ast_sched_thread_get_context(struct ast_sched_thread *st)
Get the scheduler context for a given ast_sched_thread.
static int manager_iax2_show_peers(struct mansession *s, const struct message *m)
callback to display iax peers in manager
static void vnak_retransmit(int callno, int last)
#define ao2_find(arg1, arg2, arg3)
#define ast_channel_unlock(chan)
#define IAX_TRANSFERMEDIA
#define IAX_IE_FWBLOCKDESC
char context[AST_MAX_CONTEXT]
static int addr_range_hash_cb(const void *obj, const int flags)
struct chan_iax2_pvt::@88 dpentries
static void parse_dial_string(char *data, struct parsed_dial_string *pds)
Parses an IAX dial string into its component parts.
static void __iax2_poke_noanswer(const void *data)
struct ast_var_t::@158 entries
const char * ast_inet_ntoa(struct in_addr ia)
thread-safe replacement for inet_ntoa().
#define AST_CAUSE_UNREGISTERED
#define AST_LIST_HEAD_INIT(head)
Initializes a list head structure.
AES_KEY ast_aes_decrypt_key
static int user_hash_cb(const void *obj, const int flags)
static void cleanup_thread_list(void *head)
int ast_str2cos(const char *value, unsigned int *cos)
Convert a string to the appropriate COS value.
#define IAX_IE_CODEC_PREFS
int ast_register_switch(struct ast_switch *sw)
Register an alternative dialplan switch.
static int randomcalltokendata
unsigned char * trunkdata
static int iax_check_version(char *dev)
static void insert_idle_thread(struct iax2_thread *thread)
#define IAX_RTIGNOREREGEXPIRE
int ast_write(struct ast_channel *chan, struct ast_frame *frame)
Write a frame to a channel This function writes the given frame to the indicated channel.
static int decode_frame(ast_aes_decrypt_key *dcx, struct ast_iax2_full_hdr *fh, struct ast_frame *f, int *datalen)
static int send_command_final(struct chan_iax2_pvt *, char, int, unsigned int, const unsigned char *, int, int)
static format_t capability
char callednum[AST_MAX_EXTENSION]
static int cache_get_callno_locked(const char *data)
static int get_auth_methods(const char *value)
struct ast_variable * vars
#define DATASTORE_INHERIT_FOREVER
char context[AST_MAX_EXTENSION]
const ast_string_field cid_num
An API for managing task processing threads that can be shared across modules.
static int iaxthreadcount
static void iax2_ami_channelupdate(struct chan_iax2_pvt *pvt)
Send manager event at call setup to link between Asterisk channel name and IAX2 call identifiers...
int ast_timer_fd(const struct ast_timer *handle)
Get a poll()-able file descriptor for a timer.
int ast_timer_set_rate(const struct ast_timer *handle, unsigned int rate)
Set the timing tick rate.
int iax_ie_append_raw(struct iax_ie_data *ied, unsigned char ie, const void *data, int datalen)
static int iax2_trunk_expired(struct iax2_trunk_peer *tpeer, struct timeval *now)
if(yyss+yystacksize-1<=yyssp)
static struct iax2_dpcache * find_cache(struct ast_channel *chan, const char *data, const char *context, const char *exten, int priority)
static void __auto_congest(const void *nothing)
struct iax2_dpcache::@91 peer_list
#define ast_set2_flag64(p, value, flag)
structure to hold users read from users.conf
void ao2_iterator_destroy(struct ao2_iterator *i)
Destroy a container iterator.
#define ast_string_field_build(x, field, fmt, args...)
Set a field to a complex (built) value.
static void * cleanup(void *unused)
static void reg_source_db(struct iax2_peer *p)
Structure used to handle boolean flags.
static void * network_thread(void *ignore)
static int iax2_poke_noanswer(const void *data)
static int create_callno_pools(void)
static char * handle_cli_iax2_show_stats(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
#define ast_clear_flag64(p, flag)
int ast_realtime_require_field(const char *family,...) attribute_sentinel
Inform realtime what fields that may be stored.
#define IAX_DPSTATUS_CANEXIST
#define ast_clear_flag(p, flag)
#define IAX_CAPABILITY_MEDBANDWIDTH
static char cid_name[AST_MAX_EXTENSION]
static char * regstate2str(int regstate)
static struct ast_cli_entry cli_iax2[]
char peercontext[AST_MAX_CONTEXT]
static void iax2_lock_owner(int callno)
static int user_cmp_cb(void *obj, void *arg, int flags)
static int expire_registry(const void *data)
const ast_string_field context
static int send_packet(struct iax_frame *f)
static struct iax2_user * find_user(const char *name)
int ast_get_ip_or_srv(struct ast_sockaddr *addr, const char *hostname, const char *service)
Get the IP address given a hostname and optional service.
static int start_network_thread(void)
int pbx_builtin_setvar_helper(struct ast_channel *chan, const char *name, const char *value)
Add a variable to the channel variable stack, removing the most recently set value for the same name...
uint32_t ast_event_get_ie_uint(const struct ast_event *event, enum ast_event_ie_type ie_type)
Get the value of an information element that has an integer payload.
static int reload_config(void)
static char * handle_cli_iax2_set_mtu(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
Set trunk MTU from CLI.
int iax_ie_append(struct iax_ie_data *ied, unsigned char ie)
#define IAX_IE_CALLINGTON
void ast_free_ha(struct ast_ha *ha)
Free a list of HAs.
#define AST_PRES_ALLOWED_USER_NUMBER_PASSED_SCREEN
unsigned char readbuf[4096]
#define EVENT_FLAG_REPORTING
static void remove_by_transfercallno(struct chan_iax2_pvt *pvt)
static int check_srcaddr(struct sockaddr *sa, socklen_t salen)
Check if address can be used as packet source.
struct ast_event_sub * mwi_event_sub
const ast_string_field secret
size_t ast_str_strlen(const struct ast_str *buf)
Returns the current length of the string stored within buf.
static int get_from_jb(const void *p)
static void save_rr(struct iax_frame *fr, struct iax_ies *ies)
int transit_network_select
Transit Network Select.
struct hostent * ast_gethostbyname(const char *host, struct ast_hostent *hp)
Thread-safe gethostbyname function to use in Asterisk.
#define AST_LIST_HEAD_INIT_NOLOCK(head)
Initializes a list head structure.
static int encrypt_frame(ast_aes_encrypt_key *ecx, struct ast_iax2_full_hdr *fh, unsigned char *poo, int *datalen)
const ast_string_field mohsuggest
static int try_transfer(struct chan_iax2_pvt *pvt, struct iax_ies *ies)
struct ast_variable * vars
A ast_taskprocessor structure is a singleton by name.
#define AST_CAUSE_NO_ROUTE_DESTINATION
#define IAX_IE_CALLINGPRES
static int update_registry(struct sockaddr_in *sin, int callno, char *devtype, int fd, unsigned short refresh)
void ast_event_destroy(struct ast_event *event)
Destroy an event.
#define AST_FORMAT_SLINEAR
#define ast_channel_ref(c)
Increase channel reference count.
int ast_add_extension(const char *context, int replace, const char *extension, int priority, const char *label, const char *callerid, const char *application, void *data, void(*datad)(void *), const char *registrar)
Add and extension to an extension context.
static int __find_callno(unsigned short callno, unsigned short dcallno, struct sockaddr_in *sin, int new, int sockfd, int return_locked, int check_dcallno)
#define IAX_PROTO_VERSION
When we need to walk through a container, we use an ao2_iterator to keep track of the current positio...
static struct io_context * io
static void merge_encryption(struct chan_iax2_pvt *p, unsigned int enc)
int ast_netsock_init(struct ast_netsock_list *list)
static int check_access(int callno, struct sockaddr_in *sin, struct iax_ies *ies)
Standard Command Line Interface.
static void update_jbsched(struct chan_iax2_pvt *pvt)
int ast_db_del(const char *family, const char *key)
Delete entry in astdb.
struct ast_event_sub * ast_event_subscribe(enum ast_event_type event_type, ast_event_cb_t cb, const char *description, void *userdata,...)
Subscribe to events.
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
static int iaxdefaulttimeout
#define ao2_container_alloc(arg1, arg2, arg3)
int ast_dnsmgr_lookup(const char *name, struct ast_sockaddr *result, struct ast_dnsmgr_entry **dnsmgr, const char *service)
Allocate and initialize a DNS manager entry.
#define S_OR(a, b)
returns the equivalent of logic or for strings: first one if not empty, otherwise second one...
void * ast_taskprocessor_unreference(struct ast_taskprocessor *tps)
Unreference the specified taskprocessor and its reference count will decrement.
struct timeval ast_tv(ast_time_t sec, ast_suseconds_t usec)
Returns a timeval from sec, usec.
ast_app: A registered application
static void prune_peers(void)
#define DATA_EXPORT_IAX2_USER(MEMBER)
int ast_codec_get_samples(struct ast_frame *f)
Returns the number of samples contained in the frame.
int attribute_pure ast_false(const char *val)
Make sure something is false. Determine if a string containing a boolean value is "false"...
Implementation of the IAX2 protocol.
#define IAX_IE_RR_DROPPED
int ast_cli_register_multiple(struct ast_cli_entry *e, int len)
Register multiple commands.
#define AST_OPTION_RXGAIN
static char * handle_cli_iax2_prune_realtime(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
#define ast_realloc(a, b)
static void store_by_transfercallno(struct chan_iax2_pvt *pvt)
int iax_ie_append_int(struct iax_ie_data *ied, unsigned char ie, unsigned int value)
static void remove_by_peercallno(struct chan_iax2_pvt *pvt)
enum jb_return_code jb_getinfo(jitterbuf *jb, jb_info *stats)
get jitterbuf info: only "statistics" may be valid
int ast_setstate(struct ast_channel *chan, enum ast_channel_state)
Change the state of a channel.
static struct iax2_trunk_peer * find_tpeer(struct sockaddr_in *sin, int fd)
struct ast_channel * owner
int ast_async_goto(struct ast_channel *chan, const char *context, const char *exten, int priority)
Set the channel to next execute the specified dialplan location.
static struct iax2_peer * peer_ref(struct iax2_peer *peer)
const ast_string_field mailbox
static int __iax2_show_peers(int fd, int *total, struct mansession *s, const int argc, const char *const argv[])
const ast_string_field cid_name
static int send_command(struct chan_iax2_pvt *, char, int, unsigned int, const unsigned char *, int, int)
int ast_queue_control_data(struct ast_channel *chan, enum ast_control_frame_type control, const void *data, size_t datalen)
Queue a control frame with payload.
static int users_data_provider_get(const struct ast_data_search *search, struct ast_data *data_root)
static int apply_context(struct iax2_context *con, const char *context)
Application convenience functions, designed to give consistent look and feel to Asterisk apps...
static void prune_users(void)
#define DEFAULT_TRUNKDATA
static int find_callno_locked(unsigned short callno, unsigned short dcallno, struct sockaddr_in *sin, int new, int sockfd, int full_frame)
char * ast_getformatname_multiple(char *buf, size_t size, format_t format)
Get the names of a set of formats.
int ast_check_signature(struct ast_key *key, const char *msg, const char *sig)
Check the authenticity of a message signature using a given public key.
struct ast_dnsmgr_entry * dnsmgr
const ast_string_field accountcode
static char * handle_cli_iax2_show_callno_limits(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
Data structure associated with a single frame of data.
static void jb_warning_output(const char *fmt,...)
#define AST_DATA_STRUCTURE(__struct, __name)
struct callno_entry * callno_entry
Internal Asterisk hangup causes.
static char regcontext[AST_MAX_CONTEXT]
static int authenticate_request(int call_num)
static int auth_reject(const void *data)
void ast_context_destroy(struct ast_context *con, const char *registrar)
Destroy a context (matches the specified context (or ANY context if NULL)
#define IAX_IE_RSA_RESULT
#define AST_TEST_DEFINE(hdr)
void ast_codec_pref_convert(struct ast_codec_pref *pref, char *buf, size_t size, int right)
Shift an audio codec preference list up or down 65 bytes so that it becomes an ASCII string...
unsigned int ospblocklength[IAX_MAX_OSPBLOCK_NUM]
static void encmethods_to_str(int e, struct ast_str **buf)
static void network_change_event_unsubscribe(void)
static int addr_range_cmp_cb(void *obj, void *arg, int flags)
static uint16_t global_maxcallno
static int queue_signalling(struct chan_iax2_pvt *pvt, struct ast_frame *f)
All frames other than that of type AST_FRAME_IAX must be held until we have received a destination ca...
int(* ast_sched_cb)(const void *data)
callback for a cheops scheduler A cheops scheduler callback takes a pointer with callback data and ...
static int iax2_do_register_s(const void *data)
IAX2 Provisioning protocol.
int ast_dnsmgr_changed(struct ast_dnsmgr_entry *entry)
Check is see if a dnsmgr entry has changed.
const ast_string_field cid_name
#define IAX_IE_FWBLOCKDATA
static int iax2_start_transfer(unsigned short callno0, unsigned short callno1, int mediaonly)
static void stop_stuff(int callno)
static int iax2_digit_begin(struct ast_channel *c, char digit)
struct ast_ha * ast_append_ha(const char *sense, const char *stuff, struct ast_ha *path, int *error)
Add a new rule to a list of HAs.
int ast_db_put(const char *family, const char *key, const char *value)
Store value addressed by family/key.
#define IAX_IE_CALLED_CONTEXT
static int iax2_append_register(const char *hostname, const char *username, const char *secret, const char *porta)
#define IAX_AUTH_PLAINTEXT
struct timeval ast_tvsub(struct timeval a, struct timeval b)
Returns the difference of two timevals a - b.
Channels have this property if they can accept input with jitter; i.e. most VoIP channels.
#define ast_sockaddr_to_sin(addr, sin)
Converts a struct ast_sockaddr to a struct sockaddr_in.
#define ast_set_flags_to64(p, flag, value)
void iax_frame_free(struct iax_frame *fr)
int ast_sched_thread_add(struct ast_sched_thread *st, int when, ast_sched_cb cb, const void *data)
Add a scheduler entry.
static int pvt_hash_cb(const void *obj, const int flags)
int ast_parking_ext_valid(const char *exten_str, struct ast_channel *chan, const char *context)
Determine if parking extension exists in a given context.
#define AST_LIST_TRAVERSE_SAFE_BEGIN(head, var, field)
Loops safely over (traverses) the entries in a list.
enum ast_frame_type frametype
struct ast_variable * next
#define IAX_ENCRYPT_AES128
static int __schedule_action(void(*func)(const void *data), const void *data, const char *funcname)
static struct adsi_event events[]
#define IAX_IE_APPARENT_ADDR
char context[AST_MAX_CONTEXT]
static int iax2_hangup(struct ast_channel *c)
#define ast_mutex_init(pmutex)
const ast_string_field parkinglot
#define ast_channel_trylock(chan)
static int get_encrypt_methods(const char *s)
unsigned char valid
TRUE if the name information is valid/present.
static int attempt_transmit(const void *data)
static int find_callno(unsigned short callno, unsigned short dcallno, struct sockaddr_in *sin, int new, int sockfd, int full_frame)
void jb_destroy(jitterbuf *jb)
destroy jitterbuf
#define CONFIG_STATUS_FILEINVALID
static char context[AST_MAX_CONTEXT]
int iax_ie_append_byte(struct iax_ie_data *ied, unsigned char ie, unsigned char dat)
Call Parking and Pickup API Includes code and algorithms from the Zapata library. ...
const ast_string_field dbsecret
#define ast_mutex_destroy(a)
static int last_authmethod
A query to the data API is specified in this structure.
#define IAX_SENDCONNECTEDLINE
struct ast_context * ast_context_find_or_create(struct ast_context **extcontexts, struct ast_hashtab *exttable, const char *name, const char *registrar)
Register a new context or find an existing one.
const ast_string_field cid_name
#define AST_LIST_INSERT_BEFORE_CURRENT(elm, field)
Inserts a list entry before the current entry during a traversal.
static int iax2_exists(struct ast_channel *chan, const char *context, const char *exten, int priority, const char *callerid, const char *data)
Part of the IAX2 switch interface.
static unsigned int calc_txpeerstamp(struct iax2_trunk_peer *tpeer, int sampms, struct timeval *now)
static int ast_cli_netstats(struct mansession *s, int fd, int limit_fmt)
static int iax2_prov_app(struct ast_channel *chan, const char *data)
const ast_string_field context
static int peer_delme_cb(void *obj, void *arg, int flags)
#define IAX_IE_TRANSFERID
void ast_shrink_phone_number(char *n)
Shrink a phone number in place to just digits (more accurately it just removes ()'s, .'s, and -'s...
struct timeval rxtrunktime
static int iax2_key_rotate(const void *vpvt)
static int registry_rerequest(struct iax_ies *ies, int callno, struct sockaddr_in *sin)
struct ast_iax2_firmware_header * fwh
static format_t iax2_capability
#define ASTERISK_GPL_KEY
The text the key() function should return.
#define AST_CAUSE_CALL_REJECTED
static void spawn_dp_lookup(int callno, const char *context, const char *callednum, const char *callerid)
#define manager_event(category, event, contents,...)
External routines may send asterisk manager events this way.
const ast_string_field secret
static struct ast_timer * timer
#define AST_CAUSE_BEARERCAPABILITY_NOTAVAIL
struct ast_data * ast_data_add_str(struct ast_data *root, const char *childname, const char *string)
Add a string node type.
Asterisk module definitions.
const ast_string_field cid_num
static struct hostent * hp
int iax_ie_append_str(struct iax_ie_data *ied, unsigned char ie, const char *str)
static void peercnt_remove(struct peercnt *peercnt)
enum jb_return_code jb_getall(jitterbuf *jb, jb_frame *frameout)
unconditionally get frames from jitterbuf until empty
static snd_pcm_format_t format
union ast_frame::@172 data
struct ast_channel_tech * tech
static int global_rtautoclear
static int match(struct sockaddr_in *sin, unsigned short callno, unsigned short dcallno, const struct chan_iax2_pvt *cur, int check_dcallno)
enum calltoken_peer_enum calltoken_required
int ast_channel_datastore_add(struct ast_channel *chan, struct ast_datastore *datastore)
Add a datastore to a channel.
int iax_provision_unload(void)
Persistant data storage (akin to *doze registry)
static void construct_rr(struct chan_iax2_pvt *pvt, struct iax_ie_data *iep)
struct ast_data * ast_data_add_int(struct ast_data *root, const char *childname, int value)
Add an integer node type.
static int(* iax2_regfunk)(const char *username, int onoff)
#define ast_string_field_free_memory(x)
free all memory - to be called before destroying the object
struct ast_event_sub * ast_event_unsubscribe(struct ast_event_sub *event_sub)
Un-subscribe from events.
ast_context: An extension context
static struct ao2_container * callno_limits
static char * handle_cli_iax2_show_channels(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
#define IAX_MAX_OSPBUFF_SIZE
static struct ast_switch iax2_switch
unsigned char valid
TRUE if the number information is valid/present.
static int peer_cmp_cb(void *obj, void *arg, int flags)
#define ao2_unlink(arg1, arg2)
#define ast_cond_timedwait(cond, mutex, time)
static struct ast_custom_function iaxvar_function
static unsigned int calc_rxstamp(struct chan_iax2_pvt *p, unsigned int offset)
static int peercnt_cmp_cb(void *obj, void *arg, int flags)
int inet_aton(const char *cp, struct in_addr *pin)
int ast_data_search_match(const struct ast_data_search *search, struct ast_data *data)
Check the current generated node to know if it matches the search condition.
#define ast_custom_function_register(acf)
Register a custom function.
const ast_string_field language
static int network_change_event_sched_id
uint32_t version
Structure version.
static int iax2_do_register(struct iax2_registry *reg)
#define AST_CAUSE_CONGESTION
struct ast_context * ast_context_find(const char *name)
Find a context.
static void build_callno_limits(struct ast_variable *v)
#define IAX_IE_CAPABILITY
static struct ast_channel * ast_iax2_new(int callno, int state, format_t capability, const char *linkedid, unsigned int cachable)
Create new call, interface with the PBX core.
#define AST_BRIDGE_DTMF_CHANNEL_0
Report DTMF on channel 0.
int ast_do_masquerade(struct ast_channel *chan)
Start masquerading a channel.
char exten[AST_MAX_EXTENSION]
Timing source management.
static void signal_condition(ast_mutex_t *lock, ast_cond_t *cond)
#define ast_register_application_xml(app, execute)
Register an application using XML documentation.
struct ast_key * ast_key_get(const char *key, int type)
Retrieve a key.
struct ast_variable * ast_variable_new(const char *name, const char *value, const char *filename)
const ast_string_field peercontext
Structure for mutex and tracking information.
static int iax2_is_control_frame_allowed(int subtype)
static void memcpy_encrypt(unsigned char *dst, const unsigned char *src, int len, ast_aes_encrypt_key *ecx)
static char mailbox[AST_MAX_EXTENSION]
format_t ast_translator_best_choice(format_t *dsts, format_t *srcs)
Chooses the best translation path.
int ast_parse_allow_disallow(struct ast_codec_pref *pref, format_t *mask, const char *list, int allowing)
Parse an "allow" or "deny" line in a channel or device configuration and update the capabilities mask...
static format_t uncompress_subclass(unsigned char csub)
The structure of the node handler.
static int addr_range_match_address_cb(void *obj, void *arg, int flags)
#define CALLTOKEN_IE_FORMAT
int ast_manager_unregister(char *action)
Unregister a registered manager command.
unsigned int trunkdataalloc
static int add_calltoken_ignore(const char *addr)
#define ASTERISK_FILE_VERSION(file, version)
Register/unregister a source code file with the core.
static int authenticate(const char *challenge, const char *secret, const char *keyn, int authmethods, struct iax_ie_data *ied, struct sockaddr_in *sin, struct chan_iax2_pvt *pvt)
#define AST_OPTION_TXGAIN
static int transfercallno_pvt_cmp_cb(void *obj, void *arg, int flags)
static char * ast_sockaddr_stringify_host(const struct ast_sockaddr *addr)
Wrapper around ast_sockaddr_stringify_fmt() to return an address only, suitable for a URL (with brack...
#define CONFIG_STATUS_FILEUNCHANGED
#define ast_mutex_unlock(a)
void ast_copy_ha(const struct ast_ha *from, struct ast_ha *to)
Copy the contents of one HA to another.
static char hostname[MAXHOSTNAMELEN]
void ast_codec_pref_prepend(struct ast_codec_pref *pref, format_t format, int only_if_existing)
Prepend an audio codec to a preference list, removing it first if it was already there.
static void peer_destructor(void *obj)
static force_inline int attribute_pure ast_str_hash(const char *str)
Compute a hash value on a string.
#define AST_SCHED_DEL_SPINLOCK(sched, id, lock)
schedule task to get deleted releasing the lock between attempts
static void __expire_registry(const void *data)
#define IAX_DPSTATUS_EXISTS
void jb_reset(jitterbuf *jb)
reset jitterbuf
#define ast_string_field_set(x, field, data)
Set a field to a simple string value.
static struct ao2_container * peercnts
#define DEFAULT_FREQ_NOTOK
void astman_send_listack(struct mansession *s, const struct message *m, char *msg, char *listflag)
Send ack in manager list transaction.
static char * handle_cli_iax2_show_firmware(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
struct ast_module * ast_module_ref(struct ast_module *)
struct ast_data * ast_data_add_password(struct ast_data *root, const char *childname, const char *string)
Add a password node type.
struct ast_party_number number
Subscriber phone number.
static int auth_fail(int callno, int failcode)
#define ast_test_flag64(p, flag)
int ast_park_call_exten(struct ast_channel *park_me, struct ast_channel *parker, const char *park_exten, const char *park_context, int timeout, int *extout)
Park a call and read back parked location.
struct io_context * io_context_create(void)
Creates a context Create a context for I/O operations Basically mallocs an IO structure and sets up s...
static const char * ast_data_retrieve_string(struct ast_data *tree, const char *path)
Retrieve the string value of a node.
struct ast_channel * chan1