61#include <sys/socket.h> 
   62#include <netinet/in.h> 
   64#include <netinet/in_systm.h> 
   65#include <netinet/ip.h> 
  305#define SCHED_MULTITHREADED 
  309#define DEBUG_SCHED_MULTITHREAD 
  313static int nochecksums = 0;
 
  316#define PTR_TO_CALLNO(a) ((unsigned short)(unsigned long)(a)) 
  317#define CALLNO_TO_PTR(a) ((void *)(unsigned long)(a)) 
  319#define DEFAULT_THREAD_COUNT 10 
  320#define DEFAULT_MAX_THREAD_COUNT 100 
  321#define DEFAULT_RETRY_TIME 1000 
  322#define MEMORY_SIZE 100 
  323#define DEFAULT_DROP 3 
  327#define MIN_REUSE_TIME      60   
  334static const char tdesc[] = 
"Inter Asterisk eXchange Driver (Ver 2)";
 
  339#define MAX_TRUNK_MTU 1240 
  344#define DEFAULT_CONTEXT "default" 
  364#define MAX_TRUNKDATA           640 * 200        
  397#define IAX_CAPABILITY_FULLBANDWIDTH    0xFFFF 
  399#define IAX_CAPABILITY_MEDBANDWIDTH (IAX_CAPABILITY_FULLBANDWIDTH & \ 
  401                     ~AST_FORMAT_SLIN16 &    \ 
  402                     ~AST_FORMAT_SIREN7 &       \ 
  403                     ~AST_FORMAT_SIREN14 &      \ 
 
  409#define IAX_CAPABILITY_LOWBANDWIDTH (IAX_CAPABILITY_MEDBANDWIDTH & \ 
  411                     ~AST_FORMAT_G726_AAL2 &    \ 
 
  414#define IAX_CAPABILITY_LOWFREE      (IAX_CAPABILITY_LOWBANDWIDTH & \ 
 
  418#define DEFAULT_MAXMS       2000         
  419#define DEFAULT_FREQ_OK     60 * 1000    
  420#define DEFAULT_FREQ_NOTOK  10 * 1000    
  431#define AUTH_METHOD_NAMES_BUFSIZE 19 
  446        pos += sprintf(pos, 
"|RSA");
 
  449        pos += sprintf(pos, 
"|MD5");
 
  452        pos += sprintf(pos, 
"|plaintext");
 
 
  464#define IAX_CALLENCRYPTED(pvt) \ 
  465    (ast_test_flag64(pvt, IAX_ENCRYPTED) && ast_test_flag64(pvt, IAX_KEYPOPULATED)) 
 
  467#define IAX_DEBUGDIGEST(msg, key) do { \ 
  469        char digest[33] = ""; \ 
  474        for (idx = 0; idx < 16; idx++) \ 
  475            sprintf(digest + (idx << 1), "%02hhx", (unsigned char) key[idx]); \ 
  477        ast_log(LOG_NOTICE, msg " IAX_COMMAND_RTKEY to rotate key to '%s'\n", digest); \ 
 
  491static int test_late = 0;
 
  492static int test_resync = 0;
 
  493static int test_jit = 0;
 
  494static int test_jitpct = 0;
 
  522#define IAX_HASCALLERID         (uint64_t)(1LLU << 0)     
  523#define IAX_DELME               (uint64_t)(1LLU << 1)     
  524#define IAX_TEMPONLY            (uint64_t)(1LLU << 2)     
  525#define IAX_TRUNK               (uint64_t)(1LLU << 3)     
  526#define IAX_NOTRANSFER          (uint64_t)(1LLU << 4)     
  527#define IAX_USEJITTERBUF        (uint64_t)(1LLU << 5)     
  528#define IAX_DYNAMIC             (uint64_t)(1LLU << 6)     
  529#define IAX_SENDANI             (uint64_t)(1LLU << 7)     
  530#define IAX_RTSAVE_SYSNAME      (uint64_t)(1LLU << 8)     
  531#define IAX_ALREADYGONE         (uint64_t)(1LLU << 9)     
  532#define IAX_PROVISION           (uint64_t)(1LLU << 10)    
  533#define IAX_QUELCH              (uint64_t)(1LLU << 11)    
  534#define IAX_ENCRYPTED           (uint64_t)(1LLU << 12)    
  535#define IAX_KEYPOPULATED        (uint64_t)(1LLU << 13)    
  536#define IAX_CODEC_USER_FIRST    (uint64_t)(1LLU << 14)    
  537#define IAX_CODEC_NOPREFS       (uint64_t)(1LLU << 15)    
  538#define IAX_CODEC_NOCAP         (uint64_t)(1LLU << 16)    
  539#define IAX_RTCACHEFRIENDS      (uint64_t)(1LLU << 17)    
  540#define IAX_RTUPDATE            (uint64_t)(1LLU << 18)    
  541#define IAX_RTAUTOCLEAR         (uint64_t)(1LLU << 19)    
  542#define IAX_RTIGNOREREGEXPIRE   (uint64_t)(1LLU << 21)    
  543#define IAX_TRUNKTIMESTAMPS     (uint64_t)(1LLU << 22)    
  544#define IAX_TRANSFERMEDIA       (uint64_t)(1LLU << 23)    
  545#define IAX_MAXAUTHREQ          (uint64_t)(1LLU << 24)    
  546#define IAX_DELAYPBXSTART       (uint64_t)(1LLU << 25)    
  547#define IAX_ALLOWFWDOWNLOAD     (uint64_t)(1LLU << 26)    
  548#define IAX_IMMEDIATE           (uint64_t)(1LLU << 27)    
  549#define IAX_SENDCONNECTEDLINE   (uint64_t)(1LLU << 28)    
  550#define IAX_RECVCONNECTEDLINE   (uint64_t)(1LLU << 29)    
  551#define IAX_FORCE_ENCRYPT       (uint64_t)(1LLU << 30)    
  552#define IAX_SHRINKCALLERID      (uint64_t)(1LLU << 31)    
  662#define IAX2_TRUNK_PREFACE (sizeof(struct iax_frame) + sizeof(struct ast_iax2_meta_hdr) + sizeof(struct ast_iax2_meta_trunk_hdr)) 
  728#define MIN_RETRY_TIME      100 
  729#define MAX_RETRY_TIME      10000 
  731#define MAX_JITTER_BUFFER   50 
  732#define MIN_JITTER_BUFFER   10 
  734#define DEFAULT_TRUNKDATA   640 * 10     
  736#define MAX_TIMESTAMP_SKEW  160      
  739#define TS_GAP_FOR_JB_RESYNC    5000 
  742#define MARK_IAX_SUBCLASS_TX    0x8000 
  975#define PTR_TO_CALLNO_ENTRY(a) ((uint16_t)(unsigned long)(a)) 
  976#define CALLNO_ENTRY_TO_PTR(a) ((void *)(unsigned long)(a)) 
  978#define CALLNO_ENTRY_SET_VALIDATED(a) ((a) |= 0x8000) 
  979#define CALLNO_ENTRY_IS_VALIDATED(a)  ((a) & 0x8000) 
  980#define CALLNO_ENTRY_GET_CALLNO(a)    ((a) & 0x7FFF) 
 1021#define MAX_PEER_BUCKETS 17 
 1023#define MAX_PEER_BUCKETS 563 
 1027#define MAX_USER_BUCKETS MAX_PEER_BUCKETS 
 1137#ifdef SCHED_MULTITHREADED 
 1141#ifdef DEBUG_SCHED_MULTITHREAD 
 
 1247#define TRUNK_CALL_START    (IAX_MAX_CALLS / 2) 
 1286    va_start(
args, fmt);
 
 
 1298    va_start(
args, fmt);
 
 
 1310    va_start(
args, fmt);
 
 
 1343static int send_command_locked(
unsigned short callno, 
char, 
int, 
unsigned int, 
const unsigned char *, 
int, 
int);
 
 1368    .description = 
tdesc,
 
 
 1409        if (!
iaxs[callno] || !
iaxs[callno]->owner) {
 
 
 1440    if (subtype == -1) {
 
 
 1578    ast_verb(1, 
"IAX, got a network change message, renewing all IAX registrations.\n");
 
 
 1596    .
type = 
"IAX2_VARIABLE",
 
 
 1724#ifdef SCHED_MULTITHREADED 
 1728    static time_t lasterror;
 
 1733        thread->schedfunc = func;
 
 1734        thread->scheddata = data;
 
 1736#ifdef DEBUG_SCHED_MULTITHREAD 
 1743    if (t != lasterror) {
 
 1745        ast_debug(1, 
"Out of idle IAX2 threads for scheduling! (%s)\n", funcname);
 
 
 1750#define schedule_action(func, data) __schedule_action(func, data, __PRETTY_FUNCTION__) 
 1778        ast_debug(3, 
"I wanted to lock callno %d, but it is dead or going to die.\n", 
callno);
 
 
 1794        ast_debug(3, 
"Hangup initiated on call %d, aborting __send_ping\n", 
callno);
 
 
 1815#ifdef SCHED_MULTITHREADED 
 
 1842    if (!strcasecmp(s, 
"aes128"))
 
 
 1858        ast_debug(3, 
"Hangup initiated on call %d, aborting __send_lagrq\n", 
callno);
 
 
 1879#ifdef SCHED_MULTITHREADED 
 
 1895        if (subclass & (1LL << x)) {
 
 
 1927        uint64_t pref_bitfield;
 
 1930        if (!pref_bitfield) {
 
 1946        return found_format;
 
 1949    ast_debug(4, 
"Could not find preferred codec - Returning zero codec.\n");
 
 
 2038    const char *
name = obj;
 
 
 2048    struct iax2_peer *peer = obj, *peer2 = arg;
 
 2049    const char *
name = arg;
 
 
 2061    const char *
name = obj;
 
 
 2072    const char *
name = arg;
 
 
 2089    if (!peer && realtime) {
 
 
 2214        ast_debug(1, 
"Really destroying %d now...\n", callno);
 
 
 2364        memcpy(
new, fr, 
sizeof(*
new));
 
 
 2475        ast_log(
LOG_ERROR, 
"This should not be called without a transfer call number.\n");
 
 
 2485        ast_log(
LOG_ERROR, 
"This should not be called without a transfer call number.\n");
 
 
 2494        ast_log(
LOG_ERROR, 
"This should not be called without a peer call number.\n");
 
 
 2504        ast_log(
LOG_ERROR, 
"This should not be called without a peer call number.\n");
 
 
 2544    struct peercnt *peercnt1 = obj, *peercnt2 = arg;
 
 
 2573    const char *find = 
S_OR(
name, 
"guest");
 
 
 2656    ast_debug(1, 
"Reset limits for peercnts table\n");
 
 
 2822    for (; v; v = v->
next) {
 
 2830            ast_log(
LOG_ERROR, 
"Call number limit for %s could not be added, Invalid address range\n.", v->
name);
 
 2832        } 
else if ((sscanf(v->
value, 
"%d", &limit) != 1) || (limit < 0)) {
 
 
 2918        e->
command = 
"iax2 show callnumber usage";
 
 2920            "Usage: iax2 show callnumber usage [IP address]\n" 
 2921            "       Shows current IP addresses which are consuming iax2 call numbers\n";
 
 2926        if (
a->argc < 4 || 
a->argc > 5)
 
 2930            ast_cli(
a->fd, 
"%-45s %-12s %-12s\n", 
"Address", 
"Callno Usage", 
"Callno Limit");
 
 2939                    ast_cli(
a->fd, 
"%-45s %-12s %-12s\n", 
"Address", 
"Callno Usage", 
"Callno Limit");
 
 2956            ast_cli(
a->fd, 
"\nNon-CallToken Validation Callno Limit: %d\n" 
 2957                             "Non-CallToken Validated Callno Used:   %d\n",
 
 2961            ast_cli(
a->fd,   
"Total Available Callno:                %zu\n" 
 2962                             "Regular Callno Available:              %zu\n" 
 2963                             "Trunk Callno Available:                %zu\n",
 
 2964                pool_avail + trunk_pool_avail,
 
 2967        } 
else if (
a->argc == 5 && !found) {
 
 2968            ast_cli(
a->fd, 
"No call number table entries for %s found\n", 
a->argv[4] );
 
 
 3015            "NON-CallToken callnumber limit is reached. Current: %d Max: %d\n",
 
 3038    *entry = pool->
numbers[choice];
 
 
 3069                "Attempted to decrement total non calltoken validated " 
 3070                "callnumbers below zero.  Callno is: %d\n",
 
 
 3187    int validated = (
new > 
NEW_ALLOW) ? 1 : 0;
 
 3196                .transfercallno = 
callno,
 
 3198                .frames_received = check_dcallno,
 
 3204                if (return_locked) {
 
 3213            memset(&tmp_pvt.
addr, 0, 
sizeof(tmp_pvt.
addr));
 
 3216                if (return_locked) {
 
 3234            if (!res || !return_locked) {
 
 3274                ast_debug(1, 
"Creating new call structure %d\n", x);
 
 
 3434    struct sockaddr_in *sin;
 
 3437    struct sock_extended_err e;
 
 3442    m.msg_controllen = 
sizeof(e);
 
 3444    res = recvmsg(
netsocket, &m, MSG_ERRQUEUE);
 
 3448        if (m.msg_controllen) {
 
 3449            sin = (
struct sockaddr_in *)SO_EE_OFFENDER(&e);
 
 
 3538    if ((pvt = 
iaxs[callno])) {
 
 3555            ast_debug(3, 
"Avoiding IAX destroy deadlock\n");
 
 
 3641            } 
else if (f->
final) {
 
 3645                    ast_log(
LOG_WARNING, 
"Max retries exceeded to host %s on %s (type = %u, subclass = %d, ts=%u, seqno=%d)\n",
 
 3659                    if (
iaxs[callno] && 
iaxs[callno]->owner)
 
 3662                    if (
iaxs[callno]->reg) {
 
 3663                        memset(&
iaxs[callno]->reg->us, 0, 
sizeof(
iaxs[callno]->
reg->
us));
 
 3699    } 
else if (callno) {
 
 
 3706#ifdef SCHED_MULTITHREADED 
 
 3717    static const char * 
const choices[] = { 
"all", 
NULL };
 
 3722        e->
command = 
"iax2 prune realtime";
 
 3724            "Usage: iax2 prune realtime [<peername>|all]\n" 
 3725            "       Prunes object(s) from the cache\n";
 
 3738    if (!strcmp(
a->argv[3], 
"all")) {
 
 3741        ast_cli(
a->fd, 
"Cache flushed successfully.\n");
 
 3751                ast_cli(
a->fd, 
"Peer %s was removed from the cache.\n", 
a->argv[3]);
 
 3753                ast_cli(
a->fd, 
"Peer %s is not eligible for this operation.\n", 
a->argv[3]);
 
 3760                ast_cli(
a->fd, 
"User %s was removed from the cache.\n", 
a->argv[3]);
 
 3762                ast_cli(
a->fd, 
"User %s is not eligible for this operation.\n", 
a->argv[3]);
 
 3768        ast_cli(
a->fd, 
"%s was not found in the cache.\n", 
a->argv[3]);
 
 
 3778        e->
command = 
"iax2 test losspct";
 
 3780            "Usage: iax2 test losspct <percentage>\n" 
 3781            "       For testing, throws away <percentage> percent of incoming packets\n";
 
 
 3799        e->
command = 
"iax2 test late";
 
 3801            "Usage: iax2 test late <ms>\n" 
 3802            "       For testing, count the next frame as <ms> ms late\n";
 
 3811    test_late = atoi(
a->argv[3]);
 
 3820        e->
command = 
"iax2 test resync";
 
 3822            "Usage: iax2 test resync <ms>\n" 
 3823            "       For testing, adjust all future frames by <ms> ms\n";
 
 3832    test_resync = atoi(
a->argv[3]);
 
 3841        e->
command = 
"iax2 test jitter";
 
 3843            "Usage: iax2 test jitter <ms> <pct>\n" 
 3844            "       For testing, simulate maximum jitter of +/- <ms> on <pct>\n" 
 3845            "       percentage of packets. If <pct> is not specified, adds\n" 
 3846            "       jitter to all packets.\n";
 
 3852    if (
a->argc < 4 || 
a->argc > 5)
 
 3855    test_jit = atoi(
a->argv[3]);
 
 3857        test_jitpct = atoi(
a->argv[4]);
 
 3872            snprintf(
status, statuslen, 
"LAGGED (%d ms)", peer->
lastms);
 
 3874        } 
else if (peer->
lastms) {
 
 3875            snprintf(
status, statuslen, 
"OK (%d ms)", peer->
lastms);
 
 
 3895    int load_realtime = 0;
 
 3899        e->
command = 
"iax2 show peer";
 
 3901            "Usage: iax2 show peer <name>\n" 
 3902            "       Display details on specific IAX peer\n";
 
 3913    load_realtime = (
a->argc == 5 && !strcmp(
a->argv[4], 
"load")) ? 1 : 0;
 
 3917        char *str_addr, *str_defaddr;
 
 3918        char *str_port, *str_defport;
 
 3941        ast_cli(
a->fd, 
"  Addr->IP     : %s Port %s\n",  str_addr ? str_addr : 
"(Unspecified)", str_port);
 
 3942        ast_cli(
a->fd, 
"  Defaddr->IP  : %s Port %s\n", str_defaddr, str_defport);
 
 3947            strcpy(cbuf, 
"Error"); 
 
 3949        ast_cli(
a->fd, 
"  Codec Order  : %s\n", cbuf);
 
 3957        ast_cli(
a->fd, 
"Peer %s not found.\n", 
a->argv[3]);
 
 
 3969    int wordlen = strlen(
word);
 
 3974        if (!strncasecmp(peer->
name, 
word, wordlen) && ++which > 
state 
 
 3990    int cnt = 0, dead = 0, 
final = 0, i = 0;
 
 3994        e->
command = 
"iax2 show stats";
 
 3996            "Usage: iax2 show stats\n" 
 3997            "       Display statistics on IAX channel driver.\n";
 
 4018    ast_cli(
a->fd, 
"    IAX Statistics\n");
 
 4019    ast_cli(
a->fd, 
"---------------------\n");
 
 4023    ast_cli(
a->fd, 
"Packets in transmit queue: %d dead, %d final, %d total\n\n", dead, 
final, cnt);
 
 
 4041            "Usage: iax2 set mtu <value>\n" 
 4042            "       Set the system-wide IAX IP mtu to <value> bytes net or\n" 
 4043            "       zero to disable. Disabling means that the operating system\n" 
 4044            "       must handle fragmentation of UDP packets when the IAX2 trunk\n" 
 4045            "       packet exceeds the UDP payload size. This is substantially\n" 
 4046            "       below the IP mtu. Try 1240 on ethernets. Must be 172 or\n" 
 4047            "       greater for G.711 samples.\n";
 
 4055    if (strncasecmp(
a->argv[3], 
"default", strlen(
a->argv[3])) == 0)
 
 4058        mtuv = atoi(
a->argv[3]);
 
 4065    if (mtuv < 172 || mtuv > 4000) {
 
 4066        ast_cli(
a->fd, 
"Trunk MTU must be between 172 and 4000\n");
 
 
 4077    char tmp[1024], *pc = 
NULL;
 
 4083        e->
command = 
"iax2 show cache";
 
 4085            "Usage: iax2 show cache\n" 
 4086            "       Display currently cached IAX Dialplan results.\n";
 
 4094    ast_cli(
a->fd, 
"%-20.20s %-12.12s %-9.9s %-8.8s %s\n", 
"Peer/Context", 
"Exten", 
"Exp.", 
"Wait.", 
"Flags");
 
 4097        s = dp->
expiry.tv_sec - now.tv_sec;
 
 4100            strncat(tmp, 
"EXISTS|", 
sizeof(tmp) - strlen(tmp) - 1);
 
 4102            strncat(tmp, 
"NONEXISTENT|", 
sizeof(tmp) - strlen(tmp) - 1);
 
 4104            strncat(tmp, 
"CANEXIST|", 
sizeof(tmp) - strlen(tmp) - 1);
 
 4106            strncat(tmp, 
"PENDING|", 
sizeof(tmp) - strlen(tmp) - 1);
 
 4108            strncat(tmp, 
"TIMEOUT|", 
sizeof(tmp) - strlen(tmp) - 1);
 
 4110            strncat(tmp, 
"TRANSMITTED|", 
sizeof(tmp) - strlen(tmp) - 1);
 
 4112            strncat(tmp, 
"MATCHMORE|", 
sizeof(tmp) - strlen(tmp) - 1);
 
 4114            strncat(tmp, 
"UNKNOWN|", 
sizeof(tmp) - strlen(tmp) - 1);
 
 4117            tmp[strlen(tmp) - 1] = 
'\0';
 
 4133            ast_cli(
a->fd, 
"%-20.20s %-12.12s %-9d %-8d %s\n", pc, dp->
exten, s, y, tmp);
 
 4135            ast_cli(
a->fd, 
"%-20.20s %-12.12s %-9.9s %-8d %s\n", pc, dp->
exten, 
"(expired)", y, tmp);
 
 
 4151    const int lower_mask = (1 << ts_shift) - 1;
 
 4152    const int upper_mask = ~lower_mask;
 
 4155    if ( (fr->
ts & upper_mask) == last_upper ) {
 
 4157        const int threshold = (ts_shift == 15) ? 25000 : 50000;
 
 4164            fr->
ts = (last_upper + (1 << ts_shift)) | (fr->
ts & lower_mask);
 
 4166                ast_debug(1, 
"schedule_delivery: pushed forward timestamp\n");
 
 4172            fr->
ts = (last_upper - (1 << ts_shift)) | (fr->
ts & lower_mask);
 
 4174                ast_debug(1, 
"schedule_delivery: pushed back timestamp\n");
 
 
 4224    now.tv_usec += 1000;
 
 4270            af.
src  = 
"IAX2 JB interpolation";
 
 
 4303#ifdef SCHED_MULTITHREADED 
 
 4339        ast_debug(1, 
"schedule_delivery: set delivery to 0 as we don't have an rxcore yet, or frame is from trunk.\n");
 
 
 4428        0, 0, (
unsigned char *)
text, strlen(
text) + 1, -1);
 
 
 4462    time_t regseconds = 0, nowtime;
 
 4464    char *str_addr, *str_port;
 
 4478            for (tmp = 
var; tmp; tmp = tmp->
next) {
 
 4479                if (!strcasecmp(tmp->
name, 
"name"))
 
 4480                    peername = tmp->
value;
 
 4484    if (!
var && peername) { 
 
 4493            for (tmp = 
var; tmp; tmp = tmp->
next) {
 
 4494                if (!strcasecmp(tmp->
name, 
"host")) {
 
 4519    for (tmp = 
var; tmp; tmp = tmp->
next) {
 
 4521        if (!strcasecmp(tmp->
name, 
"type")) {
 
 4522            if (strcasecmp(tmp->
value, 
"friend") &&
 
 4523                strcasecmp(tmp->
value, 
"peer")) {
 
 4528        } 
else if (!strcasecmp(tmp->
name, 
"regseconds")) {
 
 4530        } 
else if (!strcasecmp(tmp->
name, 
"ipaddr")) {
 
 4538        } 
else if (!strcasecmp(tmp->
name, 
"port")) {
 
 4544        } 
else if (!strcasecmp(tmp->
name, 
"host")) {
 
 4545            if (!strcasecmp(tmp->
value, 
"dynamic"))
 
 4575            memset(&peer->
addr, 0, 
sizeof(peer->
addr));
 
 4577            ast_debug(1, 
"realtime_peer: Bah, '%s' is expired (%d/%d/%d)!\n",
 
 4578                peername, (
int)(nowtime - regseconds), (
int)regseconds, (
int)nowtime);
 
 4581            ast_debug(1, 
"realtime_peer: Registration for '%s' still active (%d/%d/%d)!\n",
 
 4582                peername, (
int)(nowtime - regseconds), (
int)regseconds, (
int)nowtime);
 
 
 4594    char *str_addr, *str_port;
 
 4616            for (tmp = 
var; tmp; tmp = tmp->
next) {
 
 4617                if (!strcasecmp(tmp->
name, 
"host")) {
 
 4638        if (!strcasecmp(tmp->
name, 
"type")) {
 
 4639            if (strcasecmp(tmp->
value, 
"friend") &&
 
 4640                strcasecmp(tmp->
value, 
"user")) {
 
 
 4666    char regseconds[20];
 
 4668    char *syslabel = 
NULL;
 
 4674        syslabel = 
"regserver";
 
 4676    snprintf(regseconds, 
sizeof(regseconds), 
"%d", (
int)regtime);
 
 4681        "regseconds", regseconds, syslabel, sysname, 
SENTINEL); 
 
 
 4799        key = strchr(family, 
'/');
 
 
 4837#ifdef SCHED_MULTITHREADED 
 
 4850    tmp  = (tm.
tm_sec >> 1) & 0x1f;         
 
 4851    tmp |= (tm.
tm_min & 0x3f) << 5;         
 
 4852    tmp |= (tm.
tm_hour & 0x1f) << 11;       
 
 4853    tmp |= (tm.
tm_mday & 0x1f) << 16;       
 
 4854    tmp |= ((tm.
tm_mon + 1) & 0xf) << 21;       
 
 4855    tmp |= ((tm.
tm_year - 100) & 0x7f) << 25;   
 
 
 4871        struct ast_sockaddr *addr, 
int command, 
int ts, 
unsigned char seqno,
 
 4882        memcpy(&data.ied, ied->
buf, ied->
pos);
 
 4885    data.f.scallno = htons(0x8000 | callno);
 
 4887    data.f.ts = htonl(
ts);
 
 4888    data.f.iseqno = seqno;
 
 4895    return ast_sendto(sockfd, &data, size, 0, addr);
 
 
 4901    if (pvt && ied && (2 < ((
int) 
sizeof(ied->
buf) - ied->
pos))) {
 
 4903        ied->
buf[ied->
pos++] = 0;   
 
 
 4940        (f->
datalen > 
sizeof(data))) {
 
 4960    data.ied.pos = ie_data_pos;
 
 
 5033#define CALLTOKEN_HASH_FORMAT "%s%u%d"   
 5034#define CALLTOKEN_IE_FORMAT   "%u?%s"      
 5036    time_t t = time(
NULL);
 
 5059        char *rec_hash = 
NULL;    
 
 5060        char *rec_ts = 
NULL;      
 
 5061        unsigned int rec_time;  
 
 5071        if (!rec_hash || !rec_ts) {
 
 5073        } 
else if (sscanf(rec_ts, 
"%u", &rec_time) != 1) {
 
 5082        if (strcmp(hash, rec_hash)) {
 
 
 5134    char *outkey = 
NULL;
 
 5149    if (strchr(pds->
peer, 
'@')) {
 
 5182    } 
else if (outkey && (outkey[0] == 
'[')) { 
 
 
 5197    char *defaultrdest = 
"s";
 
 5203    const char* osp_token_ptr;
 
 5204    unsigned int osp_token_length;
 
 5205    unsigned char osp_block_index;
 
 5206    unsigned int osp_block_length;
 
 5207    unsigned char osp_buffer[256];
 
 5208    char encoded_prefs[32];
 
 5216    memset(&cai, 0, 
sizeof(cai));
 
 5220    memset(&pds, 0, 
sizeof(pds));
 
 5229        pds.
exten = defaultrdest;
 
 5273    memset(&ied, 0, 
sizeof(ied));
 
 5358    if (
iaxs[callno]->maxtime) {
 
 5371            osp_block_index = 0;
 
 5372            while (osp_token_length > 0) {
 
 5374                osp_buffer[0] = osp_block_index;
 
 5375                memcpy(osp_buffer + 1, osp_token_ptr, osp_block_length);
 
 5378                osp_token_ptr += osp_block_length;
 
 5379                osp_token_length -= osp_block_length;
 
 5384        ast_debug(1, 
"OSP token is undefined\n");
 
 5390    if (variablestore) {
 
 5392        ast_debug(1, 
"Found an IAX variable store on this channel\n");
 
 
 5422    memset(&ied, 0, 
sizeof(ied));
 
 5424    if (callno && 
iaxs[callno]) {
 
 5429        if (!
iaxs[callno]->
error && !alreadygone) {
 
 5433            if (!
iaxs[callno]) {
 
 5441        if (
iaxs[callno] && alreadygone) {
 
 5444        } 
else if (
iaxs[callno]) {
 
 5446                ast_log(
LOG_ERROR, 
"Unable to schedule iax2 callno %d destruction?!!  Destroying immediately.\n", callno);
 
 
 5467    unsigned short callno = pvt->
callno;
 
 
 5503        if ((*(
int *) 
data)) {
 
 5535        if (!(h = 
ast_malloc(datalen + 
sizeof(*h)))) {
 
 5540        h->
option = htons(option);
 
 5541        memcpy(h->
data, data, datalen);
 
 5544                      datalen + 
sizeof(*h), -1);
 
 
 5575    ast_debug(1, 
"I should never be called!\n");
 
 
 5592    snprintf(key, 
sizeof(key), 
"%lX", (
unsigned long)
ast_random());
 
 
 5611#if defined(IAX2_NATIVE_BRIDGING) 
 5612static int iax2_start_transfer(
unsigned short callno0, 
unsigned short callno1, 
int mediaonly)
 
 5617    unsigned int transferid = (
unsigned int)
ast_random();
 
 5620        ast_debug(1, 
"transfers are not supported for encrypted calls at this time\n");
 
 5626    memset(&ied0, 0, 
sizeof(ied0));
 
 5631    memset(&ied1, 0, 
sizeof(ied1));
 
 5648#if defined(IAX2_NATIVE_BRIDGING) 
 5649static void lock_both(
unsigned short callno0, 
unsigned short callno1)
 
 5658#if defined(IAX2_NATIVE_BRIDGING) 
 5659static void unlock_both(
unsigned short callno0, 
unsigned short callno1)
 
 5666#if defined(IAX2_NATIVE_BRIDGING) 
 5673    int transferstarted=0;
 
 5677    struct timeval waittimer = {0, 0};
 
 5680    if (timeoutms > 0) {
 
 5686    lock_both(callno0, callno1);
 
 5687    if (!
iaxs[callno0] || !
iaxs[callno1]) {
 
 5688        unlock_both(callno0, callno1);
 
 5696    unlock_both(callno0, callno1);
 
 5704            ast_verb(3, 
"Can't masquerade, we're different...\n");
 
 5722            ast_verb(3, 
"Operating with different codecs [%s] [%s] , can't native bridge...\n",
 
 5727            lock_both(callno0, callno1);
 
 5732            unlock_both(callno0, callno1);
 
 5741            transferstarted = 1;
 
 5764        if (timeoutms > -1) {
 
 5765            timeoutms -= (1000 - to);
 
 5787        other = (who == c0) ? c1 : c0;  
 
 5819            if (flags & monitored_source) {
 
 5834    lock_both(callno0, callno1);
 
 5839    unlock_both(callno0, callno1);
 
 5858        ast_debug(1, 
"Indicating condition %d\n", condition);
 
 5868    switch (condition) {
 
 5885            ast_debug(2, 
"Callno %d: Config blocked sending control frame %d.\n",
 
 
 5908    char tmp[256], *context;
 
 5911    context = strchr(tmp, 
'@');
 
 
 5948    const struct ast_channel *requestor, 
unsigned int cachable)
 
 5957    char *peer_name = 
NULL;
 
 5959    if (!(i = 
iaxs[callno])) {
 
 6007    if (i != 
iaxs[callno]) {
 
 6025    if ((callid = 
iaxs[callno]->callid)) {
 
 6046        ast_channel_parkinglot_set(tmp, i->
parkinglot);
 
 6067        ast_channel_language_set(tmp, i->
language);
 
 6087        for (v = i->
vars ; v ; v = v->
next)
 
 6094        ast_debug(1, 
"Loading up the channel with IAXVARs\n");
 
 6097        if (variablestore && varlist) {
 
 6098            variablestore->
data = varlist;
 
 6108                    ast_log(
LOG_ERROR, 
"Memory allocation error while processing IAX2 variables\n");
 
 6118            if (variablestore) {
 
 
 6147    unsigned long int mssincetx; 
 
 
 6174static unsigned int fix_peerts(
struct timeval *rxtrunktime, 
int callno, 
unsigned int ts)
 
 
 6196    struct timeval *delivery = 
NULL;
 
 6259                else if (adjust > 0)
 
 6279                    ast_debug(1, 
"predicted timestamp skew (%d) > max (%d), using real ts instead.\n",
 
 6284                    int diff = ms % (f->
samples / rate);
 
 6301            if ( (
unsigned int)ms < p->
lastsent )
 
 6309                if (ms <= p->lastsent)
 
 
 6336            ast_debug(1, 
"calc_rxstamp: call=%d: rxcore set to %d.%6.6d - %ums\n",
 
 6341            ast_debug(1, 
"calc_rxstamp: call=%d: works out as %d.%6.6d\n",
 
 6349        if (!test_jitpct || ((100.0 * 
ast_random() / (RAND_MAX + 1.0)) < test_jitpct)) {
 
 6350            jit = (int)((
float)test_jit * 
ast_random() / (RAND_MAX + 1.0));
 
 6351            if ((
int)(2.0 * 
ast_random() / (RAND_MAX + 1.0)))
 
 
 6379        if ((tpeer = 
ast_calloc(1, 
sizeof(*tpeer)))) {
 
 6388            setsockopt(tpeer->
sockfd, SOL_SOCKET, SO_NO_CHECK, &nochecksums, 
sizeof(nochecksums));
 
 
 6437            mtm->
mini.
ts = htons(0xffff & fr->
ts);
 
 
 6477        memcpy(
buf, (
unsigned char *) &tmp, (
len > 
sizeof(tmp)) ? 
sizeof(tmp) : 
len);
 
 
 6487    for (i = 0; i < 60; i++) {
 
 
 6523        dst[x] = src[x] ^ 0xff;
 
 6525    unsigned char lastblock[16] = { 0 };
 
 6530            dst[x] ^= lastblock[x];
 
 6531        memcpy(lastblock, src, 
sizeof(lastblock));
 
 
 6547        dst[x] = src[x] ^ 0xff;
 
 6549    unsigned char curblock[16] = { 0 };
 
 6553            curblock[x] ^= src[x];
 
 6555        memcpy(curblock, dst, 
sizeof(curblock));
 
 
 6566    unsigned char *workspace;
 
 6569    memset(f, 0, 
sizeof(*f));
 
 6577        padding = 16 + (workspace[15] & 0x0f);
 
 6579            ast_debug(1, 
"Decoding full frame with length %d (padding = %d) (15=%02hhx)\n", *datalen, padding, workspace[15]);
 
 6583        *datalen -= padding;
 
 6602            ast_debug(5, 
"Decoding mini with length %d\n", *datalen);
 
 6607        padding = 16 + (workspace[15] & 0x0f);
 
 6610        *datalen -= padding;
 
 
 6619    unsigned char *workspace;
 
 6624            ast_debug(1, 
"Encoding full frame %d/%d with length %d\n", fh->
type, fh->
csub, *datalen);
 
 6626        padding = 16 + (padding & 0xf);
 
 6627        memcpy(workspace, poo, padding);
 
 6629        workspace[15] &= 0xf0;
 
 6630        workspace[15] |= (padding & 0xf);
 
 6632            ast_debug(1, 
"Encoding full frame %d/%d with length %d + %d padding (15=%02hhx)\n", fh->
type, fh->
csub, *datalen, padding, workspace[15]);
 
 6633        *datalen += padding;
 
 6636            memcpy(poo, workspace + *datalen - 32, 32);
 
 6640            ast_debug(5, 
"Encoding mini frame with length %d\n", *datalen);
 
 6642        padding = 16 + (padding & 0xf);
 
 6643        memcpy(workspace, poo, padding);
 
 6645        workspace[15] &= 0xf0;
 
 6646        workspace[15] |= (padding & 0x0f);
 
 6647        *datalen += padding;
 
 6650            memcpy(poo, workspace + *datalen - 32, 32);
 
 
 6661        unsigned char digest[16];
 
 6662        char *tmppw, *stringp;
 
 6666        while ((tmppw = 
strsep(&stringp, 
";"))) {
 
 6669            MD5Update(&
md5, (
unsigned char *)tmppw, strlen(tmppw));
 
 
 6693        unsigned char buffer[4096];
 
 6698    unsigned int lastsent;
 
 6720        "f->frametype %c= AST_FRAME_VOICE, %sencrypted, %srotation scheduled...\n",
 
 6731            (((fts & 0xFFFF0000L) == (lastsent & 0xFFFF0000L)) ||
 
 6732            ((fts & 0xFFFF0000L) == ((lastsent + 0x10000) & 0xFFFF0000L))))
 
 6750        if (((fts & 0xFFFF8000L) == (pvt->
lastvsent & 0xFFFF8000L)) &&
 
 6795        fh->
ts = htonl(fr->
ts);
 
 6879            mh->
ts = htons(fr->
ts & 0xFFFF);
 
 
 6900    int havepattern = 0;
 
 6902#define FORMAT "%-15.15s  %-20.20s  %-15.15s  %-15.15s  %-5.5s  %-5.10s\n" 
 6903#define FORMAT2 "%-15.15s  %-20.20s  %-15.15d  %-15.15s  %-5.5s  %-5.10s\n" 
 6912        e->
command = 
"iax2 show users [like]";
 
 6914            "Usage: iax2 show users [like <pattern>]\n" 
 6915            "       Lists all known IAX2 users.\n" 
 6916            "       Optional regular expression pattern is used to filter the user list.\n";
 
 6924        if (!strcasecmp(
a->argv[3], 
"like")) {
 
 6925            if (regcomp(®exbuf, 
a->argv[4], REG_EXTENDED | REG_NOSUB))
 
 6936    ast_cli(
a->fd, 
FORMAT, 
"Username", 
"Secret", 
"Authen", 
"Def.Context", 
"A/C",
"Codec Pref");
 
 6939        if (havepattern && regexec(®exbuf, 
user->name, 0, 
NULL, 0))
 
 6945            snprintf(auth, 
sizeof(auth), 
"Key: %-15.15s ", 
user->inkeys);
 
 
 6982#define PEERS_FORMAT2 "%-15.15s  %-40.40s %s   %-40.40s  %-9s %s  %-11s %-32.32s\n" 
 6983#define PEERS_FORMAT "%-15.15s  %-40.40s %s  %-40.40s  %-6s%s %s  %-11s %-32.32s\n" 
 6987    char name[256] = 
"";
 
 6992    char *tmp_host, *tmp_mask, *tmp_port;
 
 7006    if (retstatus > 0) {
 
 7008    } 
else if (!retstatus) {
 
 7017                "Event: PeerEntry\r\n%s" 
 7018                "Channeltype: IAX\r\n",
 
 7022                    "ObjectName: %s\r\n" 
 7023                    "ObjectUsername: %s\r\n",
 
 7028                    "ObjectName: %s\r\n",
 
 7033                "Event: PeerEntry\r\n%s" 
 7034                "Channeltype: IAX2\r\n" 
 7035                "ObjectName: %s\r\n",
 
 7040            "ChanObjectType: peer\r\n" 
 7041            "IPaddress: %s\r\n",
 
 7057            "Encryption: %s\r\n" 
 7067                "Description: %s\r\n\r\n",
 
 
 7091        .registeredonly = 0,
 
 7098        .unmonitored_peers = 0,
 
 7107        if (!strcasecmp(argv[3], 
"registered"))
 
 7111        if (!strcasecmp(argv[4], 
"like")) {
 
 7112            if (regcomp(&cont.
regexbuf, argv[5], REG_EXTENDED | REG_NOSUB))
 
 7119        if (!strcasecmp(argv[3], 
"like")) {
 
 7120            if (regcomp(&cont.
regexbuf, argv[4], REG_EXTENDED | REG_NOSUB))
 
 7127        if (!strcasecmp(argv[3], 
"registered")) {
 
 7141        ast_cli(fd, 
PEERS_FORMAT2, 
"Name/Username", 
"Host", 
"   ", 
"Mask", 
"Port", 
"   ", 
"Status", 
"Description");
 
 7160        ast_cli(fd,
"%d iax2 peers [%d online, %d offline, %d unmonitored]\n",
 
 
 7182    int threadcount = 0, dynamiccount = 0;
 
 7187        e->
command = 
"iax2 show threads";
 
 7189            "Usage: iax2 show threads\n" 
 7190            "       Lists status of IAX helper threads\n";
 
 7198    ast_cli(
a->fd, 
"IAX2 Thread Information\n");
 
 7203#ifdef DEBUG_SCHED_MULTITHREAD 
 7204        ast_cli(
a->fd, 
"Thread %d: state=%u, update=%d, actions=%d, func='%s'\n",
 
 7207        ast_cli(
a->fd, 
"Thread %d: state=%u, update=%d, actions=%d\n",
 
 7213    ast_cli(
a->fd, 
"Active Threads:\n");
 
 7220#ifdef DEBUG_SCHED_MULTITHREAD 
 7221        ast_cli(
a->fd, 
"Thread %c%d: state=%u, update=%d, actions=%d, func='%s'\n",
 
 7224        ast_cli(
a->fd, 
"Thread %c%d: state=%u, update=%d, actions=%d\n",
 
 7230    ast_cli(
a->fd, 
"Dynamic Threads:\n");
 
 7233#ifdef DEBUG_SCHED_MULTITHREAD 
 7234        ast_cli(
a->fd, 
"Thread %d: state=%u, update=%d, actions=%d, func='%s'\n",
 
 7237        ast_cli(
a->fd, 
"Thread %d: state=%u, update=%d, actions=%d\n",
 
 7243    ast_cli(
a->fd, 
"%d of %d threads accounted for with %d dynamic threads\n", threadcount, 
iaxthreadcount, dynamiccount);
 
 
 7253        e->
command = 
"iax2 unregister";
 
 7255            "Usage: iax2 unregister <peername>\n" 
 7256            "       Unregister (force expiration) an IAX2 peer from the registry.\n";
 
 7274                ast_cli(
a->fd, 
"Peer %s unregistered\n", 
a->argv[2]);
 
 7276                ast_cli(
a->fd, 
"Peer %s not found\n", 
a->argv[2]);
 
 7279            ast_cli(
a->fd, 
"Peer %s not registered\n", 
a->argv[2]);
 
 7283        ast_cli(
a->fd, 
"Peer unknown: %s. Not unregistered\n", 
a->argv[2]);
 
 
 7293    int wordlen = strlen(
word);
 
 7299            if (!strncasecmp(p->
name, 
word, wordlen) &&
 
 
 7317        e->
command = 
"iax2 show peers";
 
 7319            "Usage: iax2 show peers [registered] [like <pattern>]\n" 
 7320            "       Lists all known IAX2 peers.\n" 
 7321            "       Optional 'registered' argument lists only peers with known addresses.\n" 
 7322            "       Optional regular expression pattern is used to filter the peer list.\n";
 
 
 7348    int *fd = user_data;
 
 7350    ast_cli(*fd, 
"%-15.15s  %-15d %-15d\n",
 
 7353        (
int) ntohl(
header->datalen));
 
 
 7362        e->
command = 
"iax2 show firmware";
 
 7364            "Usage: iax2 show firmware\n" 
 7365            "       Lists all known IAX firmware images.\n";
 
 7371    if (
a->argc != 3 && 
a->argc != 4)
 
 7374    ast_cli(
a->fd, 
"%-15.15s  %-15.15s %-15.15s\n", 
"Device", 
"Version", 
"Size");
 
 7377        a->argc == 3 ? 
NULL : 
a->argv[3],
 
 
 7387    static const char * 
const a[] = { 
"iax2", 
"show", 
"peers" };
 
 7389    char idtext[256] = 
"";
 
 7393        snprintf(idtext, 
sizeof(idtext), 
"ActionID: %s\r\n", 
id);
 
 
 7412        .registeredonly = 0,
 
 7419        .unmonitored_peers = 0,
 
 7428        snprintf(cont.
idtext, 
sizeof(cont.
idtext), 
"ActionID: %s\r\n", 
id);
 
 
 7450        return "Unregistered";
 
 7452        return "Request Sent";
 
 7454        return "Auth. Sent";
 
 7456        return "Registered";
 
 7462        return "No Authentication";
 
 
 7470#define FORMAT2 "%-45.45s  %-6.6s  %-10.10s  %-45.45s %8.8s  %s\n" 
 7471#define FORMAT  "%-45.45s  %-6.6s  %-10.10s  %-45.45s %8d  %s\n" 
 7480        e->
command = 
"iax2 show registry";
 
 7482            "Usage: iax2 show registry\n" 
 7483            "       Lists all registration requests and status.\n";
 
 7490    ast_cli(
a->fd, 
FORMAT2, 
"Host", 
"dnsmgr", 
"Username", 
"Perceived", 
"Refresh", 
"State");
 
 7498                (reg->
dnsmgr) ? 
"Y" : 
"N",
 
 7503    ast_cli(
a->fd, 
"%d IAX2 registrations.\n", counter);
 
 
 7513    char idtext[256] = 
"";
 
 7515    char perceived[80] = 
"";
 
 7519        snprintf(idtext, 
sizeof(idtext), 
"ActionID: %s\r\n", 
id);
 
 7530            "Event: RegistryEntry\r\n" 
 7533            "DNSmanager: %s\r\n" 
 7538            "\r\n", idtext, host, (reg->
dnsmgr) ? 
"Y" : 
"N", reg->
username, perceived,
 
 
 7553#define FORMAT2 "%-20.20s  %-40.40s  %-10.10s  %-11.11s  %-11.11s  %-7.7s  %-6.6s  %-6.6s  %s  %s  %9s\n" 
 7554#define FORMAT  "%-20.20s  %-40.40s  %-10.10s  %5.5d/%5.5d  %5.5d/%5.5d  %-5.5dms  %-4.4dms  %-4.4dms  %-6.6s  %s%s  %3s%s\n" 
 7555#define FORMATB "%-20.20s  %-40.40s  %-10.10s  %5.5d/%5.5d  %5.5d/%5.5d  [Native Bridged to ID=%5.5d]\n" 
 7558    char first_message[10] = { 0, };
 
 7559    char last_message[10] = { 0, };
 
 7563        e->
command = 
"iax2 show channels";
 
 7565            "Usage: iax2 show channels\n" 
 7566            "       Lists all currently active IAX channels.\n";
 
 7574    ast_cli(
a->fd, 
FORMAT2, 
"Channel", 
"Peer", 
"Username", 
"ID (Lo/Rem)", 
"Seq (Tx/Rx)", 
"Lag", 
"Jitter", 
"JitBuf", 
"Format", 
"FirstMsg", 
"LastMsg");
 
 7578            int lag, jitter, localdelay;
 
 7610    ast_cli(
a->fd, 
"%d active IAX channel%s\n", numchans, (numchans != 1) ? 
"s" : 
"");
 
 
 7621    char first_message[10] = { 0, };
 
 7622    char last_message[10] = { 0, };
 
 7623#define ACN_FORMAT1 "%-24.25s %4u %4d %4d %5d %3d %5d %4d %6d %4d %4d %5d %3d %5d %4d %6d %s%s %4s%s\n" 
 7624#define ACN_FORMAT2 "%s %u %d %d %d %d %d %d %d %d %d %d %d %d %d %d %s%s %s%s\n" 
 7628            int localjitter, localdelay, locallost, locallosspct, localdropped, localooo;
 
 7635                localjitter = jbinfo.
jitter;
 
 7638                locallosspct = jbinfo.
losspct/1000;
 
 
 7707        e->
command = 
"iax2 show netstats";
 
 7709            "Usage: iax2 show netstats\n" 
 7710            "       Lists network status for all currently active IAX channels.\n";
 
 7717    ast_cli(
a->fd, 
"                                -------- LOCAL ---------------------  -------- REMOTE --------------------\n");
 
 7718    ast_cli(
a->fd, 
"Channel                    RTT  Jit  Del  Lost   %%  Drop  OOO  Kpkts  Jit  Del  Lost   %%  Drop  OOO  Kpkts FirstMsg    LastMsg\n");
 
 7720    ast_cli(
a->fd, 
"%d active IAX channel%s\n", numchans, (numchans != 1) ? 
"s" : 
"");
 
 
 7728        e->
command = 
"iax2 set debug {on|off|peer}";
 
 7730            "Usage: iax2 set debug {on|off|peer peername}\n" 
 7731            "       Enables/Disables dumping of IAX packets for debugging purposes.\n";
 
 7734        if (
a->pos == 4 && !strcasecmp(
a->argv[3], 
"peer"))
 
 7739    if (
a->argc < e->
args  || 
a->argc > e->
args + 1)
 
 7742    if (!strcasecmp(
a->argv[3], 
"peer")) {
 
 7745        if (
a->argc != e->
args + 1)
 
 7751            ast_cli(
a->fd, 
"IAX2 peer '%s' does not exist\n", 
a->argv[e->
args-1]);
 
 7760    } 
else if (!strncasecmp(
a->argv[3], 
"on", 2)) {
 
 7762        ast_cli(
a->fd, 
"IAX2 Debugging Enabled\n");
 
 7766        ast_cli(
a->fd, 
"IAX2 Debugging Disabled\n");
 
 
 7775        e->
command = 
"iax2 set debug trunk {on|off}";
 
 7777            "Usage: iax2 set debug trunk {on|off}\n" 
 7778            "       Enables/Disables debugging of IAX trunking\n";
 
 7784    if (
a->argc != e->
args)
 
 7787    if (!strncasecmp(
a->argv[e->
args - 1], 
"on", 2)) {
 
 7789        ast_cli(
a->fd, 
"IAX2 Trunk Debugging Enabled\n");
 
 7792        ast_cli(
a->fd, 
"IAX2 Trunk Debugging Disabled\n");
 
 
 7801        e->
command = 
"iax2 set debug jb {on|off}";
 
 7803            "Usage: iax2 set debug jb {on|off}\n" 
 7804            "       Enables/Disables jitterbuffer debugging information\n";
 
 7810    if (
a->argc != e->
args)
 
 7813    if (!strncasecmp(
a->argv[e->
args -1], 
"on", 2)) {
 
 7815        ast_cli(
a->fd, 
"IAX2 Jitterbuffer Debugging Enabled\n");
 
 7818        ast_cli(
a->fd, 
"IAX2 Jitterbuffer Debugging Disabled\n");
 
 
 7861    f.
src = __FUNCTION__;
 
 
 7875        ast_debug(2, 
"Callno %d: Blocked sending control frame %d.\n",
 
 
 7898    int call_num = i->
callno;
 
 7901    if (!
iaxs[call_num])
 
 
 7919        if (!strcmp(con->
context, context) || !strcmp(con->
context, 
"*"))
 
 
 7934    int gotcapability = 0;
 
 7985        memset(&
iaxs[callno]->rprefs, 0, 
sizeof(
iaxs[callno]->rprefs));
 
 7989    if (!gotcapability) {
 
 8001            !strcmp(
iaxs[callno]->username, 
user->name))    
 
 8015                    if (bestscore < 4) {
 
 8024                    if (bestscore < 3) {
 
 8035                    if (bestscore < 2) {
 
 8044                    if (bestscore < 1) {
 
 8069        for (v = 
user->vars ; v ; v = v->
next) {
 
 8078        if (
user->maxauthreq > 0)
 
 8127            char *family, *key=
NULL;
 
 8130            key = strchr(family, 
'/');
 
 
 8173    return ast_sendto(sockfd, &fh, 
sizeof(fh), 0, addr);
 
 
 8200    int res = -1, authreq_restrict = 0;
 
 8204    memset(&ied, 0, 
sizeof(ied));
 
 8212            if (
user->curauthreq == 
user->maxauthreq)
 
 8213                authreq_restrict = 1;
 
 8221    if (authreq_restrict) {
 
 
 8250    char requeststr[256];
 
 8251    char md5secret[256] = 
"";
 
 8253    char rsasecret[256] = 
"";
 
 8272        ast_log(
LOG_WARNING, 
"Call Terminated, incoming call is unencrypted while force encrypt is enabled.\n");
 
 8289            ast_log(
LOG_ERROR, 
"Unable to create a temporary string for parsing stored 'inkeys'\n");
 
 8293        keyn = 
strsep(&stringp, 
":");
 
 8301                ast_log(
LOG_WARNING, 
"Requested inkey '%s' for RSA authentication does not exist\n", keyn);
 
 8303            keyn = 
strsep(&stringp, 
":");
 
 8311        unsigned char digest[16];
 
 8312        char *tmppw, *stringp;
 
 8315        while((tmppw = 
strsep(&stringp, 
";"))) {
 
 8318            MD5Update(&
md5, (
unsigned char *)tmppw, strlen(tmppw));
 
 8322                sprintf(requeststr + (x << 1), 
"%02hhx", digest[x]); 
 
 8323            if (!strcasecmp(requeststr, md5secret)) {
 
 8332        if (!strcmp(secret, p->
secret)) {
 
 
 8345    char requeststr[256] = 
"";
 
 8346    char peer[256] = 
"";
 
 8347    char md5secret[256] = 
"";
 
 8348    char rsasecret[256] = 
"";
 
 8349    char secret[256] = 
"";
 
 8379    if (!p || !
iaxs[callno]) {
 
 8423                ast_log(
LOG_ERROR, 
"Unable to create a temporary string for parsing stored 'inkeys'\n");
 
 8427            keyn = 
strsep(&stringp, 
":");
 
 8435                keyn = 
strsep(&stringp, 
":");
 
 8445                ast_log(
LOG_NOTICE, 
"Host '%s' trying to do RSA authentication, but we have no inkeys\n", peer);
 
 8450        unsigned char digest[16];
 
 8451        char *tmppw, *stringp;
 
 8455        while((tmppw = 
strsep(&stringp, 
";"))) {
 
 8458            MD5Update(&
md5, (
unsigned char *)tmppw, strlen(tmppw));
 
 8461                sprintf(requeststr + (x << 1), 
"%02hhx", digest[x]); 
 
 8462            if (!strcasecmp(requeststr, md5secret))
 
 8474        if (strcmp(secret, p->
secret)) {
 
 8494        if (expire && (expire < 
iaxs[callno]->expiry)) {
 
 
 8537                unsigned char digest[16];
 
 8541                MD5Update(&
md5, (
unsigned char *) secret, strlen(secret));
 
 8552            unsigned char digest[16];
 
 8556            MD5Update(&
md5, (
unsigned char *)secret, strlen(secret));
 
 8560                sprintf(digres + (x << 1),  
"%02hhx", digest[x]); 
 
 
 8590    uint16_t callno = p->
callno;
 
 8592    memset(&ied, 0, 
sizeof(ied));
 
 8644                if (!(p = 
iaxs[callno])) {
 
 8653                if (!(p = 
iaxs[callno]))
 
 8668            ast_log(
LOG_WARNING, 
"Call terminated. Encryption requested by peer but no secret available locally\n");
 
 8677        ast_log(
LOG_NOTICE, 
"Call initiated without encryption while forceencryption=yes option is set\n");
 
 8686        if (variablestore && varlist && p->
owner) {
 
 8687            variablestore->
data = varlist;
 
 8697                    ast_log(
LOG_ERROR, 
"Memory allocation error while processing IAX2 variables\n");
 
 8708                ast_log(
LOG_ERROR, 
"Memory allocation error while processing IAX2 variables\n");
 
 
 8743#ifdef SCHED_MULTITHREADED 
 
 8756    memset(&ied, 0, 
sizeof(ied));
 
 
 8786    char exten[256] = 
"";
 
 8813            dp->
flags &= ~CACHE_FLAG_PENDING;
 
 8820                if (write(dp->
waiters[x], 
"asdf", 4) < 0) {
 
 
 8839        peercallno = ies->
callno;
 
 8841    if (peercallno < 1) {
 
 
 8902    char peer[256] = 
"";
 
 8905    char ourip[256] = 
"<Unspecified>";
 
 8946            snprintf(msgstatus, 
sizeof(msgstatus), 
" with %d new and %d old messages waiting", reg->
messages & 0xff, reg->
messages >> 8);
 
 8948            snprintf(msgstatus, 
sizeof(msgstatus), 
" with %d new messages waiting", reg->
messages);
 
 8950            ast_copy_string(msgstatus, 
" with 1 new message waiting", 
sizeof(msgstatus));
 
 8952            ast_copy_string(msgstatus, 
" with no messages waiting", 
sizeof(msgstatus));
 
 
 8965    const char *secret, 
const char *porta)
 
 8991    if (!porta && !reg->
port) {
 
 8994        sscanf(porta, 
"%5d", ®->
port);
 
 
 9022        ast_log(
LOG_WARNING, 
"Format for registration is user[:secret]@host[:port] at line %d\n", lineno);
 
 9031    porta = 
strsep(&stringp, 
":");
 
 9033    if (porta && !atoi(porta)) {
 
 
 9045    char *stringp, *
ext;
 
 
 9087    if (peer->
expire == -1) {
 
 9094    ast_debug(1, 
"Expiring registration for peer '%s'\n", peer->
name);
 
 9099        "peer_status", 
"Unregistered",
 
 9100        "cause", 
"Expired");
 
 
 9123#ifdef SCHED_MULTITHREADED 
 
 9139    expiry = strrchr(data, 
':');
 
 
 9195    const char *peer_name;
 
 9227        ast_log(
LOG_NOTICE, 
"Restricting registration for peer '%s' to %d seconds (requested %d)\n",
 
 9231        ast_log(
LOG_NOTICE, 
"Restricting registration for peer '%s' to %d seconds (requested %d)\n",
 
 9257            ast_verb(3, 
"Registered IAX2 '%s' (%s) at %s\n",
 
 9263                "peer_status", 
"Registered",
 
 9264                "address", str_addr,
 
 9269            ast_verb(3, 
"Unregistered IAX2 '%s' (%s)\n",
 
 9274                "peer_status", 
"Unregistered");
 
 9341            msgcount = (old << 8) | 
new;
 
 
 9367    const char *peer_name;
 
 9382    memset(&ied, 0, 
sizeof(ied));
 
 
 9415    char peer[256] = 
"";
 
 9418    int authmethods = 0;
 
 9425    memset(&ied, 0, 
sizeof(ied));
 
 9440        if (reg->
secret[0] == 
'[') {
 
 9443            tmpkey[strlen(tmpkey) - 1] = 
'\0';
 
 
 9467    int callno = (int)(
long)(nothing);
 
 9471        memset(&ied, 0, 
sizeof(ied));
 
 
 9486    int callno = (int)(
long)(data);
 
 9491#ifdef SCHED_MULTITHREADED 
 
 9516    int callno = (int)(
long)(nothing);
 
 9520        memset(&ied, 0, 
sizeof(ied));
 
 
 9530    int callno = (int)(
long)(data);
 
 9536#ifdef SCHED_MULTITHREADED 
 
 9549    memset(&ied, 0, 
sizeof(ied));
 
 
 9566        if (((
unsigned char) (f->
oseqno - 
last) < 128) &&
 
 
 9584#ifdef SCHED_MULTITHREADED 
 
 9621        calls = tpeer->
calls;
 
 
 9637    if (now->tv_sec > tpeer->
trunkact.tv_sec + 5)
 
 
 9676                ast_verbose(
" - Trunk peer (%s) has %d call chunk%s in transit, %u bytes backlogged and has hit a high water mark of %u bytes\n",
 
 9679                            (res != 1) ? 
"s" : 
"",
 
 9696        if (drop->trunkdata) {
 
 9698            drop->trunkdata = 
NULL;
 
 9706        ast_verbose(
"Ending trunk processing with %d peers and %d call chunks processed\n", processed, 
totalcalls);
 
 
 9720static void dp_lookup(
int callno, 
const char *context, 
const char *callednum, 
const char *callerid, 
int skiplock)
 
 9722    unsigned short dpstatus = 0;
 
 9726    memset(&ied1, 0, 
sizeof(ied1));
 
 
 9765    pthread_t newthread;
 
 
 9783    unsigned int ourver;
 
 9785    snprintf(rsi, 
sizeof(rsi), 
"si-%s", si);
 
 9788    ast_debug(1, 
"Service identifier '%s', we think '%08x', they think '%08x'\n", si, ourver, ver);
 
 
 9799    memset(iep, 0, 
sizeof(*iep));
 
 
 9824    unsigned int length, offset = 0;
 
 9835                memcpy(full_osptoken + offset, ies->
osptokenblock[i], length);
 
 9842    *(full_osptoken + offset) = 
'\0';
 
 9843    if (strlen(full_osptoken) != offset) {
 
 9845        *full_osptoken = 
'\0';
 
 
 9853    int localjitter = -1, localdelay = 0, locallost = -1, locallosspct = -1, localdropped = 0, localooo = -1, localpackets = -1;
 
 9860            localjitter = jbinfo.
jitter;
 
 9863            locallosspct = jbinfo.
losspct/1000;
 
 9868        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",
 
 
 9933    memcpy(pkt_buf->
buf, from_here->
buf, pkt_buf->
len);
 
 
 9959    static time_t last_errtime = 0;
 
 9964        if (t != last_errtime) {
 
 9966            ast_debug(1, 
"Out of idle IAX2 threads for I/O, pausing!\n");
 
 9976    if (
thread->buf_len < 0) {
 
 9977        if (
errno != ECONNREFUSED && 
errno != EAGAIN)
 
10025#ifdef DEBUG_SCHED_MULTITHREAD 
 
10036    unsigned char metatype;
 
10043    struct timeval rxtrunktime;
 
10046    if (packet_len < 
sizeof(*meta)) {
 
10047        ast_log(
LOG_WARNING, 
"Rejecting packet from '%s' that is flagged as a meta frame but is too short\n",
 
10055    if (packet_len < (
sizeof(*meta) + 
sizeof(*mth))) {
 
10056        ast_log(
LOG_WARNING, 
"midget meta trunk packet received (%d of %d min)\n", packet_len,
 
10057            (
int) (
sizeof(*meta) + 
sizeof(*mth)));
 
10061    ts = ntohl(mth->
ts);
 
10062    metatype = meta->cmddata;
 
10063    packet_len -= (
sizeof(*meta) + 
sizeof(*mth));
 
10067        ast_log(
LOG_WARNING, 
"Unable to accept trunked packet from '%s': No matching peer\n",
 
10076    while (packet_len >= 
sizeof(*mte)) {
 
10078        unsigned short callno, trunked_ts, 
len;
 
10082            ptr += 
sizeof(*mtm);
 
10083            packet_len -= 
sizeof(*mtm);
 
10086            trunked_ts = ntohs(mtm->
mini.
ts);
 
10089            ptr += 
sizeof(*mte);
 
10090            packet_len -= 
sizeof(*mte);
 
10099        if (
len > packet_len)
 
10108        memset(&f, 0, 
sizeof(f));
 
 
10171    if (!variablestore) {
 
10175    varlist = variablestore->
data;
 
10179        if (strcmp(
var->name, data) == 0) {
 
 
10200    if (!variablestore) {
 
10202        if (!variablestore) {
 
10214        variablestore->
data = varlist;
 
10218        varlist = variablestore->
data;
 
10222        if (strcmp(
var->name, data) == 0) {
 
 
10247    if (
iaxs[callno] && 
iaxs[callno]->owner) {
 
 
10269    int updatehistory=1;
 
10272    char decrypted = 0;
 
10291    char host_pref_buf[128];
 
10292    char caller_pref_buf[128];
 
10294    char *using_prefs = 
"mine";
 
10298    memset(fr, 0, 
sizeof(*fr));
 
10306    if (res < 
sizeof(*mh)) {
 
10307        ast_log(
LOG_WARNING, 
"midget packet received (%d of %d min)\n", res, (
int) 
sizeof(*mh));
 
10310    if ((vh->
zeros == 0) && (ntohs(vh->
callno) & 0x8000)) {
 
10311        if (res < 
sizeof(*vh)) {
 
10312            ast_log(
LOG_WARNING, 
"Rejecting packet from '%s' that is flagged as a video frame but is too short\n",
 
10320    } 
else if ((meta->zeros == 0) && !(ntohs(meta->metacmd) & 0x8000))
 
10323#ifdef DEBUG_SUPPORT 
10324    if (res >= 
sizeof(*fh))
 
10328        if (res < 
sizeof(*fh)) {
 
10329            ast_log(
LOG_WARNING, 
"Rejecting packet from '%s' that is flagged as a full frame but is too short\n",
 
10335        dcallno = ntohs(fh->
dcallno) & ~IAX_FLAG_RETRANS;
 
10362            if ((fh->
csub >> 6) & 0x1) {
 
10384        f.
datalen = res - 
sizeof(*fh);
 
10398                memset(&ies, 0, 
sizeof(ies));
 
10405            memset(&ies, 0, 
sizeof(ies));
 
10429        memset(&ies, 0, 
sizeof(ies));
 
10433        int check_dcallno = 0;
 
10499#ifdef DEBUG_SUPPORT 
10511        int data_size = 
sizeof(*cause_code);
 
10512        char subclass[40] = 
"";
 
10528        data_size += strlen(subclass);
 
10531        memset(cause_code, 0, data_size);
 
10535        snprintf(cause_code->
code, data_size - 
sizeof(*cause_code) + 1, 
"IAX2 %s(%d)", subclass, ies.
causecode);
 
10556        unsigned short new_peercallno;
 
10558        new_peercallno = (
unsigned short) (ntohs(mh->
callno) & ~IAX_FLAG_FULL);
 
10573        fr->
ts = ntohl(fh->
ts);
 
10576            ast_debug(1, 
"Simulating frame ts resync, was %u now %u\n", fr->
ts, fr->
ts + test_resync);
 
10577            fr->
ts += test_resync;
 
10609                ast_debug(1, 
"Packet arrived out of order (expecting %d, got %d) (frametype = %u, subclass = %d)\n",
 
10642            if (res < thread->buf_size)
 
10643                thread->buf[res++] = 
'\0';
 
10645                thread->buf[res - 1] = 
'\0';
 
10654            int call_to_destroy;
 
10666                        ast_debug(1, 
"Cancelling transmission of packet %d\n", x);
 
10667                    call_to_destroy = 0;
 
10674                                call_to_destroy = fr->
callno;
 
10677                    if (call_to_destroy) {
 
10679                            ast_debug(1, 
"Really destroying %d, having been acked on final message\n", call_to_destroy);
 
10740                    if (variablestore && varlist) {
 
10741                        variablestore->
data = varlist;
 
10753                                ast_log(
LOG_ERROR, 
"Memory allocation error while processing IAX2 variables\n");
 
10764                        ast_log(
LOG_ERROR, 
"Memory allocation error while processing IAX2 variables\n");
 
10765                        if (variablestore) {
 
10776                    ast_debug(1, 
"No channel, so populating IAXVARs to the pvt, as an intermediate step.\n");
 
10787                ast_debug(1, 
"I have IAX variables, but they were not processed\n");
 
10817                            ast_debug(1, 
"Neat, somebody took away the channel at a magical time but i found it!\n");
 
10821                                ast_debug(1, 
"I can haz iaxvars, but they is no good.  :-(\n");
 
10863                        const char *moh_suggest;
 
10909                    memset(&ied1, 0, 
sizeof(ied1));
 
10931                        fr->
callno = new_callno;
 
10940                        ast_log(
LOG_NOTICE, 
"Rejected connect attempt from %s, who was trying to reach '%s@%s'\n",
 
10947                    ast_log(
LOG_WARNING, 
"Rejected connect attempt.  No secret present while force encrypt enabled.\n");
 
10951                    const char *context, *exten, *cid_num;
 
10971                        memset(&ied0, 0, 
sizeof(ied0));
 
10979                            ast_log(
LOG_NOTICE, 
"Rejected connect attempt from %s, request '%s@%s' does not exist\n",
 
10987                                using_prefs = 
"reqonly";
 
10989                                using_prefs = 
"disabled";
 
10992                            memset(&pref, 0, 
sizeof(pref));
 
10993                            strcpy(caller_pref_buf, 
"disabled");
 
10994                            strcpy(host_pref_buf, 
"disabled");
 
10997                            using_prefs = 
"mine";
 
11005                                    using_prefs = 
"caller";
 
11020                                memset(&ied0, 0, 
sizeof(ied0));
 
11033                                        ast_log(
LOG_NOTICE, 
"Rejected connect attempt from %s, requested '%s' incompatible with our capability '%s'.\n",
 
11038                                        ast_log(
LOG_NOTICE, 
"Rejected connect attempt from %s, requested/capability '%s'/'%s' incompatible with our capability '%s'.\n",
 
11053                                        memset(&pref, 0, 
sizeof(pref));
 
11055                                        strcpy(caller_pref_buf,
"disabled");
 
11056                                        strcpy(host_pref_buf,
"disabled");
 
11059                                        using_prefs = 
"mine";
 
11066                                                using_prefs = 
"caller";
 
11079                                    memset(&ied0, 0, 
sizeof(ied0));
 
11088                                        ast_log(
LOG_NOTICE, 
"Rejected connect attempt from %s, requested/capability '%s'/'%s' incompatible with our capability '%s'.\n",
 
11101                            memset(&ied1, 0, 
sizeof(ied1));
 
11107                                ast_verb(3, 
"Accepting UNAUTHENTICATED call from %s:\n" 
11108                                                "%srequested format = %s,\n" 
11109                                                "%srequested prefs = %s,\n" 
11110                                                "%sactual format = %s,\n" 
11111                                                "%shost prefs = %s,\n" 
11112                                                "%spriority = %s\n",
 
11161                ast_debug(1, 
"Immediately destroying %d, having received hangup\n", fr->
callno);
 
11188                    ast_debug(1, 
"Immediately destroying %d, having received reject\n",
 
11247                    memset(&ied0, 0, 
sizeof(ied0));
 
11258                        ast_log(
LOG_NOTICE, 
"Rejected call to %s, format %s incompatible with our capability %s.\n",
 
11325                                "peer_status", 
"Reachable",
 
11334                                "peer_status", 
"Lagged",
 
11388                        ast_debug(1, 
"Peer %s lag measured as %dms\n",
 
11402                        "I don't know how to authenticate %s to %s\n",
 
11420                    memset(&ied0, 0, 
sizeof(ied0));
 
11431                        ast_log(
LOG_WARNING, 
"Rejected connect attempt from %s, request '%s@%s' does not exist\n",
 
11435                    memset(&ied0, 0, 
sizeof(ied0));
 
11446                            using_prefs = 
"reqonly";
 
11448                            using_prefs = 
"disabled";
 
11451                        memset(&pref, 0, 
sizeof(pref));
 
11452                        strcpy(caller_pref_buf, 
"disabled");
 
11453                        strcpy(host_pref_buf, 
"disabled");
 
11456                        using_prefs = 
"mine";
 
11462                                using_prefs = 
"caller";
 
11478                            ast_debug(1, 
"We don't do requested format %s, falling back to peer capability '%s'\n",
 
11486                                    ast_log(
LOG_WARNING, 
"Rejected connect attempt from %s, requested '%s' incompatible with our capability '%s'.\n",
 
11491                                    ast_log(
LOG_WARNING, 
"Rejected connect attempt from %s, requested/capability '%s'/'%s' incompatible with our capability '%s'.\n",
 
11498                            memset(&ied0, 0, 
sizeof(ied0));
 
11513                                    memset(&pref, 0, 
sizeof(pref));
 
11517                                    strcpy(caller_pref_buf,
"disabled");
 
11518                                    strcpy(host_pref_buf,
"disabled");
 
11521                                    using_prefs = 
"mine";
 
11528                                            using_prefs = 
"caller";
 
11544                                        ast_log(
LOG_WARNING, 
"Rejected connect attempt from %s, requested '%s' incompatible with our capability '%s'.\n",
 
11549                                        ast_log(
LOG_WARNING, 
"Rejected connect attempt from %s, requested/capability '%s'/'%s' incompatible with our capability '%s'.\n",
 
11556                                memset(&ied0, 0, 
sizeof(ied0));
 
11568                        memset(&ied1, 0, 
sizeof(ied1));
 
11575                            ast_verb(3, 
"Accepting AUTHENTICATED call from %s:\n" 
11576                                            "%srequested auth methods = (%s),\n" 
11577                                            "%sactual auth method = %s,\n" 
11578                                            "%sencrypted = %s,\n" 
11579                                            "%srequested format = %s,\n" 
11580                                            "%srequested prefs = %s,\n" 
11581                                            "%sactual format = %s,\n" 
11582                                            "%shost prefs = %s,\n" 
11583                                            "%spriority = %s\n",
 
11612                            } 
else if (ies.
vars) {
 
11618                                if (variablestore && varlist) {
 
11619                                    variablestore->
data = varlist;
 
11622                                    ast_debug(1, 
"I can haz IAX vars? w00t\n");
 
11630                                            ast_log(
LOG_ERROR, 
"Memory allocation error while processing IAX2 variables\n");
 
11640                                    ast_log(
LOG_ERROR, 
"Memory allocation error while processing IAX2 variables\n");
 
11652                                goto immediatedial;
 
11665                            ast_log(
LOG_WARNING, 
"Rejected dial attempt from %s, request '%s@%s' does not exist\n",
 
11669                        memset(&ied0, 0, 
sizeof(ied0));
 
11679                        ast_verb(3, 
"Accepting DIAL from %s, formats = %s\n",
 
11689                        } 
else if (ies.
vars) {
 
11695                            ast_debug(1, 
"I can haz IAX vars? w00t\n");
 
11696                            if (variablestore && varlist) {
 
11697                                variablestore->
data = varlist;
 
11707                                        ast_log(
LOG_ERROR, 
"Memory allocation error while processing IAX2 variables\n");
 
11717                                ast_log(
LOG_ERROR, 
"Memory allocation error while processing IAX2 variables\n");
 
11729                ast_debug(1, 
"Immediately destroying %d, having received INVAL\n", fr->
callno);
 
11734                ast_debug(1, 
"Received VNAK: resending outstanding frames\n");
 
11800                    memset(&ied0, 0, 
sizeof(ied0));
 
11875                    memset(&ied0, 0, 
sizeof(ied0));
 
11876                    memset(&ied1, 0, 
sizeof(ied1));
 
11894                    memset(&ied0, 0, 
sizeof(ied0));
 
11895                    memset(&ied1, 0, 
sizeof(ied1));
 
11931                        "we've been told to rotate our encryption key, " 
11932                        "but this isn't an encrypted call. bad things will happen.\n" 
11953                memset(&ied0, 0, 
sizeof(ied0));
 
11973                memset(&ied0, 0, 
sizeof(ied0));
 
11980                ast_debug(1, 
"I can haz IAX vars, but they is no good :-(\n");
 
12000    } 
else if (minivid) {
 
12003            if (ntohs(vh->
ts) & 0x8000LL) {
 
12019        f.
datalen = res - 
sizeof(*vh);
 
12026            fr->
ts = (
iaxs[fr->
callno]->
last & 0xFFFF8000L) | ((ntohs(vh->ts) + test_resync) & 0x7fff);
 
12029            fr->
ts = (
iaxs[fr->
callno]->
last & 0xFFFF8000L) | (ntohs(vh->ts) & 0x7fff);
 
12041            ast_debug(1, 
"Received mini frame before first full voice frame\n");
 
12060            fr->
ts = (
iaxs[fr->
callno]->
last & 0xFFFF0000L) | ((ntohs(mh->
ts) + test_resync) & 0xffff);
 
12078            ast_debug(2, 
"Callno %d: Blocked receiving control frame %d.\n",
 
12089                ast_debug(2, 
"Callno %d: Config blocked receiving control frame %d.\n",
 
 
12211    struct timeval wait;
 
12212    struct timespec ts;
 
12213    int put_into_idle = 0;
 
12214    int first_time = 1;
 
12219    pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &old_state);
 
12238        if (put_into_idle) {
 
12246            ts.tv_sec = wait.tv_sec;
 
12247            ts.tv_nsec = wait.tv_usec * 1000;
 
12251                if (!put_into_idle || 
thread->stop) {
 
12271                ts.tv_sec = wait.tv_sec;
 
12272                ts.tv_nsec = wait.tv_usec * 1000;
 
12292        switch (
thread->iostate) {
 
12304#ifdef SCHED_MULTITHREADED 
12322        time(&
thread->checktime);
 
12324#ifdef DEBUG_SCHED_MULTITHREAD 
12325        thread->curfunc[0]=
'\0';
 
12344        pthread_detach(pthread_self());
 
12350    pthread_cleanup_pop(1);
 
 
12371        int callno = reg->
callno;
 
12379            ast_debug(1, 
"Unable to send registration request for '%s' without IP address\n", reg->
username);
 
12391        ast_debug(3, 
"Allocate call number\n");
 
12406    memset(&ied, 0, 
sizeof(ied));
 
 
12426    memset(&cai, 0, 
sizeof(cai));
 
12428    ast_debug(1, 
"Provisioning '%s' from template '%s'\n", dest, 
template);
 
12431        ast_debug(1, 
"No provisioning found for template '%s'\n", 
template);
 
12442    memset(&ied, 0, 
sizeof(ied));
 
12449    if (
iaxs[callno]) {
 
 
12477    opts = strchr(sdata, 
'|');
 
12490    ast_verb(3, 
"Provisioned IAXY at '%s' with '%s'= %d\n",
 
 
12503        e->
command = 
"iax2 provision";
 
12505            "Usage: iax2 provision <host> <template> [forced]\n" 
12506            "       Provisions the given peer or IP address using a template\n" 
12507            "       matching either 'template' or '*' if the template is not\n" 
12508            "       found.  If 'forced' is specified, even empty provisioning\n" 
12509            "       fields will be provisioned as empty fields.\n";
 
12520        if (!strcasecmp(
a->argv[4], 
"forced"))
 
12527        ast_cli(
a->fd, 
"Unable to find peer/address '%s'\n", 
a->argv[2]);
 
12529        ast_cli(
a->fd, 
"No template (including wildcard) matching '%s'\n", 
a->argv[3]);
 
12531        ast_cli(
a->fd, 
"Provisioning '%s' with template '%s'%s\n", 
a->argv[2], 
a->argv[3], force ? 
", forced" : 
"");
 
 
12540    if (peer->
lastms > -1) {
 
12546            "peer_status", 
"Unreachable",
 
 
12568#ifdef SCHED_MULTITHREADED 
 
12687    memset(&pds, 0, 
sizeof(pds));
 
12697    memset(&cai, 0, 
sizeof(cai));
 
12725        if ((new_callno = 
make_trunk(callno, 1)) != -1)
 
12726            callno = new_callno;
 
12738        requestor, cai.
found);
 
12779            ao2_ref(best_fmt_native, -1);
 
 
12802        pthread_testcancel();
 
12809        if (res < 0 && 
errno != -EINTR) {
 
 
12821    int threadcount = 0;
 
12827            thread->threadnum = ++threadcount;
 
12861    ast_verb(2, 
"%d helper threads started\n", threadcount);
 
 
12878    if (strstr(
value, 
"rsa"))
 
12880    if (strstr(
value, 
"md5"))
 
12882    if (strstr(
value, 
"plaintext"))
 
 
12897    sd = socket(addr->
ss.ss_family, SOCK_DGRAM, 0);
 
 
12930        port = atoi(portstr);
 
12968    if (nonlocal == 1) {
 
12970            "Non-local or unbound address specified (%s) in sourceaddress for '%s', reverting to default\n",
 
12974    } 
else if (nonlocal == 2) {
 
12976            "Unable to bind to sourceaddress '%s' for '%s', reverting to default\n",
 
12981        ast_debug(1, 
"Using sourceaddress %s for '%s'\n", srcaddr, peer->
name);
 
 
13021    int subscribe_acl_change = 0;
 
13032            oldacl = peer->
acl;
 
13082            if (!strcasecmp(v->
name, 
"secret")) {
 
13084            } 
else if (!strcasecmp(v->
name, 
"mailbox")) {
 
13086            } 
else if (!strcasecmp(v->
name, 
"mohinterpret")) {
 
13088            } 
else if (!strcasecmp(v->
name, 
"mohsuggest")) {
 
13090            } 
else if (!strcasecmp(v->
name, 
"dbsecret")) {
 
13092            } 
else if (!strcasecmp(v->
name, 
"description")) {
 
13094            } 
else if (!strcasecmp(v->
name, 
"trunk")) {
 
13097                    ast_log(
LOG_WARNING, 
"Unable to support trunking on peer '%s' without a timing interface\n", peer->
name);
 
13100            } 
else if (!strcasecmp(v->
name, 
"auth")) {
 
13105            } 
else if (!strcasecmp(v->
name, 
"encryption")) {
 
13110            } 
else if (!strcasecmp(v->
name, 
"forceencryption")) {
 
13119            } 
else if (!strcasecmp(v->
name, 
"transfer")) {
 
13120                if (!strcasecmp(v->
value, 
"mediaonly")) {
 
13126            } 
else if (!strcasecmp(v->
name, 
"jitterbuffer")) {
 
13128            } 
else if (!strcasecmp(v->
name, 
"host")) {
 
13129                if (!strcasecmp(v->
value, 
"dynamic")) {
 
13157            } 
else if (!strcasecmp(v->
name, 
"defaultip")) {
 
13159                peer_defaddr_tmp.
ss.ss_family = AF_UNSPEC;
 
13165            } 
else if (!strcasecmp(v->
name, 
"sourceaddress")) {
 
13167            } 
else if (!strcasecmp(v->
name, 
"permit") ||
 
13168                       !strcasecmp(v->
name, 
"deny") ||
 
13169                       !strcasecmp(v->
name, 
"acl")) {
 
13171            } 
else if (!strcasecmp(v->
name, 
"mask")) {
 
13174            } 
else if (!strcasecmp(v->
name, 
"context")) {
 
13176            } 
else if (!strcasecmp(v->
name, 
"regexten")) {
 
13178            } 
else if (!strcasecmp(v->
name, 
"peercontext")) {
 
13180            } 
else if (!strcasecmp(v->
name, 
"port")) {
 
13190            } 
else if (!strcasecmp(v->
name, 
"username")) {
 
13192            } 
else if (!strcasecmp(v->
name, 
"allow")) {
 
13194            } 
else if (!strcasecmp(v->
name, 
"disallow")) {
 
13196            } 
else if (!strcasecmp(v->
name, 
"callerid")) {
 
13208            } 
else if (!strcasecmp(v->
name, 
"fullname")) {
 
13211            } 
else if (!strcasecmp(v->
name, 
"cid_number")) {
 
13214            } 
else if (!strcasecmp(v->
name, 
"sendani")) {
 
13216            } 
else if (!strcasecmp(v->
name, 
"inkeys")) {
 
13218            } 
else if (!strcasecmp(v->
name, 
"outkey")) {
 
13220            } 
else if (!strcasecmp(v->
name, 
"qualify")) {
 
13221                if (!strcasecmp(v->
value, 
"no")) {
 
13223                } 
else if (!strcasecmp(v->
value, 
"yes")) {
 
13225                } 
else if (sscanf(v->
value, 
"%30d", &peer->
maxms) != 1) {
 
13226                    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);
 
13229            } 
else if (!strcasecmp(v->
name, 
"qualifysmoothing")) {
 
13231            } 
else if (!strcasecmp(v->
name, 
"qualifyfreqok")) {
 
13233                    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);
 
13235            } 
else if (!strcasecmp(v->
name, 
"qualifyfreqnotok")) {
 
13237                    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);
 
13239            } 
else if (!strcasecmp(v->
name, 
"timezone")) {
 
13241            } 
else if (!strcasecmp(v->
name, 
"adsi")) {
 
13243            } 
else if (!strcasecmp(v->
name, 
"connectedline")) {
 
13246                } 
else if (!strcasecmp(v->
value, 
"send")) {
 
13249                } 
else if (!strcasecmp(v->
value, 
"receive")) {
 
13255            } 
else if (!strcasecmp(v->
name, 
"maxcallnumbers")) {
 
13261            } 
else if (!strcasecmp(v->
name, 
"requirecalltoken")) {
 
13265                } 
else if (!strcasecmp(v->
value, 
"auto")) {
 
13306    if (subscribe_acl_change) {
 
 
13335    int oldcurauthreq = 0;
 
13336    int subscribe_acl_change = 0;
 
13337    char *varname = 
NULL, *varval = 
NULL;
 
13348            oldcurauthreq = 
user->curauthreq;
 
13349            oldacl = 
user->acl;
 
13350            oldcon = 
user->contexts;
 
13369            user->curauthreq = oldcurauthreq;
 
13391            if (!strcasecmp(v->
name, 
"context")) {
 
13397                        user->contexts = con;
 
13400            } 
else if (!strcasecmp(v->
name, 
"permit") ||
 
13401                       !strcasecmp(v->
name, 
"deny") ||
 
13402                       !strcasecmp(v->
name, 
"acl")) {
 
13404            } 
else if (!strcasecmp(v->
name, 
"setvar")) {
 
13406                if ((varval = strchr(varname, 
'='))) {
 
13412                            user->vars = tmpvar;
 
13416            } 
else if (!strcasecmp(v->
name, 
"allow")) {
 
13418            } 
else if (!strcasecmp(v->
name, 
"disallow")) {
 
13420            } 
else if (!strcasecmp(v->
name, 
"trunk")) {
 
13423                    ast_log(
LOG_WARNING, 
"Unable to support trunking on user '%s' without a timing interface\n", 
user->name);
 
13426            } 
else if (!strcasecmp(v->
name, 
"auth")) {
 
13431            } 
else if (!strcasecmp(v->
name, 
"encryption")) {
 
13433                if (!
user->encmethods) {
 
13436            } 
else if (!strcasecmp(v->
name, 
"forceencryption")) {
 
13441                    if (
user->encmethods) {
 
13445            } 
else if (!strcasecmp(v->
name, 
"transfer")) {
 
13446                if (!strcasecmp(v->
value, 
"mediaonly")) {
 
13452            } 
else if (!strcasecmp(v->
name, 
"codecpriority")) {
 
13453                if(!strcasecmp(v->
value, 
"caller"))
 
13455                else if(!strcasecmp(v->
value, 
"disabled"))
 
13457                else if(!strcasecmp(v->
value, 
"reqonly")) {
 
13461            } 
else if (!strcasecmp(v->
name, 
"immediate")) {
 
13463            } 
else if (!strcasecmp(v->
name, 
"jitterbuffer")) {
 
13465            } 
else if (!strcasecmp(v->
name, 
"dbsecret")) {
 
13467            } 
else if (!strcasecmp(v->
name, 
"secret")) {
 
13474            } 
else if (!strcasecmp(v->
name, 
"callerid")) {
 
13487            } 
else if (!strcasecmp(v->
name, 
"fullname")) {
 
13496            } 
else if (!strcasecmp(v->
name, 
"cid_number")) {
 
13505            } 
else if (!strcasecmp(v->
name, 
"accountcode")) {
 
13507            } 
else if (!strcasecmp(v->
name, 
"mohinterpret")) {
 
13509            } 
else if (!strcasecmp(v->
name, 
"mohsuggest")) {
 
13511            } 
else if (!strcasecmp(v->
name, 
"parkinglot")) {
 
13513            } 
else if (!strcasecmp(v->
name, 
"language")) {
 
13515            } 
else if (!strcasecmp(v->
name, 
"amaflags")) {
 
13520                    user->amaflags = format;
 
13522            } 
else if (!strcasecmp(v->
name, 
"inkeys")) {
 
13524            } 
else if (!strcasecmp(v->
name, 
"maxauthreq")) {
 
13526                if (
user->maxauthreq < 0)
 
13527                    user->maxauthreq = 0;
 
13528            } 
else if (!strcasecmp(v->
name, 
"adsi")) {
 
13530            } 
else if (!strcasecmp(v->
name, 
"connectedline")) {
 
13533                } 
else if (!strcasecmp(v->
value, 
"send")) {
 
13536                } 
else if (!strcasecmp(v->
value, 
"receive")) {
 
13542            } 
else if (!strcasecmp(v->
name, 
"requirecalltoken")) {
 
13546                } 
else if (!strcasecmp(v->
value, 
"auto")) {
 
13561        if (!
user->authmethods) {
 
13582    if (subscribe_acl_change) {
 
 
13691    const char *tosval;
 
13696    int subscribe_network_change = 1;
 
13773        if (!strcasecmp(v->
name, 
"bindport")) {
 
13780        } 
else if (!strcasecmp(v->
name, 
"pingtime")){
 
13783        else if (!strcasecmp(v->
name, 
"iaxthreadcount")) {
 
13797        } 
else if (!strcasecmp(v->
name, 
"iaxmaxthreadcount")) {
 
13812        } 
else if (!strcasecmp(v->
name, 
"nochecksums")) {
 
13820                ast_log(
LOG_WARNING, 
"Disabling RTP checksums is not supported on this operating system!\n");
 
13823        else if (!strcasecmp(v->
name, 
"maxjitterbuffer"))
 
13825        else if (!strcasecmp(v->
name, 
"resyncthreshold"))
 
13827        else if (!strcasecmp(v->
name, 
"maxjitterinterps"))
 
13829        else if (!strcasecmp(v->
name, 
"jittertargetextra"))
 
13831        else if (!strcasecmp(v->
name, 
"lagrqtime"))
 
13833        else if (!strcasecmp(v->
name, 
"maxregexpire"))
 
13835        else if (!strcasecmp(v->
name, 
"minregexpire"))
 
13837        else if (!strcasecmp(v->
name, 
"bindaddr")) {
 
13865        } 
else if (!strcasecmp(v->
name, 
"auth")) {
 
13870        } 
else if (!strcasecmp(v->
name, 
"authdebug")) {
 
13872        } 
else if (!strcasecmp(v->
name, 
"encryption")) {
 
13877        } 
else if (!strcasecmp(v->
name, 
"forceencryption")) {
 
13886        } 
else if (!strcasecmp(v->
name, 
"transfer")) {
 
13887            if (!strcasecmp(v->
value, 
"mediaonly")) {
 
13893        } 
else if (!strcasecmp(v->
name, 
"codecpriority")) {
 
13894            if(!strcasecmp(v->
value, 
"caller"))
 
13896            else if(!strcasecmp(v->
value, 
"disabled"))
 
13898            else if(!strcasecmp(v->
value, 
"reqonly")) {
 
13902        } 
else if (!strcasecmp(v->
name, 
"jitterbuffer"))
 
13904        else if (!strcasecmp(v->
name, 
"delayreject"))
 
13906        else if (!strcasecmp(v->
name, 
"allowfwdownload"))
 
13908        else if (!strcasecmp(v->
name, 
"rtcachefriends"))
 
13910        else if (!strcasecmp(v->
name, 
"rtignoreregexpire"))
 
13912        else if (!strcasecmp(v->
name, 
"rtupdate"))
 
13914        else if (!strcasecmp(v->
name, 
"rtsavesysname"))
 
13916        else if (!strcasecmp(v->
name, 
"trunktimestamps"))
 
13918        else if (!strcasecmp(v->
name, 
"rtautoclear")) {
 
13919            int i = atoi(v->
value);
 
13925        } 
else if (!strcasecmp(v->
name, 
"trunkfreq")) {
 
13928                ast_log(
LOG_NOTICE, 
"trunkfreq must be between 10ms and 1000ms, using 10ms instead.\n");
 
13931                ast_log(
LOG_NOTICE, 
"trunkfreq must be between 10ms and 1000ms, using 1000ms instead.\n");
 
13937        } 
else if (!strcasecmp(v->
name, 
"trunkmtu")) {
 
13938            mtuv = atoi(v->
value);
 
13941            else if (mtuv >= 172 && mtuv < 4000)
 
13946        } 
else if (!strcasecmp(v->
name, 
"trunkmaxsize")) {
 
13950        } 
else if (!strcasecmp(v->
name, 
"autokill")) {
 
13951            if (sscanf(v->
value, 
"%30d", &x) == 1) {
 
13961        } 
else if (!strcasecmp(v->
name, 
"bandwidth")) {
 
13962            if (!strcasecmp(v->
value, 
"low")) {
 
13965            } 
else if (!strcasecmp(v->
value, 
"medium")) {
 
13968            } 
else if (!strcasecmp(v->
value, 
"high")) {
 
13974        } 
else if (!strcasecmp(v->
name, 
"allow")) {
 
13976        } 
else if (!strcasecmp(v->
name, 
"disallow")) {
 
13978        } 
else if (!strcasecmp(v->
name, 
"register")) {
 
13980        } 
else if (!strcasecmp(v->
name, 
"iaxcompat")) {
 
13982        } 
else if (!strcasecmp(v->
name, 
"regcontext")) {
 
13986        } 
else if (!strcasecmp(v->
name, 
"tos")) {
 
13989        } 
else if (!strcasecmp(v->
name, 
"cos")) {
 
13992        } 
else if (!strcasecmp(v->
name, 
"parkinglot")) {
 
13994        } 
else if (!strcasecmp(v->
name, 
"accountcode")) {
 
13996        } 
else if (!strcasecmp(v->
name, 
"mohinterpret")) {
 
13998        } 
else if (!strcasecmp(v->
name, 
"mohsuggest")) {
 
14000        } 
else if (!strcasecmp(v->
name, 
"amaflags")) {
 
14007        } 
else if (!strcasecmp(v->
name, 
"language")) {
 
14009        } 
else if (!strcasecmp(v->
name, 
"maxauthreq")) {
 
14013        } 
else if (!strcasecmp(v->
name, 
"adsi")) {
 
14015        } 
else if (!strcasecmp(v->
name, 
"srvlookup")) {
 
14017        } 
else if (!strcasecmp(v->
name, 
"connectedline")) {
 
14020            } 
else if (!strcasecmp(v->
value, 
"send")) {
 
14023            } 
else if (!strcasecmp(v->
value, 
"receive")) {
 
14029        } 
else if (!strcasecmp(v->
name, 
"maxcallnumbers")) {
 
14033        } 
else if (!strcasecmp(v->
name, 
"maxcallnumbers_nonvalidated")) {
 
14037        } 
else if (!strcasecmp(v->
name, 
"calltokenoptional")) {
 
14042        } 
else if (!strcasecmp(v->
name, 
"calltokenexpiration")) {
 
14044            sscanf(v->
value, 
"%u", &temp);
 
14050        }  
else if (!strcasecmp(v->
name, 
"subscribe_network_change_event")) {
 
14052                subscribe_network_change = 1;
 
14054                subscribe_network_change = 0;
 
14058        } 
else if (!strcasecmp(v->
name, 
"shrinkcallerid")) {
 
14071    if (subscribe_network_change) {
 
14100        ast_log(
LOG_WARNING, 
"Minimum registration interval of %d is more than maximum of %d, resetting minimum to %d\n",
 
14109        if (strcasecmp(cat, 
"general")) {
 
14111            if (!strcasecmp(cat, 
"callnumberlimits")) {
 
14113            } 
else if (utype) {
 
14114                if (!strcasecmp(utype, 
"user") || !strcasecmp(utype, 
"friend")) {
 
14121                if (!strcasecmp(utype, 
"peer") || !strcasecmp(utype, 
"friend")) {
 
14129                } 
else if (strcasecmp(utype, 
"user")) {
 
 
14155    static const char config[] = 
"iax.conf";
 
 
14190            "Usage: iax2 reload\n" 
14191            "       Reloads IAX configuration from iax.conf\n";
 
 
14221            if (
iaxs[x] && !strcasecmp(data, 
iaxs[x]->dproot))
 
14229    memset(&cai, 0, 
sizeof(cai));
 
14230    memset(&ied, 0, 
sizeof(ied));
 
14231    memset(&pds, 0, 
sizeof(pds));
 
14245    ast_debug(1, 
"peer: %s, username: %s, password: %s, context: %s\n",
 
 
14284    int x, com[2], timeout, doabort, callno;
 
14357        pfd.events = POLLIN;
 
14364        } 
else if (!pfd.revents) {
 
14385                dp->
flags &= ~CACHE_FLAG_PENDING;
 
14392                        if (write(dp->
waiters[x], 
"asdf", 4) < 0) {
 
 
14410    ast_log(
LOG_NOTICE, 
"iax2_exists: con: %s, exten: %s, pri: %d, cid: %s, data: %s\n", context, 
exten, 
priority, callerid ? callerid : 
"<unknown>", data);
 
 
14433    ast_log(
LOG_NOTICE, 
"iax2_canmatch: con: %s, exten: %s, pri: %d, cid: %s, data: %s\n", context, 
exten, 
priority, callerid ? callerid : 
"<unknown>", data);
 
 
14456    ast_log(
LOG_NOTICE, 
"iax2_matchmore: con: %s, exten: %s, pri: %d, cid: %s, data: %s\n", context, 
exten, 
priority, callerid ? callerid : 
"<unknown>", data);
 
 
14482    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);
 
14500            ncontext = strchr(odata, 
'/');
 
14504                snprintf(req, 
sizeof(req), 
"IAX2/%s/%s@%s", odata, exten, ncontext);
 
14506                snprintf(req, 
sizeof(req), 
"IAX2/%s/%s", odata, exten);
 
14508            ast_verb(3, 
"Executing Dial('%s')\n", req);
 
14511            ast_log(
LOG_WARNING, 
"Can't execute nonexistent extension '%s[@%s]' in data '%s'\n", exten, context, data);
 
 
14528    char *peername, *colname;
 
14533    if (!strcmp(peername,
"CURRENTCHANNEL")) {
 
14543    if ((colname = strchr(peername, 
',')))
 
14551    if (!strcasecmp(colname, 
"ip")) {
 
14553    } 
else  if (!strcasecmp(colname, 
"status")) {
 
14555    } 
else  if (!strcasecmp(colname, 
"mailbox")) {
 
14557    } 
else  if (!strcasecmp(colname, 
"context")) {
 
14559    } 
else  if (!strcasecmp(colname, 
"expire")) {
 
14561    } 
else  if (!strcasecmp(colname, 
"dynamic")) {
 
14563    } 
else  if (!strcasecmp(colname, 
"callerid_name")) {
 
14565    } 
else  if (!strcasecmp(colname, 
"callerid_num")) {
 
14567    } 
else  if (!strcasecmp(colname, 
"codecs")) {
 
14572    } 
else  if (!strncasecmp(colname, 
"codec[", 6)) {
 
14573        char *codecnum, *ptr;
 
14577        codecnum = colname + 5;
 
14580        if ((ptr = strchr(codecnum, 
']'))) {
 
 
14620    if (!strcasecmp(
args, 
"osptoken")) {
 
14622    } 
else if (!strcasecmp(
args, 
"peerip")) {
 
14624    } 
else if (!strcasecmp(
args, 
"peername")) {
 
14626    } 
else if (!strcasecmp(
args, 
"secure_signaling") || !strcasecmp(
args, 
"secure_media")) {
 
 
14645    memset(&pds, 0, 
sizeof(pds));
 
14653    ast_debug(3, 
"Checking device state for device %s\n", pds.
peer);
 
14661    ast_debug(3, 
"Found peer. What's device state of %s? addr=%s, defaddr=%s maxms=%d, lastms=%d\n",
 
 
14681    .description = 
"IAX Remote Dialplan Switch",
 
 
14710    AST_CLI_DEFINE(handle_cli_iax2_test_jitter,         
"Simulates jitter for testing"),
 
14711    AST_CLI_DEFINE(handle_cli_iax2_test_late,           
"Test the receipt of a late frame"),
 
14712    AST_CLI_DEFINE(handle_cli_iax2_test_resync,         
"Test a resync in received timestamps"),
 
 
14719    struct iax2_thread_list *list_head = head;
 
14724        pthread_t thread_id = 
thread->threadid;
 
14730        pthread_join(thread_id, 
NULL);
 
 
14848    return match(&pvt2->addr, pvt2->peercallno, pvt2->callno, pvt,
 
 
14866    return match(&pvt2->transfer, pvt2->transfercallno, pvt2->callno, pvt,
 
 
14878        goto container_fail;
 
14884        goto container_fail;
 
14890        goto container_fail;
 
14896        goto container_fail;
 
14902        goto container_fail;
 
14908        goto container_fail;
 
14914        goto container_fail;
 
14918        goto container_fail;
 
14923        goto container_fail;
 
 
14965    static const char config[] = 
"iax.conf";
 
15079        ast_verb(2, 
"IAX Ready and Listening\n");
 
15094    ast_realtime_require_field(
"iaxpeers", 
"name", 
RQ_CHAR, 10, 
"ipaddr", 
RQ_CHAR, 15, 
"port", 
RQ_UINTEGER2, 5, 
"regseconds", 
RQ_UINTEGER2, 6, 
SENTINEL);
 
 
15107    .
requires = 
"dnsmgr",
 
15108    .optional_modules = 
"res_crypto",
 
Access Control of various sorts.
enum ast_acl_sense ast_apply_acl(struct ast_acl_list *acl_list, const struct ast_sockaddr *addr, const char *purpose)
Apply a set of rules to a given IP address.
void ast_free_ha(struct ast_ha *ha)
Free a list of HAs.
int ast_str2tos(const char *value, unsigned int *tos)
Convert a string to the appropriate TOS value.
struct stasis_message_type * ast_named_acl_change_type(void)
a stasis_message_type for changes against a named ACL or the set of all named ACLs
void ast_copy_ha(const struct ast_ha *from, struct ast_ha *to)
Copy the contents of one HA to another.
void ast_append_acl(const char *sense, const char *stuff, struct ast_acl_list **path, int *error, int *named_acl_flag)
Add a rule to an ACL struct.
int ast_get_ip(struct ast_sockaddr *addr, const char *hostname)
Get the IP address given a hostname.
int ast_acl_list_is_empty(struct ast_acl_list *acl_list)
Determines if an ACL is empty or if it contains entries.
int ast_str2cos(const char *value, unsigned int *cos)
Convert a string to the appropriate COS value.
struct ast_acl_list * ast_free_acl_list(struct ast_acl_list *acl)
Free a list of ACLs.
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_get_ip_or_srv(struct ast_sockaddr *addr, const char *hostname, const char *service)
Get the IP address given a hostname and optional service.
void ast_cli_unregister_multiple(void)
static const struct adsi_event events[]
static int copy(char *infile, char *outfile)
Utility function to copy a file.
Persistent data storage (akin to *doze registry)
int ast_db_put(const char *family, const char *key, const char *value)
Store value addressed by family/key.
int ast_db_get(const char *family, const char *key, char *value, int valuelen)
Get key value specified by family/key.
int ast_db_del(const char *family, const char *key)
Delete entry in astdb.
char * strsep(char **str, const char *delims)
Asterisk main include file. File version handling, generic pbx functions.
#define ast_alloca(size)
call __builtin_alloca to ensure we get gcc builtin semantics
#define ast_realloc(p, len)
A wrapper for realloc()
#define ast_strdup(str)
A wrapper for strdup()
#define ast_strdupa(s)
duplicate a string in memory from the stack
void ast_free_ptr(void *ptr)
free() wrapper
#define ast_calloc(num, len)
A wrapper for calloc()
#define ast_malloc(len)
A wrapper for malloc()
#define ao2_iterator_next(iter)
#define ao2_link(container, obj)
Add an object to a container.
@ AO2_ALLOC_OPT_LOCK_MUTEX
#define ao2_callback(c, flags, cb_fn, arg)
ao2_callback() is a generic function that applies cb_fn() to all objects in a container,...
#define ao2_unlink(container, obj)
Remove an object from a container.
#define ao2_find(container, arg, flags)
struct ao2_iterator ao2_iterator_init(struct ao2_container *c, int flags) attribute_warn_unused_result
Create an iterator for a container.
#define ao2_ref(o, delta)
Reference/unreference an object and return the old refcount.
void ao2_iterator_destroy(struct ao2_iterator *iter)
Destroy a container iterator.
#define ao2_alloc(data_size, destructor_fn)
#define ao2_container_alloc_hash(ao2_options, container_options, n_buckets, hash_fn, sort_fn, cmp_fn)
Allocate and initialize a hash container with the desired number of buckets.
enum ast_transfer_result ast_bridge_transfer_blind(int is_external, struct ast_channel *transferer, const char *exten, const char *context, transfer_channel_cb new_channel_cb, void *user_data)
Blind transfer target to the extension and context provided.
@ AST_BRIDGE_TRANSFER_SUCCESS
CallerID (and other GR30) management and generation Includes code and algorithms from the Zapata libr...
#define AST_PRES_ALLOWED_USER_NUMBER_PASSED_SCREEN
char * ast_callerid_merge(char *buf, int bufsiz, const char *name, const char *num, const char *unknown)
#define AST_PRES_NUMBER_NOT_AVAILABLE
void ast_shrink_phone_number(char *n)
Shrink a phone number in place to just digits (more accurately it just removes ()'s,...
int ast_callerid_split(const char *src, char *name, int namelen, char *num, int numlen)
Internal Asterisk hangup causes.
#define AST_CAUSE_CONGESTION
#define AST_CAUSE_BEARERCAPABILITY_NOTAVAIL
#define AST_CAUSE_DESTINATION_OUT_OF_ORDER
#define AST_CAUSE_NO_USER_RESPONSE
#define AST_CAUSE_FACILITY_NOT_SUBSCRIBED
#define AST_CAUSE_CALL_REJECTED
#define AST_CAUSE_FACILITY_REJECTED
#define AST_CAUSE_NO_ROUTE_DESTINATION
#define AST_CAUSE_UNREGISTERED
static const char config_file[]
static int timing_read(int *id, int fd, short events, void *cbdata)
#define IAX_TRUNKTIMESTAMPS
static int iax2_indicate(struct ast_channel *c, int condition, const void *data, size_t datalen)
static void set_peercnt_limit(struct peercnt *peercnt)
static int check_access(int callno, struct ast_sockaddr *addr, struct iax_ies *ies)
static int iaxthreadcount
static int send_ping(const void *data)
static int iax2_trunk_expired(struct iax2_trunk_peer *tpeer, struct timeval *now)
static int manager_iax2_show_peers(struct mansession *s, const struct message *m)
callback to display iax peers in manager
static struct ao2_container * peercnts
static struct iax2_context * build_context(const char *context)
static void save_rr(struct iax_frame *fr, struct iax_ies *ies)
static int update_registry(struct ast_sockaddr *addr, int callno, char *devtype, int fd, unsigned short refresh)
static int iax2_write(struct ast_channel *c, struct ast_frame *f)
#define AUTH_METHOD_NAMES_BUFSIZE
static struct iax2_peer * realtime_peer(const char *peername, struct ast_sockaddr *addr)
static int socket_process_meta(int packet_len, struct ast_iax2_meta_hdr *meta, struct ast_sockaddr *addr, int sockfd, struct iax_frame *fr)
static struct iax2_user * user_unref(struct iax2_user *user)
static int apply_context(struct iax2_context *con, const char *context)
static struct ast_channel_tech iax2_tech
static void __auto_hangup(const void *nothing)
static int iax2_poke_peer_cb(void *obj, void *arg, int flags)
static void iax2_destroy_helper(struct chan_iax2_pvt *pvt)
static char * complete_iax2_peers(const char *line, const char *word, int pos, int state, uint64_t flags)
static int randomcalltokendata
static int iaxdynamicthreadcount
static void iax2_lock_owner(int callno)
static int iax2_queue_hold(int callno, const char *musicclass)
Queue a hold frame on the ast_channel owner.
#define MAX_TIMESTAMP_SKEW
static void acl_change_stasis_subscribe(void)
static void store_by_transfercallno(struct chan_iax2_pvt *pvt)
static struct ast_channel * ast_iax2_new(int callno, int state, iax2_format capability, struct iax2_codec_pref *prefs, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, unsigned int cachable)
Create new call, interface with the PBX core.
static void jb_error_output(const char *fmt,...)
static int peer_hash_cb(const void *obj, const int flags)
static void iax2_publish_registry(const char *username, const char *domain, const char *status, const char *cause)
static int replace_callno(const void *obj)
#define CALLNO_ENTRY_IS_VALIDATED(a)
static int auto_congest(const void *data)
static unsigned int calc_txpeerstamp(struct iax2_trunk_peer *tpeer, int sampms, struct timeval *now)
static void __iax2_poke_noanswer(const void *data)
static int iax2_predestroy(int callno)
static int update_packet(struct iax_frame *f)
static int iax2_trunk_queue(struct chan_iax2_pvt *pvt, struct iax_frame *fr)
static char * handle_cli_iax2_prune_realtime(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static int peercnt_hash_cb(const void *obj, const int flags)
static int check_provisioning(struct ast_sockaddr *addr, int sockfd, char *si, unsigned int ver)
static int iax2_setoption(struct ast_channel *c, int option, void *data, int datalen)
static int send_command_transfer(struct chan_iax2_pvt *, char, int, unsigned int, const unsigned char *, int)
static void unwrap_timestamp(struct iax_frame *fr)
static int wait_for_peercallno(struct chan_iax2_pvt *pvt)
static int iax2_hangup(struct ast_channel *c)
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...
static int __schedule_action(void(*func)(const void *data), const void *data, const char *funcname)
static int addr_range_match_address_cb(void *obj, void *arg, int flags)
static int maxjitterbuffer
static int auth_fail(int callno, int failcode)
static char * handle_cli_iax2_test_losspct(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static int iax2_queue_hangup(int callno)
Queue a hangup frame on the ast_channel owner.
static int peercnt_remove_cb(const void *obj)
static unsigned int fix_peerts(struct timeval *rxtrunktime, int callno, unsigned int ts)
static unsigned char compress_subclass(iax2_format subclass)
static int handle_error(void)
static const char * auth_method_labels[]
Name of effective auth method.
static int peer_cmp_cb(void *obj, void *arg, int flags)
static void resend_with_token(int callno, struct iax_frame *f, const char *newtoken)
static int get_auth_methods(const char *value)
static int handle_call_token(struct ast_iax2_full_hdr *fh, struct iax_ies *ies, struct ast_sockaddr *addr, int fd)
static struct chan_iax2_pvt * new_iax(struct ast_sockaddr *addr, const char *host)
static char default_parkinglot[AST_MAX_CONTEXT]
static struct iax2_trunk_peer * find_tpeer(struct ast_sockaddr *addr, int fd)
static void iax_error_output(const char *data)
static void vnak_retransmit(int callno, int last)
static int user_delme_cb(void *obj, void *arg, int flags)
static int send_command_immediate(struct chan_iax2_pvt *, char, int, unsigned int, const unsigned char *, int, int)
static int acf_channel_read(struct ast_channel *chan, const char *funcname, char *preparse, char *buf, size_t buflen)
static struct ast_custom_function iaxvar_function
#define IAX_SHRINKCALLERID
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.
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.
static int __unload_module(void)
static char * handle_cli_iax2_set_debug(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static struct stasis_subscription * acl_change_sub
static int iax2_poke_peer(struct iax2_peer *peer, int heldcall)
static iax2_format iax2_capability
#define DEFAULT_MAX_THREAD_COUNT
static ast_mutex_t iaxsl[ARRAY_LEN(iaxs)]
chan_iax2_pvt structure locks
static int iax2_digit_end(struct ast_channel *c, char digit, unsigned int duration)
static uint16_t DEFAULT_MAXCALLNO_LIMIT_NONVAL
static struct ast_sched_context * sched
static void * dp_lookup_thread(void *data)
static uint16_t DEFAULT_MAXCALLNO_LIMIT
static void peercnt_modify(unsigned char reg, uint16_t limit, struct ast_sockaddr *sockaddr)
static int transmit_trunk(struct iax_frame *f, struct ast_sockaddr *addr, int sockfd)
static int registry_rerequest(struct iax_ies *ies, int callno, struct ast_sockaddr *addr)
static int send_command(struct chan_iax2_pvt *, char, int, unsigned int, const unsigned char *, int, int)
static void encmethods_to_str(int e, struct ast_str **buf)
static void construct_rr(struct chan_iax2_pvt *pvt, struct iax_ie_data *iep)
static struct ast_custom_function iaxpeer_function
static int load_objects(void)
static int complete_transfer(int callno, struct iax_ies *ies)
static int iax2_fixup(struct ast_channel *oldchannel, struct ast_channel *newchan)
static struct ast_format * codec_choose_from_prefs(struct iax2_codec_pref *pref, struct ast_format_cap *cap)
static int prune_addr_range_cb(void *obj, void *arg, int flags)
static void iax_debug_output(const char *data)
#define IAX_CALLENCRYPTED(pvt)
static char * handle_cli_iax2_provision(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static uint16_t global_maxcallno_nonval
static int maxjitterinterps
static int schedule_delivery(struct iax_frame *fr, int updatehistory, int fromtrunk, unsigned int *tsout)
static void jb_debug_output(const char *fmt,...)
static void iax_pvt_callid_new(int callno)
static char * regstate2str(int regstate)
static int last_authmethod
static int __iax2_show_peers(int fd, int *total, struct mansession *s, const int argc, const char *const argv[])
static int iax2_call(struct ast_channel *c, const char *dest, int timeout)
static char * handle_cli_iax2_set_mtu(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
Set trunk MTU from CLI.
static void pvt_destructor(void *obj)
static int addr_range_hash_cb(const void *obj, const int flags)
static int pvt_hash_cb(const void *obj, const int flags)
static int iax2_queue_unhold(int callno)
Queue an unhold frame on the ast_channel owner.
#define MAX_TRUNK_MTU
Maximum transmission unit for the UDP packet in the trunk not to be fragmented. This is based on 1516...
static int iax2_getpeername(struct ast_sockaddr addr, char *host, int len)
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 int find_callno_locked(unsigned short callno, unsigned short dcallno, struct ast_sockaddr *addr, int new, int sockfd, int full_frame)
static void * iax2_process_thread(void *data)
static int iax2_digit_begin(struct ast_channel *c, char digit)
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.
static char regcontext[AST_MAX_CONTEXT]
static int socket_process_helper(struct iax2_thread *thread)
#define IAX_CAPABILITY_FULLBANDWIDTH
static struct ao2_container * peers
static int set_config(const char *config_file, int reload, int forced)
Load configuration.
static int try_transfer(struct chan_iax2_pvt *pvt, struct iax_ies *ies)
static void _iax2_show_peers_one(int fd, struct mansession *s, struct show_peers_context *cont, struct iax2_peer *peer)
static void __auto_congest(const void *nothing)
static void free_signaling_queue_entry(struct signaling_queue_entry *s)
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)
#define MARK_IAX_SUBCLASS_TX
static int iax2_key_rotate(const void *vpvt)
#define schedule_action(func, data)
static int invalid_key(ast_aes_decrypt_key *ecx)
static int user_cmp_cb(void *obj, void *arg, int flags)
static void __expire_registry(const void *data)
static void reg_source_db(struct iax2_peer *p)
static int scheduled_destroy(const void *vid)
static void prune_peers(void)
static time_t max_calltoken_delay
static struct ao2_container * callno_limits
static int calltoken_required(struct ast_sockaddr *addr, const char *name, int subclass)
static struct ast_frame * iax2_read(struct ast_channel *c)
static struct ast_netsock_list * netsock
static int min_reg_expire
static int add_calltoken_ignore(const char *addr)
static int authenticate_reply(struct chan_iax2_pvt *p, struct ast_sockaddr *addr, struct iax_ies *ies, const char *override, const char *okey)
static char * handle_cli_iax2_show_firmware(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static int iax2_transfer(struct ast_channel *c, const char *dest)
static int iax2_transmit(struct iax_frame *fr)
static void __auth_reject(const void *nothing)
static void build_ecx_key(const unsigned char *digest, struct chan_iax2_pvt *pvt)
@ IAX_THREAD_TYPE_DYNAMIC
#define CALLNO_ENTRY_GET_CALLNO(a)
static int iax2_getpeertrunk(struct ast_sockaddr addr)
static int attempt_transmit(const void *data)
static int encrypt_frame(ast_aes_encrypt_key *ecx, struct ast_iax2_full_hdr *fh, unsigned char *poo, int *datalen)
static struct ast_netsock_list * outsock
static void prune_users(void)
static void user_destructor(void *obj)
static struct ao2_container * iax_transfercallno_pvts
Another container of iax2_pvt structures.
static struct iax2_user * find_user(const char *name)
static int resyncthreshold
#define IAX_RECVCONNECTEDLINE
static void register_peer_exten(struct iax2_peer *peer, int onoff)
static int transfercallno_pvt_cmp_cb(void *obj, void *arg, int flags)
static int iaxdynamicthreadnum
static ast_mutex_t callno_pool_lock
static int send_command_final(struct chan_iax2_pvt *, char, int, unsigned int, const unsigned char *, int, int)
static void free_context(struct iax2_context *con)
static char * handle_cli_iax2_show_channels(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
#define CALLNO_ENTRY_SET_VALIDATED(a)
static uint16_t total_nonval_callno_used
static int complete_dpreply(struct chan_iax2_pvt *pvt, struct iax_ies *ies)
#define IAX_DEBUGDIGEST(msg, key)
static const char tdesc[]
static void parse_dial_string(char *data, struct parsed_dial_string *pds)
Parses an IAX dial string into its component parts.
static int global_rtautoclear
static void iax2_destroy(int callno)
static int manager_iax2_show_netstats(struct mansession *s, const struct message *m)
static void spawn_dp_lookup(int callno, const char *context, const char *callednum, const char *callerid)
static struct iax_frame * iaxfrdup2(struct iax_frame *fr)
static int transmit_frame(void *data)
static int acf_iaxvar_write(struct ast_channel *chan, const char *cmd, char *data, const char *value)
static int iax2_answer(struct ast_channel *c)
static int iax2_authmethods
static const char * iax2_getformatname_multiple(iax2_format format, struct ast_str **codec_buf)
static void set_hangup_source_and_cause(int callno, unsigned char causecode)
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
static void __send_ping(const void *data)
static struct iax2_peer * find_peer(const char *name, int realtime)
static char * handle_cli_iax2_show_netstats(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static int iaxactivethreadcount
static int check_srcaddr(struct ast_sockaddr *addr)
Check if address can be used as packet source.
static void insert_idle_thread(struct iax2_thread *thread)
static void acl_change_stasis_unsubscribe(void)
static int match(struct ast_sockaddr *addr, unsigned short callno, unsigned short dcallno, const struct chan_iax2_pvt *cur, int check_dcallno)
static int pvt_cmp_cb(void *obj, void *arg, int flags)
static int authenticate(const char *challenge, const char *secret, const char *keyn, int authmethods, struct iax_ie_data *ied, struct ast_sockaddr *addr, struct chan_iax2_pvt *pvt)
static void network_change_stasis_cb(void *data, struct stasis_subscription *sub, struct stasis_message *message)
static int iaxdefaulttimeout
static struct ao2_container * users
static int auth_reject(const void *data)
@ NEW_ALLOW_CALLTOKEN_VALIDATED
static int create_callno_pools(void)
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....
#define CALLTOKEN_IE_FORMAT
static char * handle_cli_iax2_show_cache(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
#define IAX_FORCE_ENCRYPT
static char * handle_cli_iax2_reload(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static void network_change_stasis_subscribe(void)
static struct ast_switch iax2_switch
static void poke_all_peers(void)
#define IAX_SENDCONNECTEDLINE
static int(* iax2_regfunk)(const char *username, int onoff)
static int network_change_sched_cb(const void *data)
static struct @123 frame_queue[IAX_MAX_CALLS]
a list of frames that may need to be retransmitted
static int find_callno(unsigned short callno, unsigned short dcallno, struct ast_sockaddr *addr, int new, int sockfd, int full_frame)
static int __do_deliver(void *data)
#define IAX_RTCACHEFRIENDS
#define IAX_RTIGNOREREGEXPIRE
static int socket_process(struct iax2_thread *thread)
static int manager_iax2_show_registry(struct mansession *s, const struct message *m)
static void dp_lookup(int callno, const char *context, const char *callednum, const char *callerid, int skiplock)
static int iax2_poke_noanswer(const void *data)
static int get_unused_callno(enum callno_type type, int validated, callno_entry *entry)
static char * handle_cli_iax2_show_callno_limits(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static char * handle_cli_iax2_show_stats(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static struct ast_taskprocessor * transmit_processor
static int iaxdefaultdpcache
static int function_iaxpeer(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
static int send_lagrq(const void *data)
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 defaultsoc...
static int peercnt_add(struct ast_sockaddr *addr)
static int iax2_do_register(struct iax2_registry *reg)
static int iax2_register(const char *value, int lineno)
static int iax2_sendimage(struct ast_channel *c, struct ast_frame *img)
static struct ast_timer * timer
static void __send_lagrq(const void *data)
static void unlink_peer(struct iax2_peer *peer)
static int authenticate_request(int call_num)
static struct iax2_peer * peer_unref(struct iax2_peer *peer)
static int iax2_append_register(const char *hostname, const char *username, const char *secret, const char *porta)
static int firmware_show_callback(struct ast_iax2_firmware_header *header, void *user_data)
static int get_from_jb(const void *p)
static void save_osptoken(struct iax_frame *fr, struct iax_ies *ies)
static int max_reg_expire
static int iax2_queryoption(struct ast_channel *c, int option, void *data, int *datalen)
static unsigned int calc_timestamp(struct chan_iax2_pvt *p, unsigned int ts, struct ast_frame *f)
#define DEFAULT_RETRY_TIME
static int peer_status(struct iax2_peer *peer, char *status, int statuslen)
peer_status: Report Peer status in character string
static void set_config_destroy(void)
static int attribute_pure iax2_allow_new(int frametype, int subclass, int inbound)
#define IAX_RTSAVE_SYSNAME
static iax2_format iax2_codec_choose(struct iax2_codec_pref *pref, iax2_format formats)
static int iax2_delete_from_sched(const void *data)
static char * handle_cli_iax2_set_debug_jb(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
#define DEFAULT_FREQ_NOTOK
static void update_jbsched(struct chan_iax2_pvt *pvt)
static void store_by_peercallno(struct chan_iax2_pvt *pvt)
static int set_peercnt_limit_all_cb(void *obj, void *arg, int flags)
static void handle_deferred_full_frames(struct iax2_thread *thread)
Handle any deferred full frames for this thread.
static int ast_cli_netstats(struct mansession *s, int fd, int limit_fmt)
static int transfercallno_pvt_hash_cb(const void *obj, const int flags)
static int decrypt_frame(int callno, struct ast_iax2_full_hdr *fh, struct ast_frame *f, int *datalen)
static void iax_pvt_callid_set(int callno, ast_callid callid)
static void __get_from_jb(const void *p)
static int iax2_encryption
static int peercnt_remove_by_addr(struct ast_sockaddr *addr)
static int decode_frame(ast_aes_decrypt_key *dcx, struct ast_iax2_full_hdr *fh, struct ast_frame *f, int *datalen)
static struct call_number_pool callno_pool
static pthread_t netthreadid
#define CALLNO_ENTRY_TO_PTR(a)
static void build_rand_pad(unsigned char *buf, ssize_t len)
static void signal_condition(ast_mutex_t *lock, ast_cond_t *cond)
static char * handle_cli_iax2_set_debug_trunk(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static char * handle_cli_iax2_show_registry(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static int iax2_sched_add(struct ast_sched_context *sched, int when, ast_sched_cb callback, const void *data)
static int socket_read(int *id, int fd, short events, void *cbdata)
static int peer_delme_cb(void *obj, void *arg, int flags)
static int create_addr(const char *peername, struct ast_channel *c, struct ast_sockaddr *addr, struct create_addr_info *cai)
static char * auth_method_names(int authmethods, char *restrict buf)
Get names of all auth methods.
static int user_hash_cb(const void *obj, const int flags)
static void peer_destructor(void *obj)
static void __iax2_do_register_s(const void *data)
static int send_apathetic_reply(unsigned short callno, unsigned short dcallno, struct ast_sockaddr *addr, int command, int ts, unsigned char seqno, int sockfd, struct iax_ie_data *ied)
static void jb_warning_output(const char *fmt,...)
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.
calltoken_peer_enum
Call token validation settings.
@ CALLTOKEN_DEFAULT
Default calltoken required unless the ip is in the ignorelist.
@ CALLTOKEN_AUTO
Require call token validation after a successful registration using call token validation occurs.
@ CALLTOKEN_NO
Do not require call token validation.
@ CALLTOKEN_YES
Require call token validation.
static int get_encrypt_methods(const char *s)
static int jittertargetextra
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 struct ast_flags64 globalflags
static struct iax2_dpcache * find_cache(struct ast_channel *chan, const char *data, const char *context, const char *exten, int priority)
static iax2_format uncompress_subclass(unsigned char csub)
static void * network_thread(void *ignore)
static char * handle_cli_iax2_show_peers(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static int iax2_is_control_frame_allowed(int subtype)
static void network_change_stasis_unsubscribe(void)
static void realtime_update_peer(const char *peername, struct ast_sockaddr *sockaddr, time_t regtime)
static struct io_context * io
static char * complete_iax2_unregister(const char *line, const char *word, int pos, int state)
static struct stasis_subscription * network_change_sub
static int raw_hangup(struct ast_sockaddr *addr, unsigned short src, unsigned short dst, int sockfd)
#define PTR_TO_CALLNO_ENTRY(a)
static struct ao2_container * calltoken_ignores
static void * iax2_dup_variable_datastore(void *)
static struct iax2_codec_pref prefs_global
@ IAX_STATE_AUTHENTICATED
static struct iax2_user * realtime_user(const char *username, struct ast_sockaddr *addr)
#define IAX2_TRUNK_PREFACE
static int iax2_ack_registry(struct iax_ies *ies, struct ast_sockaddr *addr, int callno)
Acknowledgment received for OUR registration.
static void __iax2_poke_peer_s(const void *data)
static int load_module(void)
Load the module.
static int iax2_vnak(int callno)
#define IAX_CAPABILITY_MEDBANDWIDTH
static int iax2_parse_allow_disallow(struct iax2_codec_pref *pref, iax2_format *formats, const char *list, int allowing)
#define DEFAULT_TRUNKDATA
static char * handle_cli_iax2_show_peer(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
Show one peer in detail.
static void iax2_process_thread_cleanup(void *data)
#define IAX_TRANSFERMEDIA
static int iax2_sendhtml(struct ast_channel *c, int subclass, const char *data, int datalen)
static int addr_range_cmp_cb(void *obj, void *arg, int flags)
static int registry_authrequest(int callno)
static int iax2_provision(struct ast_sockaddr *end, int sockfd, const char *dest, const char *template, int force)
const char * iax2_getformatname(iax2_format format)
iax2 wrapper function for ast_getformatname
#define DEFAULT_THREAD_COUNT
static int acf_iaxvar_read(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
static void iax2_free_variable_datastore(void *)
static int iax2_poke_peer_s(const void *data)
static int addr_range_delme_cb(void *obj, void *arg, int flags)
static struct iax2_thread * find_idle_thread(void)
static struct ast_channel * iax2_request(const char *type, struct ast_format_cap *cap, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, const char *data, int *cause)
static void add_empty_calltoken_ie(struct chan_iax2_pvt *pvt, struct iax_ie_data *ied)
static void delete_users(void)
#define IAX_DELAYPBXSTART
static int cache_get_callno_locked(const char *data)
static void iax_outputframe(struct iax_frame *f, struct ast_iax2_full_hdr *fhi, int rx, struct ast_sockaddr *addr, int datalen)
static int unload_module(void)
static void remove_by_transfercallno(struct chan_iax2_pvt *pvt)
static struct chan_iax2_pvt * iaxs[IAX_MAX_CALLS]
an array of iax2 pvt structures
static int peer_set_sock_cb(void *obj, void *arg, int flags)
static void stop_stuff(int callno)
static char * handle_cli_iax2_show_users(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static int send_trunk(struct iax2_trunk_peer *tpeer, struct timeval *now)
static void log_jitterstats(unsigned short callno)
static struct iax2_peer * peer_ref(struct iax2_peer *peer)
static ast_callid iax_pvt_callid_get(int callno)
#define IAX_CAPABILITY_LOWBANDWIDTH
static void cleanup_thread_list(void *head)
static int manager_iax2_show_peer_list(struct mansession *s, const struct message *m)
callback to display iax peers in manager format
static int iax2_queue_frame(int callno, struct ast_frame *f)
Queue a frame to a call's owning asterisk channel.
static int authenticate_verify(struct chan_iax2_pvt *p, struct iax_ies *ies)
static int iax2_sendtext(struct ast_channel *c, const char *text)
static struct ast_sockaddr debugaddr
static int send_packet(struct iax_frame *f)
static char language[MAX_LANGUAGE]
static char accountcode[AST_MAX_ACCOUNT_CODE]
static void merge_encryption(struct chan_iax2_pvt *p, unsigned int enc)
static void memcpy_decrypt(unsigned char *dst, const unsigned char *src, int len, ast_aes_decrypt_key *dcx)
static char * handle_cli_iax2_unregister(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
#define IAX_ALLOWFWDOWNLOAD
#define IAX_CODEC_USER_FIRST
static int iax2_lock_callno_unless_destroyed(int callno)
Acquire the iaxsl[callno] if call exists and not having ongoing hangup.
static struct call_number_pool callno_pool_trunk
static uint16_t global_maxcallno
static void remove_by_peercallno(struct chan_iax2_pvt *pvt)
#define CALLTOKEN_HASH_FORMAT
static int start_network_thread(void)
static unsigned int calc_rxstamp(struct chan_iax2_pvt *p, unsigned int offset)
static int iax2_sched_replace(int id, struct ast_sched_context *con, int when, ast_sched_cb callback, const void *data)
static char mohsuggest[MAX_MUSICCLASS]
static int __find_callno(unsigned short callno, unsigned short dcallno, struct ast_sockaddr *addr, int new, int sockfd, int return_locked, int check_dcallno)
static void build_encryption_keys(const unsigned char *digest, struct chan_iax2_pvt *pvt)
static void build_callno_limits(struct ast_variable *v)
static void __attempt_transmit(const void *data)
static struct ast_cli_entry cli_iax2[]
static unsigned int iax2_datetime(const char *tz)
static int iax2_send(struct chan_iax2_pvt *pvt, struct ast_frame *f, unsigned int ts, int seqno, int now, int transfer, int final)
#define IAX_CODEC_NOPREFS
static int auto_hangup(const void *data)
static char * handle_cli_iax2_show_threads(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static void acl_change_stasis_cb(void *data, struct stasis_subscription *sub, struct stasis_message *message)
static char mohinterpret[MAX_MUSICCLASS]
static const struct ast_datastore_info iax2_variable_datastore_info
static void sched_delay_remove(struct ast_sockaddr *addr, callno_entry entry)
static int iax2_do_register_s(const void *data)
static int iax2_devicestate(const char *data)
Part of the device state notification system —.
static void peercnt_remove(struct peercnt *peercnt)
static int network_change_sched_id
static int expire_registry(const void *data)
static void iax2_frame_free(struct iax_frame *fr)
static void memcpy_encrypt(unsigned char *dst, const unsigned char *src, int len, ast_aes_encrypt_key *ecx)
static void requirecalltoken_mark_auto(const char *name, int subclass)
static int iaxmaxthreadcount
static int peercnt_cmp_cb(void *obj, void *arg, int flags)
static struct ao2_container * iax_peercallno_pvts
Another container of iax2_pvt structures.
static int send_command_locked(unsigned short callno, char, int, unsigned int, const unsigned char *, int, int)
static int make_trunk(unsigned short callno, int locked)
static int register_verify(int callno, struct ast_sockaddr *addr, struct iax_ies *ies)
Verify inbound registration.
static int global_max_trunk_mtu
static void iax2_dprequest(struct iax2_dpcache *dp, int callno)
struct ast_sockaddr bindaddr
static char version[AST_MAX_EXTENSION]
static const char config[]
static int transfer(void *data)
static int reload_config(void)
General Asterisk PBX channel definitions.
void ast_channel_exten_set(struct ast_channel *chan, const char *value)
const char * ast_channel_name(const struct ast_channel *chan)
#define ast_channel_alloc_with_endpoint(needqueue, state, cid_num, cid_name, acctcode, exten, context, assignedids, requestor, amaflag, endpoint,...)
void * ast_channel_tech_pvt(const struct ast_channel *chan)
int ast_channel_datastore_add(struct ast_channel *chan, struct ast_datastore *datastore)
Add a datastore to a channel.
void ast_hangup(struct ast_channel *chan)
Hang up a channel.
#define AST_BRIDGE_DTMF_CHANNEL_0
Report DTMF on channel 0.
#define ast_channel_alloc(needqueue, state, cid_num, cid_name, acctcode, exten, context, assignedids, requestor, amaflag,...)
Create a channel structure.
int ast_queue_hangup(struct ast_channel *chan)
Queue a hangup frame.
int ast_party_id_presentation(const struct ast_party_id *id)
Determine the overall presentation value for the given party.
#define DATASTORE_INHERIT_FOREVER
void ast_channel_nativeformats_set(struct ast_channel *chan, struct ast_format_cap *value)
void ast_party_connected_line_free(struct ast_party_connected_line *doomed)
Destroy the connected line information contents.
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...
#define ast_channel_lock(chan)
struct ast_format_cap * ast_channel_nativeformats(const struct ast_channel *chan)
struct ast_party_redirecting * ast_channel_redirecting(struct ast_channel *chan)
void ast_channel_unregister(const struct ast_channel_tech *tech)
Unregister a channel technology.
struct ast_flags * ast_channel_flags(struct ast_channel *chan)
#define ast_channel_ref(c)
Increase channel reference count.
struct ast_party_connected_line * ast_channel_connected(struct ast_channel *chan)
int ast_queue_frame(struct ast_channel *chan, struct ast_frame *f)
Queue one or more frames to a channel's frame queue.
const char * ast_channel_context(const struct ast_channel *chan)
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.
struct ast_frame * ast_read(struct ast_channel *chan)
Reads a frame.
#define AST_BRIDGE_DTMF_CHANNEL_1
Report DTMF on channel 1.
#define ast_channel_trylock(chan)
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.
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.
int ast_set_read_format(struct ast_channel *chan, struct ast_format *format)
Sets read format on channel chan.
void ast_channel_set_rawreadformat(struct ast_channel *chan, struct ast_format *format)
void ast_channel_tech_pvt_set(struct ast_channel *chan, void *value)
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.
int ast_check_hangup(struct ast_channel *chan)
Check to see if a channel is needing hang up.
int ast_channel_hangupcause(const struct ast_channel *chan)
void ast_channel_set_rawwriteformat(struct ast_channel *chan, struct ast_format *format)
struct ast_party_dialed * ast_channel_dialed(struct ast_channel *chan)
#define AST_MAX_ACCOUNT_CODE
struct ast_channel * ast_channel_release(struct ast_channel *chan)
Unlink and release reference to a channel.
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.
void ast_channel_hangupcause_hash_set(struct ast_channel *chan, const struct ast_control_pvt_cause_code *cause_code, int datalen)
Sets the HANGUPCAUSE hash and optionally the SIP_CAUSE hash on the given channel.
int ast_queue_unhold(struct ast_channel *chan)
Queue an unhold frame.
@ AST_BRIDGE_FAILED_NOWARN
int ast_queue_hold(struct ast_channel *chan, const char *musicclass)
Queue a hold frame.
void ast_channel_set_readformat(struct ast_channel *chan, struct ast_format *format)
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 ...
void ast_channel_softhangup_internal_flag_add(struct ast_channel *chan, int value)
#define ast_channel_unref(c)
Decrease channel reference count.
struct ast_format * ast_channel_writeformat(struct ast_channel *chan)
int ast_set_write_format(struct ast_channel *chan, struct ast_format *format)
Sets write format on channel chan.
void ast_party_connected_line_init(struct ast_party_connected_line *init)
Initialize the given connected line structure.
void ast_channel_amaflags_set(struct ast_channel *chan, enum ama_flags value)
const char * ast_channel_language(const struct ast_channel *chan)
void ast_channel_context_set(struct ast_channel *chan, const char *value)
@ AST_CHAN_TP_WANTSJITTER
Channels have this property if they can accept input with jitter; i.e. most VoIP channels.
enum ama_flags ast_channel_string2amaflag(const char *flag)
Convert a string to a detail record AMA flag.
struct ast_party_caller * ast_channel_caller(struct ast_channel *chan)
@ AST_FLAG_DISABLE_DEVSTATE_CACHE
void ast_channel_callid_set(struct ast_channel *chan, ast_callid value)
void ast_channel_hangupcause_set(struct ast_channel *chan, int value)
void ast_channel_adsicpe_set(struct ast_channel *chan, enum ast_channel_adsicpe value)
void ast_channel_tech_set(struct ast_channel *chan, const struct ast_channel_tech *value)
#define ast_channel_unlock(chan)
#define AST_MAX_EXTENSION
void ast_channel_set_writeformat(struct ast_channel *chan, struct ast_format *format)
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.
struct ast_format * ast_channel_readformat(struct ast_channel *chan)
ast_channel_state
ast_channel states
int ast_setstate(struct ast_channel *chan, enum ast_channel_state)
Change the state of a channel.
static struct ast_channel * callback(struct ast_channelstorage_instance *driver, ao2_callback_data_fn *cb_fn, void *arg, void *data, int ao2_flags)
const char * ast_var_name(const struct ast_var_t *var)
#define ast_var_assign(name, value)
const char * ast_var_value(const struct ast_var_t *var)
void ast_var_delete(struct ast_var_t *var)
Standard Command Line Interface.
#define AST_CLI_DEFINE(fn, txt,...)
void ast_cli(int fd, const char *fmt,...)
char * ast_cli_complete(const char *word, const char *const choices[], int pos)
#define ast_cli_register_multiple(e, len)
Register multiple commands.
unsigned int ast_codec_samples_count(struct ast_frame *frame)
Get the number of samples contained within a frame.
int iax2_codec_pref_string(struct iax2_codec_pref *pref, char *buf, size_t size)
Dump audio codec preference list into a string.
void iax2_codec_pref_prepend(struct iax2_codec_pref *pref, struct ast_format *format, unsigned int framing, int only_if_existing)
Prepend an audio codec to a preference list, removing it first if it was already there.
uint64_t iax2_codec_pref_order_value_to_format_bitfield(int order_value)
Convert an iax2_codec_pref order value into a format bitfield.
uint64_t iax2_codec_pref_from_bitfield(struct iax2_codec_pref *pref, uint64_t bitfield)
Create codec preference list from the given bitfield formats.
struct ast_format * iax2_codec_pref_index(struct iax2_codec_pref *pref, int idx, struct ast_format **result)
Codec located at a particular place in the preference index.
void iax2_codec_pref_convert(struct iax2_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.
void iax2_codec_pref_remove_missing(struct iax2_codec_pref *pref, uint64_t bitfield)
Removes format from the pref list that aren't in the bitfield.
void iax2_codec_pref_append(struct iax2_codec_pref *pref, struct ast_format *format, unsigned int framing)
Append a audio codec to a preference list, removing it first if it was already there.
int iax2_codec_pref_to_cap(struct iax2_codec_pref *pref, struct ast_format_cap *cap)
Convert a preference structure to a capabilities structure.
int iax2_codec_pref_best_bitfield2cap(uint64_t bitfield, struct iax2_codec_pref *prefs, struct ast_format_cap *cap)
Convert a bitfield to a format capabilities structure in the "best" order.
Media Format Bitfield Compatibility API.
Provide cryptographic signature routines.
int AST_OPTIONAL_API_NAME() 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.
int AST_OPTIONAL_API_NAME() ast_aes_set_encrypt_key(const unsigned char *key, ast_aes_encrypt_key *ctx)
Set an encryption key.
int AST_OPTIONAL_API_NAME() ast_sign(struct ast_key *key, char *msg, char *sig)
Sign a message signature using a given private key.
int AST_OPTIONAL_API_NAME() ast_aes_decrypt(const unsigned char *in, unsigned char *out, const ast_aes_decrypt_key *key)
AES decrypt data.
struct ast_key *AST_OPTIONAL_API_NAME() ast_key_get(const char *kname, int ktype)
Retrieve a key.
int AST_OPTIONAL_API_NAME() ast_aes_set_decrypt_key(const unsigned char *key, ast_aes_decrypt_key *ctx)
Set a decryption key.
int AST_OPTIONAL_API_NAME() ast_aes_encrypt(const unsigned char *in, unsigned char *out, const ast_aes_encrypt_key *key)
AES encrypt data.
#define ast_datastore_alloc(info, uid)
int ast_datastore_free(struct ast_datastore *datastore)
Free a data store object.
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.
Background DNS update manager.
void ast_dnsmgr_release(struct ast_dnsmgr_entry *entry)
Free a DNS manager entry.
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.
int ast_dnsmgr_changed(struct ast_dnsmgr_entry *entry)
Check is see if a dnsmgr entry has changed.
int ast_dnsmgr_refresh(struct ast_dnsmgr_entry *entry)
Force a refresh of a dnsmgr entry.
void ast_endpoint_set_state(struct ast_endpoint *endpoint, enum ast_endpoint_state state)
Updates the state of the given endpoint.
void ast_endpoint_shutdown(struct ast_endpoint *endpoint)
Shutsdown an ast_endpoint.
struct ast_endpoint * ast_endpoint_create(const char *tech, const char *resource)
Create an endpoint struct.
Call Parking and Pickup API Includes code and algorithms from the Zapata library.
int iax_firmware_get_version(const char *dev, uint16_t *version)
void iax_firmware_reload(void)
void iax_firmware_unload(void)
int iax_firmware_append(struct iax_ie_data *ied, const char *dev, unsigned int desc)
void iax_firmware_traverse(const char *filter, int(*callback)(struct ast_iax2_firmware_header *header, void *data), void *data)
IAX Firmware Support header file.
static int exists(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
static int md5(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
static int len(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)
void astman_send_listack(struct mansession *s, const struct message *m, char *msg, char *listflag)
Send ack in manager transaction to begin a list.
void astman_send_list_complete_start(struct mansession *s, const struct message *m, const char *event_name, int count)
Start the list complete event.
const char * astman_get_header(const struct message *m, char *var)
Get header from manager transaction.
void astman_send_list_complete_end(struct mansession *s)
End the list complete event.
void astman_append(struct mansession *s, const char *fmt,...)
int ast_manager_unregister(const char *action)
Unregister a registered manager command.
void ast_endpoint_blob_publish(struct ast_endpoint *endpoint, struct stasis_message_type *type, struct ast_json *blob)
Creates and publishes a ast_endpoint_blob message.
void ast_channel_stage_snapshot_done(struct ast_channel *chan)
Clear flag to indicate channel snapshot is being staged, and publish snapshot.
struct stasis_message_type * ast_endpoint_state_type(void)
Message type for endpoint state changes.
void ast_channel_stage_snapshot(struct ast_channel *chan)
Set flag to indicate channel snapshot is being staged.
static int iax2_prov_app(struct ast_channel *chan, const char *data)
Implementation of Inter-Asterisk eXchange, version 2 parser.c parser.h chan_iax2.c.
#define IAX_LINGER_TIMEOUT
#define IAX_DPSTATUS_CANEXIST
#define IAX_MAX_OSPBLOCK_SIZE
#define IAX_IE_CALLINGANI2
#define IAX_IE_CALLING_NUMBER
#define IAX_IE_TRANSFERID
#define IAX_IE_CALLING_ANI
#define IAX_DEFAULT_PORTNO
#define IAX_IE_CALLINGTNS
#define IAX_IE_RSA_RESULT
#define IAX_META_TRUNK_SUPERMINI
#define IAX_IE_IAX_UNKNOWN
#define IAX_DPSTATUS_NONEXISTENT
#define IAX_DPSTATUS_IGNOREPAT
#define IAX_IE_CAPABILITY2
#define IAX_IE_CALLING_NAME
#define IAX_DEFAULT_REG_EXPIRE
#define IAX_MAX_OSPTOKEN_SIZE
#define IAX_IE_RR_DROPPED
#define IAX_IE_ENCRYPTION
#define IAX_ENCRYPT_AES128
#define IAX_MAX_OSPBUFF_SIZE
#define IAX_IE_FIRMWAREVER
#define IAX_IE_CODEC_PREFS
#define IAX_IE_CALLED_NUMBER
#define IAX_IE_CAPABILITY
#define IAX_DPSTATUS_MATCHMORE
#define IAX_IE_PROVISIONING
#define IAX_IE_MD5_RESULT
#define IAX_PROTO_VERSION
#define IAX_IE_AUTOANSWER
#define IAX_ENCRYPT_KEYROTATE
#define IAX_IE_APPARENT_ADDR
#define IAX_AUTH_PLAINTEXT
#define IAX_MAX_OSPBLOCK_NUM
#define IAX_META_TRUNK_MINI
#define IAX_IE_CALLINGPRES
#define IAX_IE_AUTHMETHODS
#define IAX_IE_CALLED_CONTEXT
#define IAX_IE_CALLINGTON
#define IAX_DPSTATUS_EXISTS
Application convenience functions, designed to give consistent look and feel to Asterisk apps.
int ast_app_inboxcount(const char *mailboxes, int *newmsgs, int *oldmsgs)
Determine number of new/old messages in a mailbox.
Configuration File Parser.
#define ast_config_load(filename, flags)
Load a config file.
char * ast_category_browse(struct ast_config *config, const char *prev_name)
Browse categories.
int ast_realtime_require_field(const char *family,...) attribute_sentinel
Inform realtime what fields that may be stored.
#define ast_variable_new(name, value, filename)
int ast_unload_realtime(const char *family)
Release any resources cached for a realtime family.
#define CONFIG_STATUS_FILEUNCHANGED
#define CONFIG_STATUS_FILEINVALID
int ast_parse_arg(const char *arg, enum ast_parse_flags flags, void *p_result,...)
The argument parsing routine.
void ast_config_destroy(struct ast_config *cfg)
Destroys a config.
@ CONFIG_FLAG_FILEUNCHANGED
int ast_variable_list_replace(struct ast_variable **head, struct ast_variable *replacement)
Replace a variable in the given list with a new value.
const char * ast_variable_retrieve(struct ast_config *config, const char *category, const char *variable)
int ast_update_realtime(const char *family, const char *keyfield, const char *lookup,...) attribute_sentinel
Update realtime configuration.
struct ast_variable * ast_load_realtime(const char *family,...) attribute_sentinel
void ast_variables_destroy(struct ast_variable *var)
Free variable list.
struct ast_variable * ast_variable_browse(const struct ast_config *config, const char *category_name)
Asterisk internal frame definitions.
#define ast_frame_byteswap_be(fr)
#define AST_OPTION_RELAXDTMF
#define AST_OPTION_TONE_VERIFY
@ AST_FRFLAG_HAS_TIMING_INFO
#define AST_OPTION_RXGAIN
#define AST_OPTION_DIGIT_DETECT
#define AST_OPTION_OPRMODE
#define AST_OPTION_SECURE_MEDIA
#define AST_OPTION_FLAG_REQUEST
#define AST_OPTION_FAX_DETECT
#define AST_OPTION_TXGAIN
#define AST_FRIENDLY_OFFSET
Offset into a frame's data buffer.
#define AST_OPTION_SECURE_SIGNALING
ast_control_frame_type
Internal control frame subtype field values.
@ AST_CONTROL_RECORD_CANCEL
@ AST_CONTROL_STREAM_TOPOLOGY_SOURCE_CHANGED
@ AST_CONTROL_STREAM_RESTART
@ AST_CONTROL_STREAM_SUSPEND
@ AST_CONTROL_RADIO_UNKEY
@ AST_CONTROL_STREAM_TOPOLOGY_REQUEST_CHANGE
@ AST_CONTROL_STREAM_REVERSE
@ AST_CONTROL_REDIRECTING
@ AST_CONTROL_TAKEOFFHOOK
@ AST_CONTROL_T38_PARAMETERS
@ AST_CONTROL_READ_ACTION
@ AST_CONTROL_RECORD_STOP
@ AST_CONTROL_PLAYBACK_BEGIN
@ AST_CONTROL_RECORD_MUTE
@ AST_CONTROL_STREAM_STOP
@ AST_CONTROL_STREAM_TOPOLOGY_CHANGED
@ AST_CONTROL_CONNECTED_LINE
@ AST_CONTROL_STREAM_FORWARD
@ AST_CONTROL_RECORD_SUSPEND
@ AST_CONTROL_MASQUERADE_NOTIFY
@ AST_CONTROL_PVT_CAUSE_CODE
@ AST_CONTROL_UPDATE_RTP_PEER
#define AST_OPTION_AUDIO_MODE
struct ast_frame ast_null_frame
void ast_callid_strnprint(char *buffer, size_t buffer_size, ast_callid callid)
copy a string representation of the callid into a target string
#define ast_debug(level,...)
Log a DEBUG message.
ast_callid ast_read_threadstorage_callid(void)
extracts the callid from the thread
int ast_callid_threadassoc_add(ast_callid callid)
Adds a known callid to thread storage of the calling thread.
#define AST_CALLID_BUFFER_LENGTH
ast_callid ast_create_callid(void)
factory function to create a new uniquely identifying callid.
int ast_callid_threadassoc_remove(void)
Removes callid from thread storage of the calling thread.
#define ast_verb(level,...)
I/O Management (derived from Cheops-NG)
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...
int * ast_io_add(struct io_context *ioc, int fd, ast_io_cb callback, short events, void *data)
Adds an IO context.
void io_context_destroy(struct io_context *ioc)
Destroys a context.
int ast_io_wait(struct io_context *ioc, int howlong)
Waits for IO.
jitterbuf: an application-independent jitterbuffer jitterbuf.c
void jb_destroy(jitterbuf *jb)
destroy jitterbuf
void jb_reset(jitterbuf *jb)
reset jitterbuf
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!...
jitterbuf * jb_new(void)
new jitterbuf
void jb_setoutput(jb_output_function_t err, jb_output_function_t warn, jb_output_function_t dbg)
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
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...
enum jb_return_code jb_setconf(jitterbuf *jb, jb_conf *conf)
set jitterbuf conf
enum jb_return_code jb_getall(jitterbuf *jb, jb_frame *frameout)
unconditionally get frames from jitterbuf until empty
enum jb_return_code jb_getinfo(jitterbuf *jb, jb_info *stats)
get jitterbuf info: only "statistics" may be valid
void ast_json_unref(struct ast_json *value)
Decrease refcount on value. If refcount reaches zero, value is freed.
struct ast_json * ast_json_pack(char const *format,...)
Helper for creating complex JSON values.
AST_JSON_INT_T ast_json_int_t
Primarily used to cast when packing to an "I" type.
A set of macros to manage forward-linked lists.
#define AST_LIST_HEAD_INIT_NOLOCK(head)
Initializes a list head structure.
#define AST_LIST_HEAD_STATIC(name, type)
Defines a structure to be used to hold a list of specified type, statically initialized.
#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_LIST_LAST(head)
Returns the last entry contained in a list.
#define AST_LIST_TRAVERSE(head, var, field)
Loops over (traverses) the entries in a list.
#define AST_LIST_HEAD_DESTROY(head)
Destroys a list head structure.
#define AST_LIST_INSERT_TAIL(head, elm, field)
Appends a list entry to the tail of a list.
#define AST_LIST_ENTRY(type)
Declare a forward link structure inside a list entry.
#define AST_LIST_HEAD_INIT(head)
Initializes a list head structure.
#define AST_LIST_TRAVERSE_SAFE_END
Closes a safe loop traversal block.
#define AST_LIST_INSERT_BEFORE_CURRENT(elm, field)
Inserts a list entry before the current entry during a traversal.
#define AST_LIST_LOCK(head)
Locks a list.
#define AST_LIST_INSERT_HEAD(head, elm, field)
Inserts a list entry at the head of a list.
#define AST_LIST_REMOVE(head, elm, field)
Removes a specific entry from a list.
#define AST_LIST_TRAVERSE_SAFE_BEGIN(head, var, field)
Loops safely over (traverses) the entries in a list.
#define AST_LIST_REMOVE_CURRENT(field)
Removes the current entry from a list during a traversal.
#define AST_LIST_REMOVE_HEAD(head, field)
Removes and returns the head entry from a list.
#define AST_LIST_UNLOCK(head)
Attempts to unlock a list.
#define AST_LIST_HEAD(name, type)
Defines a structure to be used to hold a list of specified type.
Custom localtime functions for multiple timezones.
struct ast_tm * ast_localtime(const struct timeval *timep, struct ast_tm *p_tm, const char *zone)
Timezone-independent version of localtime_r(3).
Asterisk locking-related definitions:
#define ast_cond_destroy(cond)
#define ast_cond_wait(cond, mutex)
#define AST_PTHREADT_NULL
#define ast_cond_init(cond, attr)
#define ast_cond_timedwait(cond, mutex, time)
#define ast_mutex_init(pmutex)
#define DEADLOCK_AVOIDANCE(lock)
#define ast_mutex_unlock(a)
int ast_atomic_fetchadd_int(volatile int *p, int v)
Atomically add v to *p and return the previous value of *p.
#define ast_mutex_trylock(a)
pthread_cond_t ast_cond_t
#define ast_mutex_destroy(a)
#define ast_mutex_lock(a)
#define AST_MUTEX_DEFINE_STATIC(mutex)
int ast_atomic_dec_and_test(volatile int *p)
decrement *p by 1 and return true if the variable has reached 0.
#define ast_cond_signal(cond)
static char hostname[MAXHOSTNAMELEN]
The AMI - Asterisk Manager Interface - is a TCP protocol created to manage Asterisk with third-party ...
#define EVENT_FLAG_REPORTING
#define EVENT_FLAG_SYSTEM
#define ast_manager_register_xml(action, authority, func)
Register a manager callback using XML documentation to describe the manager.
void MD5Update(struct MD5Context *context, unsigned char const *buf, unsigned len)
void MD5Init(struct MD5Context *context)
void MD5Final(unsigned char digest[MD5_DIGEST_LENGTH], struct MD5Context *context)
Asterisk module definitions.
#define ast_module_unref(mod)
Release a reference to the module.
#define ast_module_ref(mod)
Hold a reference to the module.
#define AST_MODULE_INFO(keystr, flags_to_set, desc, fields...)
@ AST_MODPRI_CHANNEL_DRIVER
@ AST_MODULE_SUPPORT_CORE
#define ASTERISK_GPL_KEY
The text the key() function should return.
int ast_unregister_application(const char *app)
Unregister an application.
@ AST_MODULE_LOAD_SUCCESS
@ AST_MODULE_LOAD_DECLINE
Module has failed to load, may be in an inconsistent state.
#define ast_register_application_xml(app, execute)
Register an application using XML documentation.
int ast_moh_start(struct ast_channel *chan, const char *mclass, const char *interpclass)
Turn on music on hold on a given channel.
void ast_moh_stop(struct ast_channel *chan)
Turn off music on hold on a given channel.
struct stasis_message_type * ast_mwi_state_type(void)
Get the Stasis Message Bus API message type for MWI messages.
void * ast_mwi_unsubscribe(struct ast_mwi_subscriber *sub)
Unsubscribe from the stasis topic and MWI.
struct stasis_cache * ast_mwi_state_cache(void)
Backend cache for ast_mwi_topic_cached().
struct ast_mwi_subscriber * ast_mwi_subscribe_pool(const char *mailbox, stasis_subscription_cb callback, void *data)
Add an MWI state subscriber, and stasis subscription to the mailbox.
static char * ast_sockaddr_stringify(const struct ast_sockaddr *addr)
Wrapper around ast_sockaddr_stringify_fmt() with default format.
#define ast_sockaddr_port(addr)
Get the port number of a socket address.
static void ast_sockaddr_copy(struct ast_sockaddr *dst, const struct ast_sockaddr *src)
Copies the data from one ast_sockaddr to another.
int ast_sockaddr_is_ipv6(const struct ast_sockaddr *addr)
Determine if this is an IPv6 address.
int ast_bind(int sockfd, const struct ast_sockaddr *addr)
Wrapper around bind(2) that uses struct ast_sockaddr.
int ast_sockaddr_apply_netmask(const struct ast_sockaddr *addr, const struct ast_sockaddr *netmask, struct ast_sockaddr *result)
Apply a netmask to an address and store the result in a separate structure.
int ast_sockaddr_cmp_addr(const struct ast_sockaddr *a, const struct ast_sockaddr *b)
Compares the addresses of two ast_sockaddr structures.
ssize_t ast_sendto(int sockfd, const void *buf, size_t len, int flags, const struct ast_sockaddr *dest_addr)
Wrapper around sendto(2) that uses ast_sockaddr.
int ast_sockaddr_split_hostport(char *str, char **host, char **port, int flags)
Splits a string into its host and port components.
int ast_sockaddr_resolve(struct ast_sockaddr **addrs, const char *str, int flags, int family)
Parses a string with an IPv4 or IPv6 address and place results into an array.
int ast_sockaddr_parse(struct ast_sockaddr *addr, const char *str, int flags)
Parse an IPv4 or IPv6 address string.
static int ast_sockaddr_isnull(const struct ast_sockaddr *addr)
Checks if the ast_sockaddr is null. "null" in this sense essentially means uninitialized,...
ssize_t ast_recvfrom(int sockfd, void *buf, size_t len, int flags, struct ast_sockaddr *src_addr)
Wrapper around recvfrom(2) that uses struct ast_sockaddr.
int ast_sockaddr_cmp(const struct ast_sockaddr *a, const struct ast_sockaddr *b)
Compares two ast_sockaddr structures.
static char * ast_sockaddr_stringify_port(const struct ast_sockaddr *addr)
Wrapper around ast_sockaddr_stringify_fmt() to return a port only.
#define ast_sockaddr_set_port(addr, port)
Sets the port number of a socket address.
static char * ast_sockaddr_stringify_addr(const struct ast_sockaddr *addr)
Wrapper around ast_sockaddr_stringify_fmt() to return an address only.
static void ast_sockaddr_setnull(struct ast_sockaddr *addr)
Sets address addr to null.
int ast_sockaddr_is_ipv4_mapped(const struct ast_sockaddr *addr)
Determine if this is an IPv4-mapped IPv6 address.
int ast_sockaddr_hash(const struct ast_sockaddr *addr)
Computes a hash value from the address. The port is ignored.
int ast_netsock_release(struct ast_netsock_list *list)
struct ast_netsock_list * ast_netsock_list_alloc(void)
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)
void ast_netsock_unref(struct ast_netsock *ns)
int ast_netsock_sockfd(const struct ast_netsock *ns)
struct ast_netsock * ast_netsock_find(struct ast_netsock_list *list, struct ast_sockaddr *addr)
int ast_netsock_init(struct ast_netsock_list *list)
struct ast_netsock * ast_netsock_bindaddr(struct ast_netsock_list *list, struct io_context *ioc, struct ast_sockaddr *bindaddr, int tos, int cos, ast_io_cb callback, void *data)
const char * ast_inet_ntoa(struct in_addr ia)
thread-safe replacement for inet_ntoa().
Implementation of the IAX2 protocol.
int iax_parse_ies(struct iax_ies *ies, unsigned char *data, int datalen)
int iax_get_iframes(void)
#define DIRECTION_OUTGRESS
int iax_ie_append_addr(struct iax_ie_data *ied, unsigned char ie, const struct ast_sockaddr *addr)
void iax_frame_subclass2str(enum iax_frame_subclass subclass, char *str, size_t len)
int iax_ie_append_byte(struct iax_ie_data *ied, unsigned char ie, unsigned char dat)
void iax_frame_free(struct iax_frame *fr)
int iax_ie_append(struct iax_ie_data *ied, unsigned char ie)
int iax_ie_append_versioned_uint64(struct iax_ie_data *ied, unsigned char ie, unsigned char version, uint64_t value)
struct iax_frame * iax_frame_new(int direction, int datalen, unsigned int cacheable)
int iax_ie_append_raw(struct iax_ie_data *ied, unsigned char ie, const void *data, int datalen)
int iax_ie_append_int(struct iax_ie_data *ied, unsigned char ie, unsigned int value)
void iax_set_output(void(*output)(const char *data))
int iax_get_oframes(void)
#define DIRECTION_INGRESS
void iax_frame_wrap(struct iax_frame *fr, struct ast_frame *f)
int iax_ie_append_short(struct iax_ie_data *ied, unsigned char ie, unsigned short value)
void iax_showframe(struct iax_frame *f, struct ast_iax2_full_hdr *fhi, int rx, struct ast_sockaddr *addr, int datalen)
int iax_ie_append_str(struct iax_ie_data *ied, unsigned char ie, const char *str)
void iax_set_error(void(*output)(const char *data))
Asterisk file paths, configured in asterisk.conf.
const char * ast_config_AST_SYSTEM_NAME
Core PBX routines and definitions.
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.
int ast_context_destroy_by_name(const char *context, const char *registrar)
Destroy a context by name.
void ast_unregister_switch(struct ast_switch *sw)
Unregister an alternative switch.
int ast_register_switch(struct ast_switch *sw)
Register an alternative dialplan switch.
const char * pbx_builtin_getvar_helper(struct ast_channel *chan, const char *name)
Return a pointer to the value of the corresponding channel variable.
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_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.
int pbx_exec(struct ast_channel *c, struct ast_app *app, const char *data)
Execute an application.
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.
int ast_context_remove_extension(const char *context, const char *extension, int priority, const char *registrar)
Simply remove extension from context.
#define ast_custom_function_register(acf)
Register a custom function.
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.
int ast_custom_function_unregister(struct ast_custom_function *acf)
Unregister a custom function.
enum ast_pbx_result ast_pbx_start(struct ast_channel *c)
Create a new thread and start the PBX.
int ast_ignore_pattern(const char *context, const char *pattern)
Checks to see if a number should be ignored.
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)
struct ast_app * pbx_findapp(const char *app)
Look up an application.
static int matchmore(struct ast_channel *chan, const char *context, const char *exten, int priority, const char *callerid, const char *data)
#define ast_poll(a, b, c)
IAX2 Provisioning protocol.
int iax_provision_reload(int reload)
int iax_provision_build(struct iax_ie_data *provdata, unsigned int *signature, const char *template, int force)
int iax_provision_unload(void)
char * iax_prov_complete_template(const char *line, const char *word, int pos, int state)
int iax_provision_version(unsigned int *signature, const char *template, int force)
static struct stasis_subscription * sub
Statsd channel stats. Exmaple of how to subscribe to Stasis events.
static struct @487 methods[]
static void challenge(const char *endpoint_id, struct ast_sip_auth *auth, pjsip_tx_data *tdata, const pjsip_rx_data *rdata, int is_stale, const pjsip_auth_algorithm *algorithm)
Send a WWW-Authenticate challenge.
static void cleanup(void)
Clean up any old apps that we don't need any more.
Scheduler Routines (derived from cheops)
#define AST_SCHED_DEL(sched, id)
Remove a scheduler entry.
void ast_sched_clean_by_callback(struct ast_sched_context *con, ast_sched_cb match, ast_sched_cb cleanup_cb)
Clean all scheduled events with matching callback.
int ast_sched_replace(int old_id, struct ast_sched_context *con, int when, ast_sched_cb callback, const void *data) attribute_warn_unused_result
replace a scheduler entry
int ast_sched_add(struct ast_sched_context *con, int when, ast_sched_cb callback, const void *data) attribute_warn_unused_result
Adds a scheduled event.
void ast_sched_context_destroy(struct ast_sched_context *c)
destroys a schedule context
int ast_sched_start_thread(struct ast_sched_context *con)
Start a thread for processing scheduler entries.
int(* ast_sched_cb)(const void *data)
scheduler callback
struct ast_sched_context * ast_sched_context_create(void)
Create a scheduler context.
Security Event Reporting API.
struct stasis_topic * ast_security_topic(void)
A stasis_topic which publishes messages for security related issues.
Stasis Message Bus API. See Stasis Message Bus API for detailed documentation.
@ STASIS_SUBSCRIPTION_FILTER_SELECTIVE
int stasis_subscription_accept_message_type(struct stasis_subscription *subscription, const struct stasis_message_type *type)
Indicate to a subscription that we are interested in a message type.
int stasis_subscription_set_filter(struct stasis_subscription *subscription, enum stasis_subscription_message_filter filter)
Set the message type filtering level on a subscription.
void stasis_subscription_cb_noop(void *data, struct stasis_subscription *sub, struct stasis_message *message)
Stasis subscription callback function that does nothing.
void * stasis_message_data(const struct stasis_message *msg)
Get the data contained in a message.
struct stasis_subscription * stasis_unsubscribe_and_join(struct stasis_subscription *subscription)
Cancel a subscription, blocking until the last message is processed.
struct stasis_message * stasis_cache_get(struct stasis_cache *cache, struct stasis_message_type *type, const char *id)
Retrieve an item from the cache for the ast_eid_default entity.
#define stasis_subscribe(topic, callback, data)
void ast_system_publish_registry(const char *channeltype, const char *username, const char *domain, const char *status, const char *cause)
Publish a channel driver outgoing registration message.
struct stasis_topic * ast_system_topic(void)
A Stasis Message Bus API topic which publishes messages regarding system changes.
struct stasis_message_type * ast_network_change_type(void)
A stasis_message_type for network changes.
#define AST_DECLARE_STRING_FIELDS(field_list)
Declare the fields needed in a structure.
#define AST_STRING_FIELD(name)
Declare a string field.
#define ast_string_field_set(x, field, data)
Set a field to a simple string value.
#define ast_string_field_init(x, size)
Initialize a field pool and fields.
#define ast_string_field_build(x, field, fmt, args...)
Set a field to a complex (built) value.
#define ast_string_field_free_memory(x)
free all memory - to be called before destroying the object
int ast_str_append(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Append to a thread local dynamic string.
size_t attribute_pure ast_str_strlen(const struct ast_str *buf)
Returns the current length of the string stored within buf.
#define S_OR(a, b)
returns the equivalent of logic or for strings: first one if not empty, otherwise second one.
static force_inline int attribute_pure ast_str_hash(const char *str)
Compute a hash value on a string.
int attribute_pure ast_true(const char *val)
Make sure something is true. Determine if a string containing a boolean value is "true"....
#define S_COR(a, b, c)
returns the equivalent of logic or for strings, with an additional boolean check: second one if not e...
int ast_get_time_t(const char *src, time_t *dst, time_t _default, int *consumed)
Parse a time (integer) string.
static force_inline int attribute_pure ast_strlen_zero(const char *s)
int attribute_pure ast_false(const char *val)
Make sure something is false. Determine if a string containing a boolean value is "false"....
#define ast_str_alloca(init_len)
char * ast_strip_quoted(char *s, const char *beg_quotes, const char *end_quotes)
Strip leading/trailing whitespace and quotes from a string.
int ast_str_set(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Set a dynamic string using variable arguments.
char *attribute_pure ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
unsigned char raw[AST_CRYPTO_AES_BLOCKSIZE/8]
When we need to walk through a container, we use an ao2_iterator to keep track of the current positio...
Wrapper for an ast_acl linked list.
ast_app: A registered application
Structure to pass both assignedid values to channel drivers.
Structure to describe a channel "technology", ie a channel driver See for examples:
struct ast_format_cap * capabilities
Main Channel structure associated with a channel.
char context[AST_MAX_CONTEXT]
descriptor for a cli entry.
int args
This gets set in ast_cli_register()
char chan_name[AST_CHANNEL_NAME]
Data structure associated with a custom dialplan function.
Structure for a data store type.
Structure for a data store object.
Structure used to handle a large number of boolean flags == used only in app_dial?
Structure used to handle boolean flags.
unsigned int frame_ending
struct ast_format * format
Data structure associated with a single frame of data.
struct ast_frame_subclass subclass
enum ast_frame_type frametype
union ast_frame::@239 data
internal representation of ACL entries In principle user applications would have no need for this,...
struct ast_sockaddr netmask
Abstract JSON element (object, array, string, int, ...).
Structure for mutex and tracking information.
The structure that contains MWI state.
struct ast_party_id id
Caller party ID.
int ani2
Automatic Number Identification 2 (Info Digits)
struct ast_party_id ani
Automatic Number Identification (ANI)
Connected Line/Party information.
struct ast_party_id id
Connected party ID.
char * str
Subscriber phone number (Malloced)
struct ast_party_dialed::@221 number
Dialed/Called number.
int transit_network_select
Transit Network Select.
struct ast_party_name name
Subscriber name.
struct ast_party_number number
Subscriber phone number.
int presentation
Q.931 encoded presentation-indicator encoded field.
unsigned char valid
TRUE if the name information is valid/present.
char * str
Subscriber name (Malloced)
int presentation
Q.931 presentation-indicator and screening-indicator encoded fields.
unsigned char valid
TRUE if the number information is valid/present.
char * str
Subscriber phone number (Malloced)
int plan
Q.931 Type-Of-Number and Numbering-Plan encoded fields.
struct ast_party_id from
Who is redirecting the call (Sent to the party the call is redirected toward)
Socket address structure.
struct sockaddr_storage ss
Support for dynamic strings.
A ast_taskprocessor structure is a singleton by name.
struct ast_var_t::@224 entries
Structure for variables, used for configurations and for channel variables.
struct ast_variable * next
callno_entry numbers[IAX_MAX_CALLS/2+1]
unsigned char semirand[32]
const ast_string_field mohinterpret
struct ast_variable * vars
const ast_string_field language
const ast_string_field cid_num
struct chan_iax2_pvt::signaling_queue signaling_queue
const ast_string_field inkeys
const ast_string_field outkey
const ast_string_field dproot
const ast_string_field mohsuggest
unsigned short bridgecallno
const ast_string_field accountcode
const ast_string_field username
iax2_format peercapability
struct ast_variable * iaxvars
struct ast_sockaddr transfer
const ast_string_field context
unsigned short peercallno
struct iax2_codec_pref prefs
unsigned char calltoken_ie_len
const ast_string_field parkinglot
const ast_string_field host
callno_entry callno_entry
unsigned short transfercallno
struct ast_channel * owner
const ast_string_field rdnis
const ast_string_field challenge
const ast_string_field exten
const ast_string_field ani
struct iax2_codec_pref rprefs
struct iax2_registry * reg
ast_aes_decrypt_key mydcx
const ast_string_field cid_name
enum iax_transfer_state transferring
const ast_string_field secret
struct chan_iax2_pvt::@128 dpentries
const ast_string_field dnid
const ast_string_field osptoken
struct iax2_peer * peerpoke
const ast_string_field peer
struct iax2_codec_pref prefs
char context[AST_MAX_CONTEXT]
char peercontext[AST_MAX_CONTEXT]
char mohsuggest[MAX_MUSICCLASS]
char mohinterpret[MAX_MUSICCLASS]
char context[AST_MAX_EXTENSION]
char callednum[AST_MAX_EXTENSION]
char order[IAX2_CODEC_PREF_SIZE]
char context[AST_MAX_CONTEXT]
struct iax2_context * next
struct iax2_dpcache::@130 cache_list
char exten[AST_MAX_EXTENSION]
struct iax2_dpcache::@131 peer_list
char peercontext[AST_MAX_CONTEXT]
const ast_string_field peercontext
const ast_string_field mohinterpret
struct ast_dnsmgr_entry * dnsmgr
const ast_string_field cid_num
const ast_string_field inkeys
const ast_string_field outkey
struct ast_mwi_subscriber * mwi_event_sub
enum calltoken_peer_enum calltoken_required
const ast_string_field regexten
const ast_string_field mohsuggest
const ast_string_field username
const ast_string_field zonetag
struct ast_sockaddr defaddr
const ast_string_field description
const ast_string_field context
struct iax2_codec_pref prefs
const ast_string_field parkinglot
const ast_string_field dbsecret
struct ast_endpoint * endpoint
struct ast_acl_list * acl
const ast_string_field name
const ast_string_field cid_name
const ast_string_field secret
const ast_string_field mailbox
struct iax2_pkt_buf::@132 entry
struct ast_dnsmgr_entry * dnsmgr
enum iax_reg_state regstate
struct iax2_registry::@127 entry
unsigned char readbuf[4096]
struct iax2_thread::@133 list
struct iax2_thread::@134 ffinfo
struct ast_sockaddr ioaddr
struct iax2_thread::@135 full_frames
enum iax2_thread_iostate iostate
enum iax2_thread_type type
void(* schedfunc)(const void *)
struct timeval lasttxtime
struct timeval rxtrunktime
unsigned int trunkdataalloc
struct iax2_trunk_peer::@126 list
unsigned int trunkdatalen
unsigned char * trunkdata
struct timeval txtrunktime
const ast_string_field mohinterpret
struct ast_variable * vars
const ast_string_field language
const ast_string_field cid_num
const ast_string_field inkeys
struct iax2_context * contexts
enum calltoken_peer_enum calltoken_required
const ast_string_field mohsuggest
const ast_string_field accountcode
struct iax2_codec_pref prefs
const ast_string_field parkinglot
const ast_string_field dbsecret
struct ast_acl_list * acl
const ast_string_field name
const ast_string_field cid_name
const ast_string_field secret
unsigned char semirand[32]
struct iax_frame::@148 list
ast_aes_decrypt_key mydcx
struct ast_sockaddr apparent_addr
unsigned char * calltokendata
struct ast_variable * vars
unsigned char iax_unknown
unsigned int ospblocklength[IAX_MAX_OSPBLOCK_NUM]
char * osptokenblock[IAX_MAX_OSPBLOCK_NUM]
Global IO variables are now in a struct in order to be made threadsafe.
In case you didn't read that giant block of text above the mansession_session struct,...
struct signaling_queue_entry * next
structure to hold users read from phoneprov_users.conf
list of users found in the config file
An API for managing task processing threads that can be shared across modules.
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.
void * ast_taskprocessor_unreference(struct ast_taskprocessor *tps)
Unreference the specified taskprocessor and its reference count will decrement.
@ TPS_REF_DEFAULT
return a reference to a taskprocessor, create one if it does not exist
int ast_taskprocessor_push(struct ast_taskprocessor *tps, int(*task_exe)(void *datap), void *datap) attribute_warn_unused_result
Push a task into the specified taskprocessor queue and signal the taskprocessor thread.
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 ...
int ast_tvzero(const struct timeval t)
Returns true if the argument is 0,0.
int ast_tvcmp(struct timeval _a, struct timeval _b)
Compress two struct timeval instances returning -1, 0, 1 if the first arg is smaller,...
struct timeval ast_tvadd(struct timeval a, struct timeval b)
Returns the sum of two timevals a + b.
struct timeval ast_tvsub(struct timeval a, struct timeval b)
Returns the difference of two timevals a - b.
int64_t ast_tvdiff_ms(struct timeval end, struct timeval start)
Computes the difference (in milliseconds) between two struct timeval instances.
struct timeval ast_tvnow(void)
Returns current timeval. Meant to replace calls to gettimeofday().
struct timeval ast_tv(ast_time_t sec, ast_suseconds_t usec)
Returns a timeval from sec, usec.
Timing source management.
void ast_timer_close(struct ast_timer *handle)
Close an opened timing handle.
int ast_timer_ack(const struct ast_timer *handle, unsigned int quantity)
Acknowledge a timer event.
int ast_timer_set_rate(const struct ast_timer *handle, unsigned int rate)
Set the timing tick rate.
struct ast_timer * ast_timer_open(void)
Open a timer.
int ast_timer_fd(const struct ast_timer *handle)
Get a poll()-able file descriptor for a timer.
Support for translation of data formats. translate.c.
int ast_translator_best_choice(struct ast_format_cap *dst_cap, struct ast_format_cap *src_cap, struct ast_format **dst_fmt_out, struct ast_format **src_fmt_out)
Chooses the best translation path.
int error(const char *format,...)
#define ast_test_flag(p, flag)
#define RAII_VAR(vartype, varname, initval, dtor)
Declare a variable that will call a destructor function when it goes out of scope.
#define ast_set2_flag64(p, value, flag)
#define ast_test_flag64(p, flag)
#define ast_set_flags_to64(p, flag, value)
#define ast_clear_flag64(p, flag)
#define ast_pthread_create_background(a, b, c, d)
#define ast_assert_return(a,...)
#define ast_clear_flag(p, flag)
long int ast_random(void)
#define ast_pthread_create_detached(a, b, c, d)
#define ast_copy_flags64(dest, src, flagz)
#define ast_set_flag64(p, flag)
#define ast_set_flag(p, flag)
void ast_sha1_hash(char *output, const char *input)
Produces SHA1 hash based on input string.