Asterisk - The Open Source Telephony Project  GIT-master-a24979a
Data Structures | Macros | Typedefs | Enumerations | Functions | Variables
chan_iax2.c File Reference

Implementation of Inter-Asterisk eXchange Version 2 as specified in RFC 5456. More...

#include "asterisk.h"
#include <sys/mman.h>
#include <dirent.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netinet/in_systm.h>
#include <netinet/ip.h>
#include <sys/time.h>
#include <signal.h>
#include <netdb.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <regex.h>
#include "asterisk/paths.h"
#include "asterisk/lock.h"
#include "asterisk/frame.h"
#include "asterisk/channel.h"
#include "asterisk/module.h"
#include "asterisk/pbx.h"
#include "asterisk/sched.h"
#include "asterisk/io.h"
#include "asterisk/config.h"
#include "asterisk/cli.h"
#include "asterisk/translate.h"
#include "asterisk/md5.h"
#include "asterisk/crypto.h"
#include "asterisk/acl.h"
#include "asterisk/manager.h"
#include "asterisk/callerid.h"
#include "asterisk/app.h"
#include "asterisk/mwi.h"
#include "asterisk/astdb.h"
#include "asterisk/musiconhold.h"
#include "asterisk/features.h"
#include "asterisk/utils.h"
#include "asterisk/causes.h"
#include "asterisk/localtime.h"
#include "asterisk/dnsmgr.h"
#include "asterisk/devicestate.h"
#include "asterisk/stringfields.h"
#include "asterisk/linkedlists.h"
#include "asterisk/astobj2.h"
#include "asterisk/timing.h"
#include "asterisk/taskprocessor.h"
#include "asterisk/test.h"
#include "asterisk/security_events.h"
#include "asterisk/stasis_endpoints.h"
#include "asterisk/bridge.h"
#include "asterisk/stasis.h"
#include "asterisk/stasis_system.h"
#include "asterisk/stasis_channels.h"
#include "asterisk/format_cache.h"
#include "asterisk/format_compatibility.h"
#include "asterisk/format_cap.h"
#include "iax2/include/iax2.h"
#include "iax2/include/firmware.h"
#include "iax2/include/parser.h"
#include "iax2/include/provision.h"
#include "iax2/include/codec_pref.h"
#include "iax2/include/format_compatibility.h"
#include "iax2/include/netsock.h"
#include "jitterbuf.h"

Go to the source code of this file.

Data Structures

struct  active_list
 
struct  addr_range
 
struct  call_number_pool
 
struct  chan_iax2_pvt
 
struct  create_addr_info
 
struct  dpcache
 
struct  dpreq_data
 
struct  dynamic_list
 
struct  iax2_context
 
struct  iax2_dpcache
 
struct  iax2_peer
 
struct  iax2_pkt_buf
 
struct  iax2_registry
 
struct  iax2_thread
 
struct  iax2_trunk_peer
 
struct  iax2_user
 
struct  iax_rr
 
struct  idle_list
 
struct  parsed_dial_string
 
struct  peercnt
 
struct  registrations
 
struct  show_peers_context
 Used in the sip_show_peers functions to pass parameters. More...
 
struct  chan_iax2_pvt::signaling_queue
 
struct  signaling_queue_entry
 
struct  tpeers
 

Macros

#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"
 
#define ACN_FORMAT2   "%s %u %d %d %d %d %d %d %d %d %d %d %d %d %d %d %s%s %s%s\n"
 
#define CALLNO_ENTRY_GET_CALLNO(a)   ((a) & 0x7FFF)
 
#define CALLNO_ENTRY_IS_VALIDATED(a)   ((a) & 0x8000)
 
#define CALLNO_ENTRY_SET_VALIDATED(a)   ((a) |= 0x8000)
 
#define CALLNO_ENTRY_TO_PTR(a)   ((void *)(unsigned long)(a))
 
#define CALLNO_TO_PTR(a)   ((void *)(unsigned long)(a))
 
#define CALLTOKEN_HASH_FORMAT   "%s%u%d" /* address + port + ts + randomcalldata */
 
#define CALLTOKEN_IE_FORMAT   "%u?%s" /* time + ? + (40 char hash) */
 
#define DEBUG_SCHED_MULTITHREAD
 
#define DEBUG_SUPPORT
 
#define DEFAULT_CONTEXT   "default"
 
#define DEFAULT_DROP   3
 
#define DEFAULT_FREQ_NOTOK   10 * 1000 /* How often to check, if the host is down... */
 
#define DEFAULT_FREQ_OK   60 * 1000 /* How often to check for the host to be up */
 
#define DEFAULT_MAX_THREAD_COUNT   100
 
#define DEFAULT_MAXMS   2000 /* Must be faster than 2 seconds by default */
 
#define DEFAULT_RETRY_TIME   1000
 
#define DEFAULT_THREAD_COUNT   10
 
#define DEFAULT_TRUNKDATA   640 * 10
 
#define FORMAT   "%-15.15s %-20.20s %-15.15s %-15.15s %-5.5s %-5.10s\n"
 
#define FORMAT   "%-45.45s %-6.6s %-10.10s %-45.45s %8d %s\n"
 
#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"
 
#define FORMAT2   "%-15.15s %-20.20s %-15.15d %-15.15s %-5.5s %-5.10s\n"
 
#define FORMAT2   "%-45.45s %-6.6s %-10.10s %-45.45s %8.8s %s\n"
 
#define FORMAT2   "%-20.20s %-40.40s %-10.10s %-11.11s %-11.11s %-7.7s %-6.6s %-6.6s %s %s %9s\n"
 
#define FORMATB   "%-20.20s %-40.40s %-10.10s %5.5d/%5.5d %5.5d/%5.5d [Native Bridged to ID=%5.5d]\n"
 
#define GAMMA   (0.01)
 
#define IAX2_TRUNK_PREFACE   (sizeof(struct iax_frame) + sizeof(struct ast_iax2_meta_hdr) + sizeof(struct ast_iax2_meta_trunk_hdr))
 
#define IAX_ALLOWFWDOWNLOAD   (uint64_t)(1LLU << 26)
 
#define IAX_ALREADYGONE   (uint64_t)(1LLU << 9)
 
#define IAX_CALLENCRYPTED(pvt)    (ast_test_flag64(pvt, IAX_ENCRYPTED) && ast_test_flag64(pvt, IAX_KEYPOPULATED))
 
#define IAX_CAPABILITY_FULLBANDWIDTH   0xFFFF
 
#define IAX_CAPABILITY_LOWBANDWIDTH
 
#define IAX_CAPABILITY_LOWFREE
 
#define IAX_CAPABILITY_MEDBANDWIDTH
 
#define IAX_CODEC_NOCAP   (uint64_t)(1LLU << 16)
 
#define IAX_CODEC_NOPREFS   (uint64_t)(1LLU << 15)
 
#define IAX_CODEC_USER_FIRST   (uint64_t)(1LLU << 14)
 
#define IAX_DEBUGDIGEST(msg, key)
 
#define IAX_DELAYPBXSTART   (uint64_t)(1LLU << 25)
 
#define IAX_DELME   (uint64_t)(1LLU << 1)
 
#define IAX_DYNAMIC   (uint64_t)(1LLU << 6)
 
#define IAX_ENCRYPTED   (uint64_t)(1LLU << 12)
 
#define IAX_FORCE_ENCRYPT   (uint64_t)(1LLU << 30)
 
#define IAX_HASCALLERID   (uint64_t)(1LLU << 0)
 
#define IAX_IMMEDIATE   (uint64_t)(1LLU << 27)
 
#define IAX_KEYPOPULATED   (uint64_t)(1LLU << 13)
 
#define IAX_MAXAUTHREQ   (uint64_t)(1LLU << 24)
 
#define IAX_NOTRANSFER   (uint64_t)(1LLU << 4)
 
#define IAX_PROVISION   (uint64_t)(1LLU << 10)
 
#define IAX_QUELCH   (uint64_t)(1LLU << 11)
 
#define IAX_RECVCONNECTEDLINE   (uint64_t)(1LLU << 29)
 
#define IAX_RTAUTOCLEAR   (uint64_t)(1LLU << 19)
 
#define IAX_RTCACHEFRIENDS   (uint64_t)(1LLU << 17)
 
#define IAX_RTIGNOREREGEXPIRE   (uint64_t)(1LLU << 21)
 
#define IAX_RTSAVE_SYSNAME   (uint64_t)(1LLU << 8)
 
#define IAX_RTUPDATE   (uint64_t)(1LLU << 18)
 
#define IAX_SENDANI   (uint64_t)(1LLU << 7)
 
#define IAX_SENDCONNECTEDLINE   (uint64_t)(1LLU << 28)
 
#define IAX_SHRINKCALLERID   (uint64_t)(1LLU << 31)
 
#define IAX_TEMPONLY   (uint64_t)(1LLU << 2)
 
#define IAX_TRANSFERMEDIA   (uint64_t)(1LLU << 23)
 
#define IAX_TRUNK   (uint64_t)(1LLU << 3)
 
#define IAX_TRUNKTIMESTAMPS   (uint64_t)(1LLU << 22)
 
#define IAX_USEJITTERBUF   (uint64_t)(1LLU << 5)
 
#define MARK_IAX_SUBCLASS_TX   0x8000
 
#define MAX_JITTER_BUFFER   50
 
#define MAX_PEER_BUCKETS   563
 
#define MAX_RETRY_TIME   10000
 
#define MAX_TIMESTAMP_SKEW   160
 
#define MAX_TRUNK_MTU   1240
 Maximum transmission unit for the UDP packet in the trunk not to be fragmented. This is based on 1516 - ethernet - ip - udp - iax minus one g711 frame = 1240. More...
 
#define MAX_TRUNKDATA   640 * 200
 
#define MAX_USER_BUCKETS   MAX_PEER_BUCKETS
 
#define MEMORY_SIZE   100
 
#define MIN_JITTER_BUFFER   10
 
#define MIN_RETRY_TIME   100
 
#define MIN_REUSE_TIME   60 /* Don't reuse a call number within 60 seconds */
 
#define PEERS_FORMAT   "%-15.15s %-40.40s %s %-40.40s %-6s%s %s %-11s %-32.32s\n"
 
#define PEERS_FORMAT2   "%-15.15s %-40.40s %s %-40.40s %-9s %s %-11s %-32.32s\n"
 
#define PTR_TO_CALLNO(a)   ((unsigned short)(unsigned long)(a))
 
#define PTR_TO_CALLNO_ENTRY(a)   ((uint16_t)(unsigned long)(a))
 
#define SCHED_MULTITHREADED
 
#define schedule_action(func, data)   __schedule_action(func, data, __PRETTY_FUNCTION__)
 
#define TRUNK_CALL_START   (IAX_MAX_CALLS / 2)
 
#define TS_GAP_FOR_JB_RESYNC   5000
 

Typedefs

typedef uint16_t callno_entry
 

Enumerations

enum  {
  CACHE_FLAG_EXISTS = (1 << 0) , CACHE_FLAG_NONEXISTENT = (1 << 1) , CACHE_FLAG_CANEXIST = (1 << 2) , CACHE_FLAG_PENDING = (1 << 3) ,
  CACHE_FLAG_TIMEOUT = (1 << 4) , CACHE_FLAG_TRANSMITTED = (1 << 5) , CACHE_FLAG_UNKNOWN = (1 << 6) , CACHE_FLAG_MATCHMORE = (1 << 7)
}
 
enum  { NEW_PREVENT = 0 , NEW_ALLOW = 1 , NEW_FORCE = 2 , NEW_ALLOW_CALLTOKEN_VALIDATED = 3 }
 
enum  callno_type { CALLNO_TYPE_NORMAL , CALLNO_TYPE_TRUNK }
 
enum  calltoken_peer_enum { CALLTOKEN_DEFAULT = 0 , CALLTOKEN_YES = 1 , CALLTOKEN_AUTO = 2 , CALLTOKEN_NO = 3 }
 Call token validation settings. More...
 
enum  iax2_state { IAX_STATE_STARTED = (1 << 0) , IAX_STATE_AUTHENTICATED = (1 << 1) , IAX_STATE_TBD = (1 << 2) }
 
enum  iax2_thread_iostate { IAX_IOSTATE_IDLE , IAX_IOSTATE_READY , IAX_IOSTATE_PROCESSING , IAX_IOSTATE_SCHEDREADY }
 
enum  iax2_thread_type { IAX_THREAD_TYPE_POOL , IAX_THREAD_TYPE_DYNAMIC }
 
enum  iax_reg_state {
  REG_STATE_UNREGISTERED = 0 , REG_STATE_REGSENT , REG_STATE_AUTHSENT , REG_STATE_REGISTERED ,
  REG_STATE_REJECTED , REG_STATE_TIMEOUT , REG_STATE_NOAUTH
}
 
enum  iax_transfer_state {
  TRANSFER_NONE = 0 , TRANSFER_BEGIN , TRANSFER_READY , TRANSFER_RELEASED ,
  TRANSFER_PASSTHROUGH , TRANSFER_MBEGIN , TRANSFER_MREADY , TRANSFER_MRELEASED ,
  TRANSFER_MPASSTHROUGH , TRANSFER_MEDIA , TRANSFER_MEDIAPASS
}
 

Functions

static void __attempt_transmit (const void *data)
 
static void __auth_reject (const void *nothing)
 
static void __auto_congest (const void *nothing)
 
static void __auto_hangup (const void *nothing)
 
static int __do_deliver (void *data)
 
static void __expire_registry (const void *data)
 
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 __get_from_jb (const void *p)
 
static void __iax2_do_register_s (const void *data)
 
static void __iax2_poke_noanswer (const void *data)
 
static void __iax2_poke_peer_s (const void *data)
 
static int __iax2_show_peers (int fd, int *total, struct mansession *s, const int argc, const char *const argv[])
 
static void __reg_module (void)
 
static int __schedule_action (void(*func)(const void *data), const void *data, const char *funcname)
 
static int __send_command (struct chan_iax2_pvt *i, char type, int command, unsigned int ts, const unsigned char *data, int datalen, int seqno, int now, int transfer, int final)
 
static void __send_lagrq (const void *data)
 
static void __send_ping (const void *data)
 
static int __unload_module (void)
 
static void __unreg_module (void)
 
static void _iax2_show_peers_one (int fd, struct mansession *s, struct show_peers_context *cont, struct iax2_peer *peer)
 
static int acf_channel_read (struct ast_channel *chan, const char *funcname, char *preparse, char *buf, size_t buflen)
 
static int acf_iaxvar_read (struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
 
static int acf_iaxvar_write (struct ast_channel *chan, const char *cmd, char *data, const char *value)
 
static void acl_change_stasis_cb (void *data, struct stasis_subscription *sub, struct stasis_message *message)
 
static void acl_change_stasis_subscribe (void)
 
static void acl_change_stasis_unsubscribe (void)
 
static int add_calltoken_ignore (const char *addr)
 
static void add_empty_calltoken_ie (struct chan_iax2_pvt *pvt, struct iax_ie_data *ied)
 
static int addr_range_cmp_cb (void *obj, void *arg, int flags)
 
static int addr_range_delme_cb (void *obj, void *arg, int flags)
 
static int addr_range_hash_cb (const void *obj, const int flags)
 
static int addr_range_match_address_cb (void *obj, void *arg, int flags)
 
static int apply_context (struct iax2_context *con, const char *context)
 
static int ast_cli_netstats (struct mansession *s, int fd, int limit_fmt)
 
static struct ast_channelast_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. More...
 
struct ast_moduleAST_MODULE_SELF_SYM (void)
 
static int attempt_transmit (const void *data)
 
static int auth_fail (int callno, int failcode)
 
static int auth_reject (const void *data)
 
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 int authenticate_reply (struct chan_iax2_pvt *p, struct ast_sockaddr *addr, struct iax_ies *ies, const char *override, const char *okey)
 
static int authenticate_request (int call_num)
 
static int authenticate_verify (struct chan_iax2_pvt *p, struct iax_ies *ies)
 
static int auto_congest (const void *data)
 
static int auto_hangup (const void *data)
 
static void build_callno_limits (struct ast_variable *v)
 
static struct iax2_contextbuild_context (const char *context)
 
static void build_ecx_key (const unsigned char *digest, struct chan_iax2_pvt *pvt)
 
static void build_encryption_keys (const unsigned char *digest, struct chan_iax2_pvt *pvt)
 
static struct iax2_peerbuild_peer (const char *name, struct ast_variable *v, struct ast_variable *alt, int temponly)
 Create peer structure based on configuration. More...
 
static void build_rand_pad (unsigned char *buf, ssize_t len)
 
static struct iax2_userbuild_user (const char *name, struct ast_variable *v, struct ast_variable *alt, int temponly)
 Create in-memory user structure from configuration. More...
 
static int cache_get_callno_locked (const char *data)
 
static unsigned int calc_rxstamp (struct chan_iax2_pvt *p, unsigned int offset)
 
static unsigned int calc_timestamp (struct chan_iax2_pvt *p, unsigned int ts, struct ast_frame *f)
 
static unsigned int calc_txpeerstamp (struct iax2_trunk_peer *tpeer, int sampms, struct timeval *now)
 
static int calltoken_required (struct ast_sockaddr *addr, const char *name, int subclass)
 
static int check_access (int callno, struct ast_sockaddr *addr, struct iax_ies *ies)
 
static int check_provisioning (struct ast_sockaddr *addr, int sockfd, char *si, unsigned int ver)
 
static int check_srcaddr (struct ast_sockaddr *addr)
 Check if address can be used as packet source. More...
 
static void cleanup_thread_list (void *head)
 
static struct ast_formatcodec_choose_from_prefs (struct iax2_codec_pref *pref, struct ast_format_cap *cap)
 
static int complete_dpreply (struct chan_iax2_pvt *pvt, struct iax_ies *ies)
 
static char * complete_iax2_peers (const char *line, const char *word, int pos, int state, uint64_t flags)
 
static char * complete_iax2_unregister (const char *line, const char *word, int pos, int state)
 
static int complete_transfer (int callno, struct iax_ies *ies)
 
static unsigned char compress_subclass (iax2_format subclass)
 
static void construct_rr (struct chan_iax2_pvt *pvt, struct iax_ie_data *iep)
 
static int create_addr (const char *peername, struct ast_channel *c, struct ast_sockaddr *addr, struct create_addr_info *cai)
 
static int create_callno_pools (void)
 
static int decode_frame (ast_aes_decrypt_key *dcx, struct ast_iax2_full_hdr *fh, struct ast_frame *f, int *datalen)
 
static int decrypt_frame (int callno, struct ast_iax2_full_hdr *fh, struct ast_frame *f, int *datalen)
 
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. More...
 
static void delete_users (void)
 
static void dp_lookup (int callno, const char *context, const char *callednum, const char *callerid, int skiplock)
 
static void * dp_lookup_thread (void *data)
 
static void encmethods_to_str (int e, struct ast_str **buf)
 
static int encrypt_frame (ast_aes_encrypt_key *ecx, struct ast_iax2_full_hdr *fh, unsigned char *poo, int *datalen)
 
static int expire_registry (const void *data)
 
static struct iax2_dpcachefind_cache (struct ast_channel *chan, const char *data, const char *context, const char *exten, int priority)
 
static int find_callno (unsigned short callno, unsigned short dcallno, struct ast_sockaddr *addr, int new, int sockfd, int full_frame)
 
static int find_callno_locked (unsigned short callno, unsigned short dcallno, struct ast_sockaddr *addr, int new, int sockfd, int full_frame)
 
static struct iax2_threadfind_idle_thread (void)
 
static struct iax2_peerfind_peer (const char *name, int realtime)
 
static struct iax2_trunk_peerfind_tpeer (struct ast_sockaddr *addr, int fd)
 
static struct iax2_userfind_user (const char *name)
 
static int firmware_show_callback (struct ast_iax2_firmware_header *header, void *user_data)
 
static unsigned int fix_peerts (struct timeval *rxtrunktime, int callno, unsigned int ts)
 
static void free_context (struct iax2_context *con)
 
static void free_signaling_queue_entry (struct signaling_queue_entry *s)
 
static int function_iaxpeer (struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
 
static int get_auth_methods (const char *value)
 
static int get_encrypt_methods (const char *s)
 
static int get_from_jb (const void *p)
 
static int get_unused_callno (enum callno_type type, int validated, callno_entry *entry)
 
static int handle_call_token (struct ast_iax2_full_hdr *fh, struct iax_ies *ies, struct ast_sockaddr *addr, int fd)
 
static char * handle_cli_iax2_provision (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 
static char * handle_cli_iax2_prune_realtime (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 
static char * handle_cli_iax2_reload (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 
static char * handle_cli_iax2_set_debug (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 
static char * handle_cli_iax2_set_debug_jb (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 
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_set_mtu (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 Set trunk MTU from CLI. More...
 
static char * handle_cli_iax2_show_cache (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 
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_channels (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 
static char * handle_cli_iax2_show_firmware (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 
static char * handle_cli_iax2_show_netstats (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 
static char * handle_cli_iax2_show_peer (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 Show one peer in detail. More...
 
static char * handle_cli_iax2_show_peers (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 char * handle_cli_iax2_show_stats (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 
static char * handle_cli_iax2_show_threads (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 
static char * handle_cli_iax2_show_users (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 
static char * handle_cli_iax2_test_losspct (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 
static char * handle_cli_iax2_unregister (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 
static void handle_deferred_full_frames (struct iax2_thread *thread)
 Handle any deferred full frames for this thread. More...
 
static int handle_error (void)
 
static int iax2_ack_registry (struct iax_ies *ies, struct ast_sockaddr *addr, int callno)
 Acknowledgment received for OUR registration. More...
 
static int attribute_pure iax2_allow_new (int frametype, int subclass, int inbound)
 
static int iax2_answer (struct ast_channel *c)
 
static int iax2_append_register (const char *hostname, const char *username, const char *secret, const char *porta)
 
static int iax2_call (struct ast_channel *c, const char *dest, int timeout)
 
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 More...
 
static iax2_format iax2_codec_choose (struct iax2_codec_pref *pref, iax2_format formats)
 
static unsigned int iax2_datetime (const char *tz)
 
static int iax2_delete_from_sched (const void *data)
 
static void iax2_destroy (int callno)
 
static void iax2_destroy_helper (struct chan_iax2_pvt *pvt)
 
static int iax2_devicestate (const char *data)
 Part of the device state notification system —. More...
 
static int iax2_digit_begin (struct ast_channel *c, char digit)
 
static int iax2_digit_end (struct ast_channel *c, char digit, unsigned int duration)
 
static int iax2_do_register (struct iax2_registry *reg)
 
static int iax2_do_register_s (const void *data)
 
static void iax2_dprequest (struct iax2_dpcache *dp, int callno)
 
static void * iax2_dup_variable_datastore (void *)
 
static int iax2_exec (struct ast_channel *chan, const char *context, const char *exten, int priority, const char *callerid, const char *data)
 Execute IAX2 dialplan switch. More...
 
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. More...
 
static int iax2_fixup (struct ast_channel *oldchannel, struct ast_channel *newchan)
 
static void iax2_frame_free (struct iax_frame *fr)
 
static void iax2_free_variable_datastore (void *)
 
const char * iax2_getformatname (iax2_format format)
 iax2 wrapper function for ast_getformatname More...
 
static const char * iax2_getformatname_multiple (iax2_format format, struct ast_str **codec_buf)
 
static int iax2_getpeername (struct ast_sockaddr addr, char *host, int len)
 
static int iax2_getpeertrunk (struct ast_sockaddr addr)
 
static int iax2_hangup (struct ast_channel *c)
 
static int iax2_indicate (struct ast_channel *c, int condition, const void *data, size_t datalen)
 
static int iax2_is_control_frame_allowed (int subtype)
 
static int iax2_key_rotate (const void *vpvt)
 
static int iax2_lock_callno_unless_destroyed (int callno)
 Acquire the iaxsl[callno] if call exists and not having ongoing hangup. More...
 
static void iax2_lock_owner (int callno)
 
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. More...
 
static int iax2_parse_allow_disallow (struct iax2_codec_pref *pref, iax2_format *formats, const char *list, int allowing)
 
static int iax2_poke_noanswer (const void *data)
 
static int iax2_poke_peer (struct iax2_peer *peer, int heldcall)
 
static int iax2_poke_peer_cb (void *obj, void *arg, int flags)
 
static int iax2_poke_peer_s (const void *data)
 
static int iax2_predestroy (int callno)
 
static void * iax2_process_thread (void *data)
 
static void iax2_process_thread_cleanup (void *data)
 
static int iax2_prov_app (struct ast_channel *chan, const char *data)
 
static int iax2_provision (struct ast_sockaddr *end, int sockfd, const char *dest, const char *template, int force)
 
static void iax2_publish_registry (const char *username, const char *domain, const char *status, const char *cause)
 
static int iax2_queryoption (struct ast_channel *c, int option, void *data, int *datalen)
 
static int iax2_queue_frame (int callno, struct ast_frame *f)
 Queue a frame to a call's owning asterisk channel. More...
 
static int iax2_queue_hangup (int callno)
 Queue a hangup frame on the ast_channel owner. More...
 
static int iax2_queue_hold (int callno, const char *musicclass)
 Queue a hold frame on the ast_channel owner. More...
 
static int iax2_queue_unhold (int callno)
 Queue an unhold frame on the ast_channel owner. More...
 
static struct ast_frameiax2_read (struct ast_channel *c)
 
static int iax2_register (const char *value, int lineno)
 
static struct ast_channeliax2_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 int iax2_sched_add (struct ast_sched_context *sched, int when, ast_sched_cb callback, const void *data)
 
static int iax2_sched_replace (int id, struct ast_sched_context *con, int when, ast_sched_cb callback, const void *data)
 
static int iax2_send (struct chan_iax2_pvt *pvt, struct ast_frame *f, unsigned int ts, int seqno, int now, int transfer, int final)
 
static int iax2_sendhtml (struct ast_channel *c, int subclass, const char *data, int datalen)
 
static int iax2_sendimage (struct ast_channel *c, struct ast_frame *img)
 
static int iax2_sendtext (struct ast_channel *c, const char *text)
 
static int iax2_setoption (struct ast_channel *c, int option, void *data, int datalen)
 
static int iax2_transfer (struct ast_channel *c, const char *dest)
 
static int iax2_transmit (struct iax_frame *fr)
 
static int iax2_trunk_expired (struct iax2_trunk_peer *tpeer, struct timeval *now)
 
static int iax2_trunk_queue (struct chan_iax2_pvt *pvt, struct iax_frame *fr)
 
static int iax2_vnak (int callno)
 
static int iax2_write (struct ast_channel *c, struct ast_frame *f)
 
static void iax_debug_output (const char *data)
 
static void iax_error_output (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 ast_callid iax_pvt_callid_get (int callno)
 
static void iax_pvt_callid_new (int callno)
 
static void iax_pvt_callid_set (int callno, ast_callid callid)
 
static struct iax_frameiaxfrdup2 (struct iax_frame *fr)
 
static void insert_idle_thread (struct iax2_thread *thread)
 
static int invalid_key (ast_aes_decrypt_key *ecx)
 
static void jb_debug_output (const char *fmt,...)
 
static void jb_error_output (const char *fmt,...)
 
static void jb_warning_output (const char *fmt,...)
 
static int load_module (void)
 Load the module. More...
 
static int load_objects (void)
 
static void log_jitterstats (unsigned short callno)
 
static int make_trunk (unsigned short callno, int locked)
 
static int manager_iax2_show_netstats (struct mansession *s, const struct message *m)
 
static int manager_iax2_show_peer_list (struct mansession *s, const struct message *m)
 callback to display iax peers in manager format More...
 
static int manager_iax2_show_peers (struct mansession *s, const struct message *m)
 callback to display iax peers in manager More...
 
static int manager_iax2_show_registry (struct mansession *s, const struct message *m)
 
static int match (struct ast_sockaddr *addr, unsigned short callno, unsigned short dcallno, const struct chan_iax2_pvt *cur, int check_dcallno)
 
static void memcpy_decrypt (unsigned char *dst, const unsigned char *src, int len, ast_aes_decrypt_key *dcx)
 
static void memcpy_encrypt (unsigned char *dst, const unsigned char *src, int len, ast_aes_encrypt_key *ecx)
 
static void merge_encryption (struct chan_iax2_pvt *p, unsigned int enc)
 
static int network_change_sched_cb (const void *data)
 
static void network_change_stasis_cb (void *data, struct stasis_subscription *sub, struct stasis_message *message)
 
static void network_change_stasis_subscribe (void)
 
static void network_change_stasis_unsubscribe (void)
 
static void * network_thread (void *ignore)
 
static struct chan_iax2_pvtnew_iax (struct ast_sockaddr *addr, const char *host)
 
static void parse_dial_string (char *data, struct parsed_dial_string *pds)
 Parses an IAX dial string into its component parts. More...
 
static int peer_cmp_cb (void *obj, void *arg, int flags)
 
static int peer_delme_cb (void *obj, void *arg, int flags)
 
static void peer_destructor (void *obj)
 
static int peer_hash_cb (const void *obj, const int flags)
 
static struct iax2_peerpeer_ref (struct iax2_peer *peer)
 
static int peer_set_sock_cb (void *obj, void *arg, int flags)
 
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 defaultsockfd if not found. More...
 
static int peer_status (struct iax2_peer *peer, char *status, int statuslen)
 peer_status: Report Peer status in character string More...
 
static struct iax2_peerpeer_unref (struct iax2_peer *peer)
 
static int peercnt_add (struct ast_sockaddr *addr)
 
static int peercnt_cmp_cb (void *obj, void *arg, int flags)
 
static int peercnt_hash_cb (const void *obj, const int flags)
 
static void peercnt_modify (unsigned char reg, uint16_t limit, struct ast_sockaddr *sockaddr)
 
static void peercnt_remove (struct peercnt *peercnt)
 
static int peercnt_remove_by_addr (struct ast_sockaddr *addr)
 
static int peercnt_remove_cb (const void *obj)
 
static void poke_all_peers (void)
 
static int prune_addr_range_cb (void *obj, void *arg, int flags)
 
static void prune_peers (void)
 
static void prune_users (void)
 
static int pvt_cmp_cb (void *obj, void *arg, int flags)
 
static void pvt_destructor (void *obj)
 
static int pvt_hash_cb (const void *obj, const int flags)
 
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 call number. More...
 
static int raw_hangup (struct ast_sockaddr *addr, unsigned short src, unsigned short dst, int sockfd)
 
static struct iax2_peerrealtime_peer (const char *peername, struct ast_sockaddr *addr)
 
static void realtime_update_peer (const char *peername, struct ast_sockaddr *sockaddr, time_t regtime)
 
static struct iax2_userrealtime_user (const char *username, struct ast_sockaddr *addr)
 
static void reg_source_db (struct iax2_peer *p)
 
static void register_peer_exten (struct iax2_peer *peer, int onoff)
 
static int register_verify (int callno, struct ast_sockaddr *addr, struct iax_ies *ies)
 Verify inbound registration. More...
 
static int registry_authrequest (int callno)
 
static int registry_rerequest (struct iax_ies *ies, int callno, struct ast_sockaddr *addr)
 
static char * regstate2str (int regstate)
 
static int reload (void)
 
static int reload_config (int forced_reload)
 
static void remove_by_peercallno (struct chan_iax2_pvt *pvt)
 
static void remove_by_transfercallno (struct chan_iax2_pvt *pvt)
 
static int replace_callno (const void *obj)
 
static void requirecalltoken_mark_auto (const char *name, int subclass)
 
static void resend_with_token (int callno, struct iax_frame *f, const char *newtoken)
 
static void save_osptoken (struct iax_frame *fr, struct iax_ies *ies)
 
static void save_rr (struct iax_frame *fr, struct iax_ies *ies)
 
static void sched_delay_remove (struct ast_sockaddr *addr, callno_entry entry)
 
static int schedule_delivery (struct iax_frame *fr, int updatehistory, int fromtrunk, unsigned int *tsout)
 
static int scheduled_destroy (const void *vid)
 
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 int send_command (struct chan_iax2_pvt *, char, int, unsigned int, const unsigned char *, int, int)
 
static int send_command_final (struct chan_iax2_pvt *, char, int, unsigned int, const unsigned char *, int, int)
 
static int send_command_immediate (struct chan_iax2_pvt *, char, int, unsigned int, const unsigned char *, int, int)
 
static int send_command_locked (unsigned short callno, char, int, unsigned int, const unsigned char *, int, int)
 
static int send_command_transfer (struct chan_iax2_pvt *, char, int, unsigned int, const unsigned char *, int)
 
static int send_lagrq (const void *data)
 
static int send_packet (struct iax_frame *f)
 
static int send_ping (const void *data)
 
static void send_signaling (struct chan_iax2_pvt *pvt)
 This function must be called once we are sure the other side has given us a call number. All signaling is held here until that point. More...
 
static int send_trunk (struct iax2_trunk_peer *tpeer, struct timeval *now)
 
static int set_config (const char *config_file, int reload, int forced)
 Load configuration. More...
 
static void set_config_destroy (void)
 
static void set_hangup_source_and_cause (int callno, unsigned char causecode)
 
static void set_peercnt_limit (struct peercnt *peercnt)
 
static int set_peercnt_limit_all_cb (void *obj, void *arg, int flags)
 
static void signal_condition (ast_mutex_t *lock, ast_cond_t *cond)
 
static int socket_process (struct iax2_thread *thread)
 
static int socket_process_helper (struct iax2_thread *thread)
 
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 int socket_read (int *id, int fd, short events, void *cbdata)
 
static void spawn_dp_lookup (int callno, const char *context, const char *callednum, const char *callerid)
 
static int start_network_thread (void)
 
static void stop_stuff (int callno)
 
static void store_by_peercallno (struct chan_iax2_pvt *pvt)
 
static void store_by_transfercallno (struct chan_iax2_pvt *pvt)
 
static int timing_read (int *id, int fd, short events, void *cbdata)
 
static int transfercallno_pvt_cmp_cb (void *obj, void *arg, int flags)
 
static int transfercallno_pvt_hash_cb (const void *obj, const int flags)
 
static int transmit_frame (void *data)
 
static int transmit_trunk (struct iax_frame *f, struct ast_sockaddr *addr, int sockfd)
 
static int try_transfer (struct chan_iax2_pvt *pvt, struct iax_ies *ies)
 
static iax2_format uncompress_subclass (unsigned char csub)
 
static void unlink_peer (struct iax2_peer *peer)
 
static int unload_module (void)
 
static void unwrap_timestamp (struct iax_frame *fr)
 
static void update_jbsched (struct chan_iax2_pvt *pvt)
 
static int update_packet (struct iax_frame *f)
 
static int update_registry (struct ast_sockaddr *addr, int callno, char *devtype, int fd, unsigned short refresh)
 
static int user_cmp_cb (void *obj, void *arg, int flags)
 
static int user_delme_cb (void *obj, void *arg, int flags)
 
static void user_destructor (void *obj)
 
static int user_hash_cb (const void *obj, const int flags)
 
static struct iax2_useruser_unref (struct iax2_user *user)
 
static void vnak_retransmit (int callno, int last)
 
static int wait_for_peercallno (struct chan_iax2_pvt *pvt)
 

Variables

static struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "Inter Asterisk eXchange (Ver 2)" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = AST_BUILDOPT_SUM, .support_level = AST_MODULE_SUPPORT_CORE, .load = load_module, .unload = unload_module, .reload = reload, .load_pri = AST_MODPRI_CHANNEL_DRIVER, .requires = "dnsmgr", .optional_modules = "res_crypto", }
 
static char accountcode [AST_MAX_ACCOUNT_CODE]
 
static struct stasis_subscriptionacl_change_sub
 
static struct active_list active_list = { .first = NULL, .last = NULL, .lock = { PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP , NULL, {1, 0} } , }
 
static int adsi = 0
 
static int amaflags = 0
 
static const struct ast_module_infoast_module_info = &__mod_info
 
static int authdebug = 0
 
static int autokill = 0
 
static struct ao2_containercallno_limits
 
static struct call_number_pool callno_pool
 
static ast_mutex_t callno_pool_lock = { PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP , NULL, {1, 0} }
 
static struct call_number_pool callno_pool_trunk
 
static struct ao2_containercalltoken_ignores
 
static struct ast_cli_entry cli_iax2 []
 
static struct ast_sockaddr debugaddr
 
static uint16_t DEFAULT_MAXCALLNO_LIMIT = 2048
 
static uint16_t DEFAULT_MAXCALLNO_LIMIT_NONVAL = 8192
 
static char default_parkinglot [AST_MAX_CONTEXT]
 
static int defaultsockfd = -1
 
static int delayreject = 0
 
static struct dpcache dpcache = { .first = NULL, .last = NULL, .lock = { PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP , NULL, {1, 0} } , }
 
static struct dynamic_list dynamic_list = { .first = NULL, .last = NULL, .lock = { PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP , NULL, {1, 0} } , }
 
struct {
   struct iax_frame *   first
 
   struct iax_frame *   last
 
frame_queue [IAX_MAX_CALLS]
 a list of frames that may need to be retransmitted More...
 
static int global_max_trunk_mtu
 
static uint16_t global_maxcallno
 
static uint16_t global_maxcallno_nonval
 
static int global_rtautoclear = 120
 
static struct ast_flags64 globalflags = { 0 }
 
static int iax2_authmethods = 0
 
static iax2_format iax2_capability = IAX_CAPABILITY_FULLBANDWIDTH
 
static int iax2_encryption = 0
 
static int(* iax2_regfunk )(const char *username, int onoff) = NULL
 
static struct ast_switch iax2_switch
 
static struct ast_channel_tech iax2_tech
 
static const struct ast_datastore_info iax2_variable_datastore_info
 
static struct ao2_containeriax_peercallno_pvts
 Another container of iax2_pvt structures. More...
 
static struct ao2_containeriax_transfercallno_pvts
 Another container of iax2_pvt structures. More...
 
static int iaxactivethreadcount = 0
 
static int iaxcompat = 0
 
static int iaxdebug = 0
 
static int iaxdefaultdpcache =10 * 60
 
static int iaxdefaulttimeout = 5
 
static int iaxdynamicthreadcount = 0
 
static int iaxdynamicthreadnum = 0
 
static int iaxmaxthreadcount = DEFAULT_MAX_THREAD_COUNT
 
static struct ast_custom_function iaxpeer_function
 
static struct chan_iax2_pvtiaxs [IAX_MAX_CALLS]
 an array of iax2 pvt structures More...
 
static ast_mutex_t iaxsl [ARRAY_LEN(iaxs)]
 chan_iax2_pvt structure locks More...
 
static int iaxthreadcount = DEFAULT_THREAD_COUNT
 
static int iaxtrunkdebug = 0
 
static struct ast_custom_function iaxvar_function
 
static struct idle_list idle_list = { .first = NULL, .last = NULL, .lock = { PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP , NULL, {1, 0} } , }
 
static struct io_contextio
 
static int jittertargetextra = 40
 
static int lagrq_time = 10
 
static char language [MAX_LANGUAGE] = ""
 
static int last_authmethod = 0
 
static time_t max_calltoken_delay = 10
 
static int max_reg_expire
 
static int max_retries = 4
 
static int maxauthreq = 3
 
static int maxjitterbuffer =1000
 
static int maxjitterinterps =10
 
static int min_reg_expire
 
static char mohinterpret [MAX_MUSICCLASS]
 
static char mohsuggest [MAX_MUSICCLASS]
 
static struct ast_netsock_listnetsock
 
static pthread_t netthreadid = AST_PTHREADT_NULL
 
static int network_change_sched_id = -1
 
static struct stasis_subscriptionnetwork_change_sub
 
static struct ast_netsock_listoutsock
 
static char * papp = "IAX2Provision"
 
static struct ao2_containerpeercnts
 
static struct ao2_containerpeers
 
static int ping_time = 21
 
static struct iax2_codec_pref prefs_global
 
struct {
   unsigned int   cos
 
   unsigned int   tos
 
qos = { 0, 0 }
 
static int randomcalltokendata
 
static char regcontext [AST_MAX_CONTEXT] = ""
 
static struct registrations registrations = { .first = NULL, .last = NULL, .lock = { PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP , NULL, {1, 0} } , }
 
static int resyncthreshold =1000
 
static struct ast_sched_contextsched
 
static int srvlookup = 0
 
static const char tdesc [] = "Inter Asterisk eXchange Driver (Ver 2)"
 
static int test_losspct = 0
 
static struct ast_timertimer
 
static uint16_t total_nonval_callno_used = 0
 
static struct tpeers tpeers = { .first = NULL, .last = NULL, .lock = { PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP , NULL, {1, 0} } , }
 
static struct ast_taskprocessortransmit_processor
 
static int trunk_maxmtu
 
static int trunk_nmaxmtu
 
static int trunk_timed
 
static int trunk_untimed
 
static int trunkfreq = 20
 
static int trunkmaxsize = MAX_TRUNKDATA
 
static struct ao2_containerusers
 

Detailed Description

Implementation of Inter-Asterisk eXchange Version 2 as specified in RFC 5456.

Author
Mark Spencer marks.nosp@m.ter@.nosp@m.digiu.nosp@m.m.co.nosp@m.m
Todo:
Implement musicclass settings for IAX2 devices

Definition in file chan_iax2.c.

Macro Definition Documentation

◆ ACN_FORMAT1

#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"

◆ ACN_FORMAT2

#define ACN_FORMAT2   "%s %u %d %d %d %d %d %d %d %d %d %d %d %d %d %d %s%s %s%s\n"

◆ CALLNO_ENTRY_GET_CALLNO

#define CALLNO_ENTRY_GET_CALLNO (   a)    ((a) & 0x7FFF)

Definition at line 905 of file chan_iax2.c.

◆ CALLNO_ENTRY_IS_VALIDATED

#define CALLNO_ENTRY_IS_VALIDATED (   a)    ((a) & 0x8000)

Definition at line 904 of file chan_iax2.c.

◆ CALLNO_ENTRY_SET_VALIDATED

#define CALLNO_ENTRY_SET_VALIDATED (   a)    ((a) |= 0x8000)

Definition at line 903 of file chan_iax2.c.

◆ CALLNO_ENTRY_TO_PTR

#define CALLNO_ENTRY_TO_PTR (   a)    ((void *)(unsigned long)(a))

Definition at line 901 of file chan_iax2.c.

◆ CALLNO_TO_PTR

#define CALLNO_TO_PTR (   a)    ((void *)(unsigned long)(a))

Definition at line 286 of file chan_iax2.c.

◆ CALLTOKEN_HASH_FORMAT

#define CALLTOKEN_HASH_FORMAT   "%s%u%d" /* address + port + ts + randomcalldata */

◆ CALLTOKEN_IE_FORMAT

#define CALLTOKEN_IE_FORMAT   "%u?%s" /* time + ? + (40 char hash) */

◆ DEBUG_SCHED_MULTITHREAD

#define DEBUG_SCHED_MULTITHREAD

Definition at line 278 of file chan_iax2.c.

◆ DEBUG_SUPPORT

#define DEBUG_SUPPORT

Definition at line 294 of file chan_iax2.c.

◆ DEFAULT_CONTEXT

#define DEFAULT_CONTEXT   "default"

Definition at line 313 of file chan_iax2.c.

◆ DEFAULT_DROP

#define DEFAULT_DROP   3

Definition at line 292 of file chan_iax2.c.

◆ DEFAULT_FREQ_NOTOK

#define DEFAULT_FREQ_NOTOK   10 * 1000 /* How often to check, if the host is down... */

Definition at line 389 of file chan_iax2.c.

◆ DEFAULT_FREQ_OK

#define DEFAULT_FREQ_OK   60 * 1000 /* How often to check for the host to be up */

Definition at line 388 of file chan_iax2.c.

◆ DEFAULT_MAX_THREAD_COUNT

#define DEFAULT_MAX_THREAD_COUNT   100

Definition at line 289 of file chan_iax2.c.

◆ DEFAULT_MAXMS

#define DEFAULT_MAXMS   2000 /* Must be faster than 2 seconds by default */

Definition at line 387 of file chan_iax2.c.

◆ DEFAULT_RETRY_TIME

#define DEFAULT_RETRY_TIME   1000

Definition at line 290 of file chan_iax2.c.

◆ DEFAULT_THREAD_COUNT

#define DEFAULT_THREAD_COUNT   10

Definition at line 288 of file chan_iax2.c.

◆ DEFAULT_TRUNKDATA

#define DEFAULT_TRUNKDATA   640 * 10

40ms, uncompressed linear * 10 channels

Definition at line 662 of file chan_iax2.c.

◆ FORMAT [1/3]

#define FORMAT   "%-15.15s %-20.20s %-15.15s %-15.15s %-5.5s %-5.10s\n"

◆ FORMAT [2/3]

#define FORMAT   "%-45.45s %-6.6s %-10.10s %-45.45s %8d %s\n"

◆ FORMAT [3/3]

#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"

◆ FORMAT2 [1/3]

#define FORMAT2   "%-15.15s %-20.20s %-15.15d %-15.15s %-5.5s %-5.10s\n"

◆ FORMAT2 [2/3]

#define FORMAT2   "%-45.45s %-6.6s %-10.10s %-45.45s %8.8s %s\n"

◆ FORMAT2 [3/3]

#define FORMAT2   "%-20.20s %-40.40s %-10.10s %-11.11s %-11.11s %-7.7s %-6.6s %-6.6s %s %s %9s\n"

◆ FORMATB

#define FORMATB   "%-20.20s %-40.40s %-10.10s %5.5d/%5.5d %5.5d/%5.5d [Native Bridged to ID=%5.5d]\n"

◆ GAMMA

#define GAMMA   (0.01)

Definition at line 299 of file chan_iax2.c.

◆ IAX2_TRUNK_PREFACE

#define IAX2_TRUNK_PREFACE   (sizeof(struct iax_frame) + sizeof(struct ast_iax2_meta_hdr) + sizeof(struct ast_iax2_meta_trunk_hdr))

Definition at line 590 of file chan_iax2.c.

◆ IAX_ALLOWFWDOWNLOAD

#define IAX_ALLOWFWDOWNLOAD   (uint64_t)(1LLU << 26)

Allow the FWDOWNL command?

Definition at line 475 of file chan_iax2.c.

◆ IAX_ALREADYGONE

#define IAX_ALREADYGONE   (uint64_t)(1LLU << 9)

Already disconnected

Definition at line 459 of file chan_iax2.c.

◆ IAX_CALLENCRYPTED

#define IAX_CALLENCRYPTED (   pvt)     (ast_test_flag64(pvt, IAX_ENCRYPTED) && ast_test_flag64(pvt, IAX_KEYPOPULATED))

Definition at line 392 of file chan_iax2.c.

◆ IAX_CAPABILITY_FULLBANDWIDTH

#define IAX_CAPABILITY_FULLBANDWIDTH   0xFFFF

Definition at line 366 of file chan_iax2.c.

◆ IAX_CAPABILITY_LOWBANDWIDTH

#define IAX_CAPABILITY_LOWBANDWIDTH
Value:
~AST_FORMAT_G726 & \
~AST_FORMAT_G726_AAL2 & \
~AST_FORMAT_ADPCM)
#define IAX_CAPABILITY_MEDBANDWIDTH
Definition: chan_iax2.c:368

Definition at line 378 of file chan_iax2.c.

◆ IAX_CAPABILITY_LOWFREE

#define IAX_CAPABILITY_LOWFREE
Value:
~AST_FORMAT_G723)
#define IAX_CAPABILITY_LOWBANDWIDTH
Definition: chan_iax2.c:378

Definition at line 383 of file chan_iax2.c.

◆ IAX_CAPABILITY_MEDBANDWIDTH

#define IAX_CAPABILITY_MEDBANDWIDTH

Definition at line 368 of file chan_iax2.c.

◆ IAX_CODEC_NOCAP

#define IAX_CODEC_NOCAP   (uint64_t)(1LLU << 16)

only consider requested format and ignore capabilities

Definition at line 466 of file chan_iax2.c.

◆ IAX_CODEC_NOPREFS

#define IAX_CODEC_NOPREFS   (uint64_t)(1LLU << 15)

Force old behaviour by turning off prefs

Definition at line 465 of file chan_iax2.c.

◆ IAX_CODEC_USER_FIRST

#define IAX_CODEC_USER_FIRST   (uint64_t)(1LLU << 14)

are we willing to let the other guy choose the codec?

Definition at line 464 of file chan_iax2.c.

◆ IAX_DEBUGDIGEST

#define IAX_DEBUGDIGEST (   msg,
  key 
)

Definition at line 395 of file chan_iax2.c.

◆ IAX_DELAYPBXSTART

#define IAX_DELAYPBXSTART   (uint64_t)(1LLU << 25)

Don't start a PBX on the channel until the peer sends us a response, so that we've achieved a three-way handshake with them before sending voice or anything else

Definition at line 474 of file chan_iax2.c.

◆ IAX_DELME

#define IAX_DELME   (uint64_t)(1LLU << 1)

Needs to be deleted

Definition at line 451 of file chan_iax2.c.

◆ IAX_DYNAMIC

#define IAX_DYNAMIC   (uint64_t)(1LLU << 6)

dynamic peer

Definition at line 456 of file chan_iax2.c.

◆ IAX_ENCRYPTED

#define IAX_ENCRYPTED   (uint64_t)(1LLU << 12)

Whether we should assume encrypted tx/rx

Definition at line 462 of file chan_iax2.c.

◆ IAX_FORCE_ENCRYPT

#define IAX_FORCE_ENCRYPT   (uint64_t)(1LLU << 30)

Forces call encryption, if encryption not possible hangup

Definition at line 479 of file chan_iax2.c.

◆ IAX_HASCALLERID

#define IAX_HASCALLERID   (uint64_t)(1LLU << 0)

CallerID has been specified

Definition at line 450 of file chan_iax2.c.

◆ IAX_IMMEDIATE

#define IAX_IMMEDIATE   (uint64_t)(1LLU << 27)

Allow immediate off-hook to extension s

Definition at line 476 of file chan_iax2.c.

◆ IAX_KEYPOPULATED

#define IAX_KEYPOPULATED   (uint64_t)(1LLU << 13)

Whether we have a key populated

Definition at line 463 of file chan_iax2.c.

◆ IAX_MAXAUTHREQ

#define IAX_MAXAUTHREQ   (uint64_t)(1LLU << 24)

Maximum outstanding AUTHREQ restriction is in place

Definition at line 473 of file chan_iax2.c.

◆ IAX_NOTRANSFER

#define IAX_NOTRANSFER   (uint64_t)(1LLU << 4)

Don't native bridge

Definition at line 454 of file chan_iax2.c.

◆ IAX_PROVISION

#define IAX_PROVISION   (uint64_t)(1LLU << 10)

This is a provisioning request

Definition at line 460 of file chan_iax2.c.

◆ IAX_QUELCH

#define IAX_QUELCH   (uint64_t)(1LLU << 11)

Whether or not we quelch audio

Definition at line 461 of file chan_iax2.c.

◆ IAX_RECVCONNECTEDLINE

#define IAX_RECVCONNECTEDLINE   (uint64_t)(1LLU << 29)

Allow receiving of connected line updates

Definition at line 478 of file chan_iax2.c.

◆ IAX_RTAUTOCLEAR

#define IAX_RTAUTOCLEAR   (uint64_t)(1LLU << 19)

erase me on expire

Definition at line 469 of file chan_iax2.c.

◆ IAX_RTCACHEFRIENDS

#define IAX_RTCACHEFRIENDS   (uint64_t)(1LLU << 17)

let realtime stay till your reload

Definition at line 467 of file chan_iax2.c.

◆ IAX_RTIGNOREREGEXPIRE

#define IAX_RTIGNOREREGEXPIRE   (uint64_t)(1LLU << 21)

When using realtime, ignore registration expiration

Definition at line 470 of file chan_iax2.c.

◆ IAX_RTSAVE_SYSNAME

#define IAX_RTSAVE_SYSNAME   (uint64_t)(1LLU << 8)

Save Systname on Realtime Updates

Definition at line 458 of file chan_iax2.c.

◆ IAX_RTUPDATE

#define IAX_RTUPDATE   (uint64_t)(1LLU << 18)

Send a realtime update

Definition at line 468 of file chan_iax2.c.

◆ IAX_SENDANI

#define IAX_SENDANI   (uint64_t)(1LLU << 7)

Send ANI along with CallerID

Definition at line 457 of file chan_iax2.c.

◆ IAX_SENDCONNECTEDLINE

#define IAX_SENDCONNECTEDLINE   (uint64_t)(1LLU << 28)

Allow sending of connected line updates

Definition at line 477 of file chan_iax2.c.

◆ IAX_SHRINKCALLERID

#define IAX_SHRINKCALLERID   (uint64_t)(1LLU << 31)

Turn on and off caller id shrinking

Definition at line 480 of file chan_iax2.c.

◆ IAX_TEMPONLY

#define IAX_TEMPONLY   (uint64_t)(1LLU << 2)

Temporary (realtime)

Definition at line 452 of file chan_iax2.c.

◆ IAX_TRANSFERMEDIA

#define IAX_TRANSFERMEDIA   (uint64_t)(1LLU << 23)

When doing IAX2 transfers, transfer media only

Definition at line 472 of file chan_iax2.c.

◆ IAX_TRUNK

#define IAX_TRUNK   (uint64_t)(1LLU << 3)

Treat as a trunk

Definition at line 453 of file chan_iax2.c.

◆ IAX_TRUNKTIMESTAMPS

#define IAX_TRUNKTIMESTAMPS   (uint64_t)(1LLU << 22)

Send trunk timestamps

Definition at line 471 of file chan_iax2.c.

◆ IAX_USEJITTERBUF

#define IAX_USEJITTERBUF   (uint64_t)(1LLU << 5)

Use jitter buffer

Definition at line 455 of file chan_iax2.c.

◆ MARK_IAX_SUBCLASS_TX

#define MARK_IAX_SUBCLASS_TX   0x8000

Definition at line 670 of file chan_iax2.c.

◆ MAX_JITTER_BUFFER

#define MAX_JITTER_BUFFER   50

Definition at line 659 of file chan_iax2.c.

◆ MAX_PEER_BUCKETS

#define MAX_PEER_BUCKETS   563

This module will get much higher performance when doing a lot of user and peer lookups if the number of buckets is increased from 1. However, to maintain old behavior for Asterisk 1.4, these are set to 1 by default. When using multiple buckets, search order through these containers is considered random, so you will not be able to depend on the order the entires are specified in iax.conf for matching order.

Definition at line 948 of file chan_iax2.c.

◆ MAX_RETRY_TIME

#define MAX_RETRY_TIME   10000

Definition at line 657 of file chan_iax2.c.

◆ MAX_TIMESTAMP_SKEW

#define MAX_TIMESTAMP_SKEW   160

maximum difference between actual and predicted ts for sending

Definition at line 664 of file chan_iax2.c.

◆ MAX_TRUNK_MTU

#define MAX_TRUNK_MTU   1240

Maximum transmission unit for the UDP packet in the trunk not to be fragmented. This is based on 1516 - ethernet - ip - udp - iax minus one g711 frame = 1240.

Definition at line 308 of file chan_iax2.c.

◆ MAX_TRUNKDATA

#define MAX_TRUNKDATA   640 * 200

40ms, uncompressed linear * 200 channels

Definition at line 333 of file chan_iax2.c.

◆ MAX_USER_BUCKETS

#define MAX_USER_BUCKETS   MAX_PEER_BUCKETS

Definition at line 952 of file chan_iax2.c.

◆ MEMORY_SIZE

#define MEMORY_SIZE   100

Definition at line 291 of file chan_iax2.c.

◆ MIN_JITTER_BUFFER

#define MIN_JITTER_BUFFER   10

Definition at line 660 of file chan_iax2.c.

◆ MIN_RETRY_TIME

#define MIN_RETRY_TIME   100

Definition at line 656 of file chan_iax2.c.

◆ MIN_REUSE_TIME

#define MIN_REUSE_TIME   60 /* Don't reuse a call number within 60 seconds */

Definition at line 296 of file chan_iax2.c.

◆ PEERS_FORMAT

#define PEERS_FORMAT   "%-15.15s %-40.40s %s %-40.40s %-6s%s %s %-11s %-32.32s\n"

Definition at line 6878 of file chan_iax2.c.

◆ PEERS_FORMAT2

#define PEERS_FORMAT2   "%-15.15s %-40.40s %s %-40.40s %-9s %s %-11s %-32.32s\n"

Definition at line 6877 of file chan_iax2.c.

◆ PTR_TO_CALLNO

#define PTR_TO_CALLNO (   a)    ((unsigned short)(unsigned long)(a))

Definition at line 285 of file chan_iax2.c.

◆ PTR_TO_CALLNO_ENTRY

#define PTR_TO_CALLNO_ENTRY (   a)    ((uint16_t)(unsigned long)(a))

Definition at line 900 of file chan_iax2.c.

◆ SCHED_MULTITHREADED

#define SCHED_MULTITHREADED
Todo:
XXX The IAX2 channel driver needs its native bridge code converted to the new bridge technology scheme.
Note
The chan_dahdi native bridge code can be used as an example. It also appears that chan_iax2 also has a native transfer check like chan_dahdi to eliminate tromboned calls.
The existing native bridge code is marked with the IAX2_NATIVE_BRIDGING conditional.

Definition at line 274 of file chan_iax2.c.

◆ schedule_action

#define schedule_action (   func,
  data 
)    __schedule_action(func, data, __PRETTY_FUNCTION__)

Definition at line 1674 of file chan_iax2.c.

◆ TRUNK_CALL_START

#define TRUNK_CALL_START   (IAX_MAX_CALLS / 2)

Definition at line 1172 of file chan_iax2.c.

◆ TS_GAP_FOR_JB_RESYNC

#define TS_GAP_FOR_JB_RESYNC   5000

Definition at line 667 of file chan_iax2.c.

Typedef Documentation

◆ callno_entry

typedef uint16_t callno_entry

Definition at line 692 of file chan_iax2.c.

Enumeration Type Documentation

◆ anonymous enum

anonymous enum
Enumerator
CACHE_FLAG_EXISTS 

Extension exists

CACHE_FLAG_NONEXISTENT 

Extension is nonexistent

CACHE_FLAG_CANEXIST 

Extension can exist

CACHE_FLAG_PENDING 

Waiting to hear back response

CACHE_FLAG_TIMEOUT 

Timed out

CACHE_FLAG_TRANSMITTED 

Request transmitted

CACHE_FLAG_UNKNOWN 

Timeout

CACHE_FLAG_MATCHMORE 

Matchmore

Definition at line 999 of file chan_iax2.c.

999  {
1000  /*! Extension exists */
1001  CACHE_FLAG_EXISTS = (1 << 0),
1002  /*! Extension is nonexistent */
1003  CACHE_FLAG_NONEXISTENT = (1 << 1),
1004  /*! Extension can exist */
1005  CACHE_FLAG_CANEXIST = (1 << 2),
1006  /*! Waiting to hear back response */
1007  CACHE_FLAG_PENDING = (1 << 3),
1008  /*! Timed out */
1009  CACHE_FLAG_TIMEOUT = (1 << 4),
1010  /*! Request transmitted */
1011  CACHE_FLAG_TRANSMITTED = (1 << 5),
1012  /*! Timeout */
1013  CACHE_FLAG_UNKNOWN = (1 << 6),
1014  /*! Matchmore */
1015  CACHE_FLAG_MATCHMORE = (1 << 7),
1016 };
@ CACHE_FLAG_TIMEOUT
Definition: chan_iax2.c:1009
@ CACHE_FLAG_EXISTS
Definition: chan_iax2.c:1001
@ CACHE_FLAG_UNKNOWN
Definition: chan_iax2.c:1013
@ CACHE_FLAG_MATCHMORE
Definition: chan_iax2.c:1015
@ CACHE_FLAG_CANEXIST
Definition: chan_iax2.c:1005
@ CACHE_FLAG_PENDING
Definition: chan_iax2.c:1007
@ CACHE_FLAG_NONEXISTENT
Definition: chan_iax2.c:1003
@ CACHE_FLAG_TRANSMITTED
Definition: chan_iax2.c:1011

◆ anonymous enum

anonymous enum
Enumerator
NEW_PREVENT 
NEW_ALLOW 
NEW_FORCE 
NEW_ALLOW_CALLTOKEN_VALIDATED 

Definition at line 2300 of file chan_iax2.c.

2300  {
2301  /* do not allow a new call number, only search ones in use for match */
2302  NEW_PREVENT = 0,
2303  /* search for match first, then allow a new one to be allocated */
2304  NEW_ALLOW = 1,
2305  /* do not search for match, force a new call number */
2306  NEW_FORCE = 2,
2307  /* do not search for match, force a new call number. Signifies call number
2308  * has been calltoken validated */
2310 };
@ NEW_PREVENT
Definition: chan_iax2.c:2302
@ NEW_ALLOW
Definition: chan_iax2.c:2304
@ NEW_FORCE
Definition: chan_iax2.c:2306
@ NEW_ALLOW_CALLTOKEN_VALIDATED
Definition: chan_iax2.c:2309

◆ callno_type

Enumerator
CALLNO_TYPE_NORMAL 
CALLNO_TYPE_TRUNK 

Definition at line 895 of file chan_iax2.c.

895  {
898 };
@ CALLNO_TYPE_TRUNK
Definition: chan_iax2.c:897
@ CALLNO_TYPE_NORMAL
Definition: chan_iax2.c:896

◆ calltoken_peer_enum

Call token validation settings.

Enumerator
CALLTOKEN_DEFAULT 

Default calltoken required unless the ip is in the ignorelist.

CALLTOKEN_YES 

Require call token validation.

CALLTOKEN_AUTO 

Require call token validation after a successful registration using call token validation occurs.

CALLTOKEN_NO 

Do not require call token validation.

Definition at line 488 of file chan_iax2.c.

488  {
489  /*! \brief Default calltoken required unless the ip is in the ignorelist */
490  CALLTOKEN_DEFAULT = 0,
491  /*! \brief Require call token validation. */
492  CALLTOKEN_YES = 1,
493  /*! \brief Require call token validation after a successful registration
494  * using call token validation occurs. */
495  CALLTOKEN_AUTO = 2,
496  /*! \brief Do not require call token validation. */
497  CALLTOKEN_NO = 3,
498 };
@ CALLTOKEN_DEFAULT
Default calltoken required unless the ip is in the ignorelist.
Definition: chan_iax2.c:490
@ CALLTOKEN_AUTO
Require call token validation after a successful registration using call token validation occurs.
Definition: chan_iax2.c:495
@ CALLTOKEN_NO
Do not require call token validation.
Definition: chan_iax2.c:497
@ CALLTOKEN_YES
Require call token validation.
Definition: chan_iax2.c:492

◆ iax2_state

enum iax2_state
Enumerator
IAX_STATE_STARTED 
IAX_STATE_AUTHENTICATED 
IAX_STATE_TBD 

Definition at line 438 of file chan_iax2.c.

438  {
439  IAX_STATE_STARTED = (1 << 0),
440  IAX_STATE_AUTHENTICATED = (1 << 1),
441  IAX_STATE_TBD = (1 << 2),
442 };
@ IAX_STATE_TBD
Definition: chan_iax2.c:441
@ IAX_STATE_AUTHENTICATED
Definition: chan_iax2.c:440
@ IAX_STATE_STARTED
Definition: chan_iax2.c:439

◆ iax2_thread_iostate

Enumerator
IAX_IOSTATE_IDLE 
IAX_IOSTATE_READY 
IAX_IOSTATE_PROCESSING 
IAX_IOSTATE_SCHEDREADY 

Definition at line 1040 of file chan_iax2.c.

1040  {
1045 };
@ IAX_IOSTATE_PROCESSING
Definition: chan_iax2.c:1043
@ IAX_IOSTATE_SCHEDREADY
Definition: chan_iax2.c:1044
@ IAX_IOSTATE_IDLE
Definition: chan_iax2.c:1041
@ IAX_IOSTATE_READY
Definition: chan_iax2.c:1042

◆ iax2_thread_type

Enumerator
IAX_THREAD_TYPE_POOL 
IAX_THREAD_TYPE_DYNAMIC 

Definition at line 1047 of file chan_iax2.c.

1047  {
1050 };
@ IAX_THREAD_TYPE_DYNAMIC
Definition: chan_iax2.c:1049
@ IAX_THREAD_TYPE_POOL
Definition: chan_iax2.c:1048

◆ iax_reg_state

Enumerator
REG_STATE_UNREGISTERED 
REG_STATE_REGSENT 
REG_STATE_AUTHSENT 
REG_STATE_REGISTERED 
REG_STATE_REJECTED 
REG_STATE_TIMEOUT 
REG_STATE_NOAUTH 

Definition at line 613 of file chan_iax2.c.

613  {
621 };
@ REG_STATE_REGSENT
Definition: chan_iax2.c:615
@ REG_STATE_TIMEOUT
Definition: chan_iax2.c:619
@ REG_STATE_AUTHSENT
Definition: chan_iax2.c:616
@ REG_STATE_NOAUTH
Definition: chan_iax2.c:620
@ REG_STATE_REGISTERED
Definition: chan_iax2.c:617
@ REG_STATE_REJECTED
Definition: chan_iax2.c:618
@ REG_STATE_UNREGISTERED
Definition: chan_iax2.c:614

◆ iax_transfer_state

Enumerator
TRANSFER_NONE 
TRANSFER_BEGIN 
TRANSFER_READY 
TRANSFER_RELEASED 
TRANSFER_PASSTHROUGH 
TRANSFER_MBEGIN 
TRANSFER_MREADY 
TRANSFER_MRELEASED 
TRANSFER_MPASSTHROUGH 
TRANSFER_MEDIA 
TRANSFER_MEDIAPASS 

Definition at line 623 of file chan_iax2.c.

623  {
624  TRANSFER_NONE = 0,
635 };
@ TRANSFER_MEDIA
Definition: chan_iax2.c:633
@ TRANSFER_NONE
Definition: chan_iax2.c:624
@ TRANSFER_MPASSTHROUGH
Definition: chan_iax2.c:632
@ TRANSFER_MEDIAPASS
Definition: chan_iax2.c:634
@ TRANSFER_PASSTHROUGH
Definition: chan_iax2.c:628
@ TRANSFER_MRELEASED
Definition: chan_iax2.c:631
@ TRANSFER_BEGIN
Definition: chan_iax2.c:625
@ TRANSFER_MREADY
Definition: chan_iax2.c:630
@ TRANSFER_READY
Definition: chan_iax2.c:626
@ TRANSFER_MBEGIN
Definition: chan_iax2.c:629
@ TRANSFER_RELEASED
Definition: chan_iax2.c:627

Function Documentation

◆ __attempt_transmit()

static void __attempt_transmit ( const void *  data)
static

Definition at line 3545 of file chan_iax2.c.

3546 {
3547  /* Attempt to transmit the frame to the remote peer...
3548  Called without iaxsl held. */
3549  struct iax_frame *f = (struct iax_frame *)data;
3550  int freeme = 0;
3551  int callno = f->callno;
3552 
3553  /* Make sure this call is still active */
3554  if (callno)
3556  if (callno && iaxs[callno]) {
3557  if (f->retries < 0) {
3558  /* Already ACK'd */
3559  freeme = 1;
3560  } else if (f->retries >= max_retries) {
3561  /* Too many attempts. Record an error. */
3562  if (f->transfer) {
3563  /* Transfer timeout */
3565  } else if (f->final) {
3567  } else {
3568  if (iaxs[callno]->owner) {
3569  ast_log(LOG_WARNING, "Max retries exceeded to host %s on %s (type = %u, subclass = %d, ts=%u, seqno=%d)\n",
3572  f->af.frametype,
3573  f->af.subclass.integer,
3574  f->ts,
3575  f->oseqno);
3576  }
3577  iaxs[callno]->error = ETIMEDOUT;
3578  if (iaxs[callno]->owner) {
3580  /* Hangup the fd */
3581  iax2_queue_frame(callno, &fr); /* XXX */
3582  /* Remember, owner could disappear */
3583  if (iaxs[callno] && iaxs[callno]->owner)
3585  } else {
3586  if (iaxs[callno]->reg) {
3587  memset(&iaxs[callno]->reg->us, 0, sizeof(iaxs[callno]->reg->us));
3588  iaxs[callno]->reg->regstate = REG_STATE_TIMEOUT;
3589  iaxs[callno]->reg->refresh = IAX_DEFAULT_REG_EXPIRE;
3590  }
3591  iax2_destroy(callno);
3592  }
3593  }
3594  freeme = 1;
3595  } else {
3596  /* Update it if it needs it */
3597  update_packet(f);
3598  /* Attempt transmission */
3599  send_packet(f);
3600  f->retries++;
3601  /* Try again later after 10 times as long */
3602  f->retrytime *= 10;
3603  if (f->retrytime > MAX_RETRY_TIME)
3605  /* Transfer messages max out at one second */
3606  if (f->transfer && (f->retrytime > 1000))
3607  f->retrytime = 1000;
3609  }
3610  } else {
3611  /* Make sure it gets freed */
3612  f->retries = -1;
3613  freeme = 1;
3614  }
3615 
3616  if (freeme) {
3617  /* Don't attempt delivery, just remove it from the queue */
3618  AST_LIST_REMOVE(&frame_queue[callno], f, list);
3619  ast_mutex_unlock(&iaxsl[callno]);
3620  f->retrans = -1; /* this is safe because this is the scheduled function */
3621  /* Free the IAX frame */
3622  iax2_frame_free(f);
3623  } else if (callno) {
3624  ast_mutex_unlock(&iaxsl[callno]);
3625  }
3626 }
#define ast_log
Definition: astobj2.c:42
#define AST_CAUSE_DESTINATION_OUT_OF_ORDER
Definition: causes.h:115
static int update_packet(struct iax_frame *f)
Definition: chan_iax2.c:3518
static ast_mutex_t iaxsl[ARRAY_LEN(iaxs)]
chan_iax2_pvt structure locks
Definition: chan_iax2.c:1161
static int send_command(struct chan_iax2_pvt *, char, int, unsigned int, const unsigned char *, int, int)
Definition: chan_iax2.c:7766
static struct @108 frame_queue[IAX_MAX_CALLS]
a list of frames that may need to be retransmitted
static int attempt_transmit(const void *data)
Definition: chan_iax2.c:3628
#define MAX_RETRY_TIME
Definition: chan_iax2.c:657
static void iax2_destroy(int callno)
Definition: chan_iax2.c:3456
static int iax2_sched_add(struct ast_sched_context *sched, int when, ast_sched_cb callback, const void *data)
Definition: chan_iax2.c:1683
static int max_retries
Definition: chan_iax2.c:325
static struct chan_iax2_pvt * iaxs[IAX_MAX_CALLS]
an array of iax2 pvt structures
Definition: chan_iax2.c:1123
static int iax2_queue_frame(int callno, struct ast_frame *f)
Queue a frame to a call's owning asterisk channel.
Definition: chan_iax2.c:3250
static int send_packet(struct iax_frame *f)
Definition: chan_iax2.c:3399
static void iax2_frame_free(struct iax_frame *fr)
Definition: chan_iax2.c:2127
const char * ast_channel_name(const struct ast_channel *chan)
void ast_channel_hangupcause_set(struct ast_channel *chan, int value)
@ IAX_COMMAND_TXREJ
Definition: iax2.h:93
#define IAX_DEFAULT_REG_EXPIRE
Definition: iax2.h:123
@ AST_FRAME_CONTROL
@ AST_CONTROL_HANGUP
#define LOG_WARNING
#define AST_LIST_REMOVE(head, elm, field)
Removes a specific entry from a list.
Definition: linkedlists.h:856
#define ast_mutex_unlock(a)
Definition: lock.h:188
#define ast_mutex_lock(a)
Definition: lock.h:187
static char * ast_sockaddr_stringify_addr(const struct ast_sockaddr *addr)
Wrapper around ast_sockaddr_stringify_fmt() to return an address only.
Definition: netsock2.h:286
#define NULL
Definition: resample.c:96
Data structure associated with a single frame of data.
struct ast_frame_subclass subclass
enum ast_frame_type frametype
struct ast_sockaddr addr
Definition: chan_iax2.c:728
struct ast_channel * owner
Definition: chan_iax2.c:760
struct iax2_registry * reg
Definition: chan_iax2.c:832
enum iax_reg_state regstate
Definition: chan_iax2.c:643
struct ast_sockaddr us
Definition: chan_iax2.c:646
unsigned int final
Definition: parser.h:120
int retrans
Definition: parser.h:130
unsigned int ts
Definition: parser.h:110
void * data
Definition: parser.h:104
unsigned short callno
Definition: parser.h:100
int retries
Definition: parser.h:108
int retrytime
Definition: parser.h:112
unsigned int transfer
Definition: parser.h:118
struct ast_frame af
Definition: parser.h:142
int oseqno
Definition: parser.h:126
Definition: sched.c:76

References chan_iax2_pvt::addr, iax_frame::af, AST_CAUSE_DESTINATION_OUT_OF_ORDER, ast_channel_hangupcause_set(), ast_channel_name(), AST_CONTROL_HANGUP, AST_FRAME_CONTROL, AST_FRAME_IAX, AST_LIST_REMOVE, ast_log, ast_mutex_lock, ast_mutex_unlock, ast_sockaddr_stringify_addr(), attempt_transmit(), iax_frame::callno, iax_frame::data, chan_iax2_pvt::error, iax_frame::final, frame_queue, ast_frame::frametype, iax2_destroy(), iax2_frame_free(), iax2_queue_frame(), iax2_sched_add(), IAX_COMMAND_TXREJ, IAX_DEFAULT_REG_EXPIRE, iaxs, iaxsl, ast_frame_subclass::integer, LOG_WARNING, max_retries, MAX_RETRY_TIME, NULL, iax_frame::oseqno, chan_iax2_pvt::owner, iax2_registry::refresh, chan_iax2_pvt::reg, REG_STATE_TIMEOUT, iax2_registry::regstate, iax_frame::retrans, iax_frame::retries, iax_frame::retrytime, send_command(), send_packet(), ast_frame::subclass, iax_frame::transfer, iax_frame::ts, update_packet(), and iax2_registry::us.

Referenced by attempt_transmit().

◆ __auth_reject()

static void __auth_reject ( const void *  nothing)
static

Definition at line 9340 of file chan_iax2.c.

9341 {
9342  /* Called from IAX thread only, without iaxs lock */
9343  int callno = (int)(long)(nothing);
9344  struct iax_ie_data ied;
9345  ast_mutex_lock(&iaxsl[callno]);
9346  if (iaxs[callno]) {
9347  memset(&ied, 0, sizeof(ied));
9348  if (iaxs[callno]->authfail == IAX_COMMAND_REGREJ) {
9349  iax_ie_append_str(&ied, IAX_IE_CAUSE, "Registration Refused");
9351  } else if (iaxs[callno]->authfail == IAX_COMMAND_REJECT) {
9352  iax_ie_append_str(&ied, IAX_IE_CAUSE, "No authority found");
9354  }
9355  send_command_final(iaxs[callno], AST_FRAME_IAX, iaxs[callno]->authfail, 0, ied.buf, ied.pos, -1);
9356  }
9357  ast_mutex_unlock(&iaxsl[callno]);
9358 }
#define AST_CAUSE_FACILITY_NOT_SUBSCRIBED
Definition: causes.h:126
#define AST_CAUSE_FACILITY_REJECTED
Definition: causes.h:117
static int send_command_final(struct chan_iax2_pvt *, char, int, unsigned int, const unsigned char *, int, int)
Definition: chan_iax2.c:7791
@ IAX_COMMAND_REJECT
Definition: iax2.h:57
@ IAX_COMMAND_REGREJ
Definition: iax2.h:71
#define IAX_IE_CAUSE
Definition: iax2.h:152
#define IAX_IE_CAUSECODE
Definition: iax2.h:172
int iax_ie_append_byte(struct iax_ie_data *ied, unsigned char ie, unsigned char dat)
Definition: parser.c:775
int iax_ie_append_str(struct iax_ie_data *ied, unsigned char ie, const char *str)
Definition: parser.c:770

References AST_CAUSE_FACILITY_NOT_SUBSCRIBED, AST_CAUSE_FACILITY_REJECTED, AST_FRAME_IAX, ast_mutex_lock, ast_mutex_unlock, iax_ie_data::buf, IAX_COMMAND_REGREJ, IAX_COMMAND_REJECT, iax_ie_append_byte(), iax_ie_append_str(), IAX_IE_CAUSE, IAX_IE_CAUSECODE, iaxs, iaxsl, iax_ie_data::pos, and send_command_final().

Referenced by auth_reject().

◆ __auto_congest()

static void __auto_congest ( const void *  nothing)
static

Definition at line 4721 of file chan_iax2.c.

4722 {
4723  int callno = PTR_TO_CALLNO(nothing);
4725  ast_mutex_lock(&iaxsl[callno]);
4726  if (iaxs[callno]) {
4727  iaxs[callno]->initid = -1;
4728  iax2_queue_frame(callno, &f);
4729  ast_log(LOG_NOTICE, "Auto-congesting call due to slow response\n");
4730  }
4731  ast_mutex_unlock(&iaxsl[callno]);
4732 }
#define PTR_TO_CALLNO(a)
Definition: chan_iax2.c:285
@ AST_CONTROL_CONGESTION
#define LOG_NOTICE

References AST_CONTROL_CONGESTION, AST_FRAME_CONTROL, ast_log, ast_mutex_lock, ast_mutex_unlock, iax2_queue_frame(), iaxs, iaxsl, chan_iax2_pvt::initid, LOG_NOTICE, and PTR_TO_CALLNO.

Referenced by auto_congest().

◆ __auto_hangup()

static void __auto_hangup ( const void *  nothing)
static

Definition at line 9389 of file chan_iax2.c.

9390 {
9391  /* Called from IAX thread only, without iaxs lock */
9392  int callno = (int)(long)(nothing);
9393  struct iax_ie_data ied;
9394  ast_mutex_lock(&iaxsl[callno]);
9395  if (iaxs[callno]) {
9396  memset(&ied, 0, sizeof(ied));
9397  iax_ie_append_str(&ied, IAX_IE_CAUSE, "Timeout");
9399  send_command_final(iaxs[callno], AST_FRAME_IAX, IAX_COMMAND_HANGUP, 0, ied.buf, ied.pos, -1);
9400  }
9401  ast_mutex_unlock(&iaxsl[callno]);
9402 }
#define AST_CAUSE_NO_USER_RESPONSE
Definition: causes.h:108
@ IAX_COMMAND_HANGUP
Definition: iax2.h:56

References AST_CAUSE_NO_USER_RESPONSE, AST_FRAME_IAX, ast_mutex_lock, ast_mutex_unlock, iax_ie_data::buf, IAX_COMMAND_HANGUP, iax_ie_append_byte(), iax_ie_append_str(), IAX_IE_CAUSE, IAX_IE_CAUSECODE, iaxs, iaxsl, iax_ie_data::pos, and send_command_final().

Referenced by auto_hangup().

◆ __do_deliver()

static int __do_deliver ( void *  data)
static
Note
This function assumes that iaxsl[callno] is locked when called.
IMPORTANT NOTE!!! Any time this function is used, even if iaxs[callno] was valid before calling it, it may no longer be valid after calling it. This function calls iax2_queue_frame(), which may unlock and lock the mutex associated with this callno, meaning that another thread may grab it and destroy the call.

Definition at line 3337 of file chan_iax2.c.

3338 {
3339  /* Just deliver the packet by using queueing. This is called by
3340  the IAX thread with the iaxsl lock held. */
3341  struct iax_frame *fr = data;
3342  fr->retrans = -1;
3344  if (iaxs[fr->callno] && !ast_test_flag64(iaxs[fr->callno], IAX_ALREADYGONE))
3345  iax2_queue_frame(fr->callno, &fr->af);
3346  /* Free our iax frame */
3347  iax2_frame_free(fr);
3348  /* And don't run again */
3349  return 0;
3350 }
#define IAX_ALREADYGONE
Definition: chan_iax2.c:459
@ AST_FRFLAG_HAS_TIMING_INFO
#define ast_test_flag64(p, flag)
Definition: utils.h:120
#define ast_clear_flag(p, flag)
Definition: utils.h:77

References iax_frame::af, ast_clear_flag, AST_FRFLAG_HAS_TIMING_INFO, ast_test_flag64, iax_frame::callno, iax_frame::data, iax2_frame_free(), iax2_queue_frame(), IAX_ALREADYGONE, iaxs, and iax_frame::retrans.

Referenced by __get_from_jb(), and schedule_delivery().

◆ __expire_registry()

static void __expire_registry ( const void *  data)
static

Definition at line 8956 of file chan_iax2.c.

8957 {
8958  struct iax2_peer *peer = (struct iax2_peer *) data;
8959  RAII_VAR(struct ast_json *, blob, NULL, ast_json_unref);
8960 
8961  if (!peer)
8962  return;
8963  if (peer->expire == -1) {
8964  /* Removed already (possibly through CLI), ignore */
8965  return;
8966  }
8967 
8968  peer->expire = -1;
8969 
8970  ast_debug(1, "Expiring registration for peer '%s'\n", peer->name);
8972  realtime_update_peer(peer->name, &peer->addr, 0);
8974  blob = ast_json_pack("{s: s, s: s}",
8975  "peer_status", "Unregistered",
8976  "cause", "Expired");
8978  /* modify entry in peercnts table as _not_ registered */
8979  peercnt_modify((unsigned char) 0, 0, &peer->addr);
8980  /* Reset the address */
8981  ast_sockaddr_setnull(&peer->addr);
8982  /* Reset expiry value */
8983  peer->expiry = min_reg_expire;
8984  if (!ast_test_flag64(peer, IAX_TEMPONLY))
8985  ast_db_del("IAX/Registry", peer->name);
8986  register_peer_exten(peer, 0);
8987  ast_devstate_changed(AST_DEVICE_UNAVAILABLE, AST_DEVSTATE_CACHABLE, "IAX2/%s", peer->name); /* Activate notification */
8988  if (iax2_regfunk)
8989  iax2_regfunk(peer->name, 0);
8990 
8991  if (ast_test_flag64(peer, IAX_RTAUTOCLEAR))
8992  unlink_peer(peer);
8993 
8994  peer_unref(peer);
8995 }
int ast_db_del(const char *family, const char *key)
Delete entry in astdb.
Definition: main/db.c:429
static void peercnt_modify(unsigned char reg, uint16_t limit, struct ast_sockaddr *sockaddr)
Definition: chan_iax2.c:2600
static int min_reg_expire
Definition: chan_iax2.c:352
static void register_peer_exten(struct iax2_peer *peer, int onoff)
Definition: chan_iax2.c:8918
#define IAX_RTUPDATE
Definition: chan_iax2.c:468
static int(* iax2_regfunk)(const char *username, int onoff)
Definition: chan_iax2.c:363
#define IAX_RTCACHEFRIENDS
Definition: chan_iax2.c:467
static void unlink_peer(struct iax2_peer *peer)
Definition: chan_iax2.c:8937
static struct iax2_peer * peer_unref(struct iax2_peer *peer)
Definition: chan_iax2.c:2025
static struct ast_flags64 globalflags
Definition: chan_iax2.c:434
static void realtime_update_peer(const char *peername, struct ast_sockaddr *sockaddr, time_t regtime)
Definition: chan_iax2.c:4563
#define IAX_RTAUTOCLEAR
Definition: chan_iax2.c:469
#define IAX_TEMPONLY
Definition: chan_iax2.c:452
@ AST_DEVSTATE_CACHABLE
Definition: devicestate.h:70
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.
Definition: devicestate.c:510
@ AST_DEVICE_UNAVAILABLE
Definition: devicestate.h:58
@ AST_ENDPOINT_OFFLINE
Definition: endpoints.h:55
void ast_endpoint_set_state(struct ast_endpoint *endpoint, enum ast_endpoint_state state)
Updates the state of the given endpoint.
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.
struct stasis_message_type * ast_endpoint_state_type(void)
Message type for endpoint state changes.
#define ast_debug(level,...)
Log a DEBUG message.
void ast_json_unref(struct ast_json *value)
Decrease refcount on value. If refcount reaches zero, value is freed.
Definition: json.c:73
struct ast_json * ast_json_pack(char const *format,...)
Helper for creating complex JSON values.
Definition: json.c:591
static void ast_sockaddr_setnull(struct ast_sockaddr *addr)
Sets address addr to null.
Definition: netsock2.h:138
Abstract JSON element (object, array, string, int, ...).
struct ast_sockaddr addr
Definition: chan_iax2.c:554
int expire
Definition: chan_iax2.c:566
struct ast_endpoint * endpoint
Definition: chan_iax2.c:587
int expiry
Definition: chan_iax2.c:567
const ast_string_field name
Definition: chan_iax2.c:551
#define RAII_VAR(vartype, varname, initval, dtor)
Declare a variable that will call a destructor function when it goes out of scope.
Definition: utils.h:936

References iax2_peer::addr, ast_db_del(), ast_debug, AST_DEVICE_UNAVAILABLE, AST_DEVSTATE_CACHABLE, ast_devstate_changed(), ast_endpoint_blob_publish(), AST_ENDPOINT_OFFLINE, ast_endpoint_set_state(), ast_endpoint_state_type(), ast_json_pack(), ast_json_unref(), ast_sockaddr_setnull(), ast_test_flag64, iax2_peer::endpoint, iax2_peer::expire, iax2_peer::expiry, globalflags, iax2_regfunk, IAX_RTAUTOCLEAR, IAX_RTCACHEFRIENDS, IAX_RTUPDATE, IAX_TEMPONLY, min_reg_expire, iax2_peer::name, NULL, peer_unref(), peercnt_modify(), RAII_VAR, realtime_update_peer(), register_peer_exten(), and unlink_peer().

Referenced by expire_registry().

◆ __find_callno()

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
Note
Calling this function while holding another pvt lock can cause a deadlock.

Definition at line 3105 of file chan_iax2.c.

3106 {
3107  int res = 0;
3108  int x;
3109  /* this call is calltoken validated as long as it is either NEW_FORCE
3110  * or NEW_ALLOW_CALLTOKEN_VALIDATED */
3111  int validated = (new > NEW_ALLOW) ? 1 : 0;
3112  char host[80];
3113 
3114  if (new <= NEW_ALLOW) {
3115  if (callno) {
3116  struct chan_iax2_pvt *pvt;
3117  struct chan_iax2_pvt tmp_pvt = {
3118  .callno = dcallno,
3119  .peercallno = callno,
3120  .transfercallno = callno,
3121  /* hack!! */
3122  .frames_received = check_dcallno,
3123  };
3124 
3125  ast_sockaddr_copy(&tmp_pvt.addr, addr);
3126  /* this works for finding normal call numbers not involving transfering */
3127  if ((pvt = ao2_find(iax_peercallno_pvts, &tmp_pvt, OBJ_POINTER))) {
3128  if (return_locked) {
3129  ast_mutex_lock(&iaxsl[pvt->callno]);
3130  }
3131  res = pvt->callno;
3132  ao2_ref(pvt, -1);
3133  pvt = NULL;
3134  return res;
3135  }
3136  /* this searches for transfer call numbers that might not get caught otherwise */
3137  memset(&tmp_pvt.addr, 0, sizeof(tmp_pvt.addr));
3138  ast_sockaddr_copy(&tmp_pvt.transfer, addr);
3139  if ((pvt = ao2_find(iax_transfercallno_pvts, &tmp_pvt, OBJ_POINTER))) {
3140  if (return_locked) {
3141  ast_mutex_lock(&iaxsl[pvt->callno]);
3142  }
3143  res = pvt->callno;
3144  ao2_ref(pvt, -1);
3145  pvt = NULL;
3146  return res;
3147  }
3148  }
3149  /* This will occur on the first response to a message that we initiated,
3150  * such as a PING. */
3151  if (dcallno) {
3152  ast_mutex_lock(&iaxsl[dcallno]);
3153  }
3154  if (callno && dcallno && iaxs[dcallno] && !iaxs[dcallno]->peercallno && match(addr, callno, dcallno, iaxs[dcallno], check_dcallno)) {
3155  iaxs[dcallno]->peercallno = callno;
3156  res = dcallno;
3157  store_by_peercallno(iaxs[dcallno]);
3158  if (!res || !return_locked) {
3159  ast_mutex_unlock(&iaxsl[dcallno]);
3160  }
3161  return res;
3162  }
3163  if (dcallno) {
3164  ast_mutex_unlock(&iaxsl[dcallno]);
3165  }
3166  }
3167  if (!res && (new >= NEW_ALLOW)) {
3169 
3170  /* It may seem odd that we look through the peer list for a name for
3171  * this *incoming* call. Well, it is weird. However, users don't
3172  * have an IP address/port number that we can match against. So,
3173  * this is just checking for a peer that has that IP/port and
3174  * assuming that we have a user of the same name. This isn't always
3175  * correct, but it will be changed if needed after authentication. */
3176  if (!iax2_getpeername(*addr, host, sizeof(host)))
3177  snprintf(host, sizeof(host), "%s", ast_sockaddr_stringify(addr));
3178 
3179  if (peercnt_add(addr)) {
3180  /* This address has hit its callnumber limit. When the limit
3181  * is reached, the connection is not added to the peercnts table.*/
3182  return 0;
3183  }
3184 
3185  if (get_unused_callno(CALLNO_TYPE_NORMAL, validated, &entry)) {
3186  /* since we ran out of space, remove the peercnt
3187  * entry we added earlier */
3189  ast_log(LOG_WARNING, "No more space\n");
3190  return 0;
3191  }
3193  ast_mutex_lock(&iaxsl[x]);
3194 
3195  iaxs[x] = new_iax(addr, host);
3196  if (iaxs[x]) {
3197  if (iaxdebug)
3198  ast_debug(1, "Creating new call structure %d\n", x);
3199  iaxs[x]->callno_entry = entry;
3200  iaxs[x]->sockfd = sockfd;
3202  iaxs[x]->peercallno = callno;
3203  iaxs[x]->callno = x;
3205  iaxs[x]->expiry = min_reg_expire;
3206  iaxs[x]->pingid = iax2_sched_add(sched, ping_time * 1000, send_ping, (void *)(long)x);
3207  iaxs[x]->lagid = iax2_sched_add(sched, lagrq_time * 1000, send_lagrq, (void *)(long)x);
3208  iaxs[x]->amaflags = amaflags;
3214 
3215  if (iaxs[x]->peercallno) {
3217  }
3218  } else {
3219  ast_log(LOG_WARNING, "Out of resources\n");
3220  ast_mutex_unlock(&iaxsl[x]);
3222  return 0;
3223  }
3224  if (!return_locked)
3225  ast_mutex_unlock(&iaxsl[x]);
3226  res = x;
3227  }
3228  return res;
3229 }
#define OBJ_POINTER
Definition: astobj2.h:1150
#define ao2_find(container, arg, flags)
Definition: astobj2.h:1736
#define ao2_ref(o, delta)
Reference/unreference an object and return the old refcount.
Definition: astobj2.h:459
static int send_ping(const void *data)
Definition: chan_iax2.c:1737
static int replace_callno(const void *obj)
Definition: chan_iax2.c:2979
static char default_parkinglot[AST_MAX_CONTEXT]
Definition: chan_iax2.c:315
static int ping_time
Definition: chan_iax2.c:326
#define IAX_NOTRANSFER
Definition: chan_iax2.c:454
static int iax2_getpeername(struct ast_sockaddr addr, char *host, int len)
Definition: chan_iax2.c:2042
#define CALLNO_ENTRY_GET_CALLNO(a)
Definition: chan_iax2.c:905
static struct ao2_container * iax_transfercallno_pvts
Another container of iax2_pvt structures.
Definition: chan_iax2.c:1168
#define IAX_RECVCONNECTEDLINE
Definition: chan_iax2.c:478
static struct chan_iax2_pvt * new_iax(struct ast_sockaddr *addr, const char *host)
Definition: chan_iax2.c:2240
static int match(struct ast_sockaddr *addr, unsigned short callno, unsigned short dcallno, const struct chan_iax2_pvt *cur, int check_dcallno)
Definition: chan_iax2.c:2312
#define IAX_FORCE_ENCRYPT
Definition: chan_iax2.c:479
#define IAX_SENDCONNECTEDLINE
Definition: chan_iax2.c:477
static int get_unused_callno(enum callno_type type, int validated, callno_entry *entry)
Definition: chan_iax2.c:2902
static int send_lagrq(const void *data)
Definition: chan_iax2.c:1801
static int peercnt_add(struct ast_sockaddr *addr)
Definition: chan_iax2.c:2628
#define DEFAULT_RETRY_TIME
Definition: chan_iax2.c:290
static int lagrq_time
Definition: chan_iax2.c:327
static void store_by_peercallno(struct chan_iax2_pvt *pvt)
Definition: chan_iax2.c:2415
static int peercnt_remove_by_addr(struct ast_sockaddr *addr)
Definition: chan_iax2.c:2719
#define CALLNO_ENTRY_TO_PTR(a)
Definition: chan_iax2.c:901
#define IAX_USEJITTERBUF
Definition: chan_iax2.c:455
#define IAX_TRANSFERMEDIA
Definition: chan_iax2.c:472
static int iaxdebug
Definition: chan_iax2.c:413
uint16_t callno_entry
Definition: chan_iax2.c:688
static int amaflags
Definition: chan_iax2.c:428
static char accountcode[AST_MAX_ACCOUNT_CODE]
Definition: chan_iax2.c:425
static char mohsuggest[MAX_MUSICCLASS]
Definition: chan_iax2.c:427
static char mohinterpret[MAX_MUSICCLASS]
Definition: chan_iax2.c:426
static struct ao2_container * iax_peercallno_pvts
Another container of iax2_pvt structures.
Definition: chan_iax2.c:1152
static char parkinglot[AST_MAX_CONTEXT]
Definition: chan_mgcp.c:166
static void ast_sockaddr_copy(struct ast_sockaddr *dst, const struct ast_sockaddr *src)
Copies the data from one ast_sockaddr to another.
Definition: netsock2.h:167
static char * ast_sockaddr_stringify(const struct ast_sockaddr *addr)
Wrapper around ast_sockaddr_stringify_fmt() with default format.
Definition: netsock2.h:256
#define ast_string_field_set(x, field, data)
Set a field to a simple string value.
Definition: stringfields.h:521
unsigned int pingtime
Definition: chan_iax2.c:724
struct ast_sockaddr transfer
Definition: chan_iax2.c:844
unsigned short peercallno
Definition: chan_iax2.c:738
unsigned short callno
Definition: chan_iax2.c:734
const ast_string_field host
Definition: chan_iax2.c:813
callno_entry callno_entry
Definition: chan_iax2.c:736
Definition: search.h:40
#define ast_copy_flags64(dest, src, flagz)
Definition: utils.h:141

References accountcode, chan_iax2_pvt::addr, amaflags, chan_iax2_pvt::amaflags, ao2_find, ao2_ref, ast_copy_flags64, ast_debug, ast_log, ast_mutex_lock, ast_mutex_unlock, ast_sockaddr_copy(), ast_sockaddr_stringify(), ast_string_field_set, chan_iax2_pvt::callno, chan_iax2_pvt::callno_entry, CALLNO_ENTRY_GET_CALLNO, CALLNO_ENTRY_TO_PTR, CALLNO_TYPE_NORMAL, default_parkinglot, DEFAULT_RETRY_TIME, chan_iax2_pvt::expiry, get_unused_callno(), globalflags, chan_iax2_pvt::host, iax2_getpeername(), iax2_sched_add(), IAX_FORCE_ENCRYPT, IAX_NOTRANSFER, iax_peercallno_pvts, IAX_RECVCONNECTEDLINE, IAX_SENDCONNECTEDLINE, iax_transfercallno_pvts, IAX_TRANSFERMEDIA, IAX_USEJITTERBUF, iaxdebug, iaxs, iaxsl, chan_iax2_pvt::lagid, lagrq_time, LOG_WARNING, match(), min_reg_expire, mohinterpret, mohsuggest, NEW_ALLOW, new_iax(), NULL, OBJ_POINTER, parkinglot, chan_iax2_pvt::peercallno, peercnt_add(), peercnt_remove_by_addr(), ping_time, chan_iax2_pvt::pingid, chan_iax2_pvt::pingtime, replace_callno(), send_lagrq(), send_ping(), chan_iax2_pvt::sockfd, store_by_peercallno(), and chan_iax2_pvt::transfer.

Referenced by find_callno(), and find_callno_locked().

◆ __get_from_jb()

static void __get_from_jb ( const void *  p)
static

Definition at line 4122 of file chan_iax2.c.

4123 {
4124  int callno = PTR_TO_CALLNO(p);
4125  struct chan_iax2_pvt *pvt = NULL;
4126  struct iax_frame *fr;
4127  jb_frame frame;
4128  int ret;
4129  long ms;
4130  long next;
4131  struct timeval now = ast_tvnow();
4132  struct ast_format *voicefmt;
4133 
4134  /* Make sure we have a valid private structure before going on */
4135  ast_mutex_lock(&iaxsl[callno]);
4136  pvt = iaxs[callno];
4137  if (!pvt) {
4138  /* No go! */
4139  ast_mutex_unlock(&iaxsl[callno]);
4140  return;
4141  }
4142 
4143  pvt->jbid = -1;
4144 
4145  /* round up a millisecond since ast_sched_runq does; */
4146  /* prevents us from spinning while waiting for our now */
4147  /* to catch up with runq's now */
4148  now.tv_usec += 1000;
4149 
4150  ms = ast_tvdiff_ms(now, pvt->rxcore);
4151 
4153  if (voicefmt && ms >= (next = jb_next(pvt->jb))) {
4154  ret = jb_get(pvt->jb, &frame, ms, ast_format_get_default_ms(voicefmt));
4155  switch(ret) {
4156  case JB_OK:
4157  fr = frame.data;
4158  __do_deliver(fr);
4159  /* __do_deliver() can cause the call to disappear */
4160  pvt = iaxs[callno];
4161  break;
4162  case JB_INTERP:
4163  {
4164  struct ast_frame af = { 0, };
4165 
4166  /* create an interpolation frame */
4168  af.subclass.format = voicefmt;
4169  af.samples = frame.ms * (ast_format_get_sample_rate(voicefmt) / 1000);
4170  af.src = "IAX2 JB interpolation";
4171  af.delivery = ast_tvadd(pvt->rxcore, ast_samp2tv(next, 1000));
4173 
4174  /* queue the frame: For consistency, we would call __do_deliver here, but __do_deliver wants an iax_frame,
4175  * which we'd need to malloc, and then it would free it. That seems like a drag */
4176  if (!ast_test_flag64(iaxs[callno], IAX_ALREADYGONE)) {
4177  iax2_queue_frame(callno, &af);
4178  /* iax2_queue_frame() could cause the call to disappear */
4179  pvt = iaxs[callno];
4180  }
4181  }
4182  break;
4183  case JB_DROP:
4184  iax2_frame_free(frame.data);
4185  break;
4186  case JB_NOFRAME:
4187  case JB_EMPTY:
4188  /* do nothing */
4189  break;
4190  default:
4191  /* shouldn't happen */
4192  break;
4193  }
4194  }
4195  if (pvt)
4196  update_jbsched(pvt);
4197  ast_mutex_unlock(&iaxsl[callno]);
4198 }
static int __do_deliver(void *data)
Definition: chan_iax2.c:3337
static void update_jbsched(struct chan_iax2_pvt *pvt)
Definition: chan_iax2.c:4105
unsigned int ast_format_get_sample_rate(const struct ast_format *format)
Get the sample rate of a media format.
Definition: format.c:379
unsigned int ast_format_get_default_ms(const struct ast_format *format)
Get the default framing size (in milliseconds) for a format.
Definition: format.c:359
struct ast_format * ast_format_compatibility_bitfield2format(uint64_t bitfield)
Convert a bitfield to its respective format structure.
#define AST_FRIENDLY_OFFSET
Offset into a frame's data buffer.
@ AST_FRAME_VOICE
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!...
Definition: jitterbuf.c:785
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...
Definition: jitterbuf.c:767
@ JB_EMPTY
Definition: jitterbuf.h:52
@ JB_DROP
Definition: jitterbuf.h:55
@ JB_NOFRAME
Definition: jitterbuf.h:53
@ JB_INTERP
Definition: jitterbuf.h:54
@ JB_OK
Definition: jitterbuf.h:51
Definition of a media format.
Definition: format.c:43
struct ast_format * format
struct timeval delivery
struct ast_frame * next
const char * src
struct timeval rxcore
Definition: chan_iax2.c:750
iax2_format voiceformat
Definition: chan_iax2.c:700
jitterbuf * jb
Definition: chan_iax2.c:752
struct iax_frame * next
Definition: parser.h:140
long ms
Definition: jitterbuf.h:104
void * data
Definition: jitterbuf.h:102
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 ...
Definition: time.h:245
struct timeval ast_tvadd(struct timeval a, struct timeval b)
Returns the sum of two timevals a + b.
Definition: extconf.c:2282
int64_t ast_tvdiff_ms(struct timeval end, struct timeval start)
Computes the difference (in milliseconds) between two struct timeval instances.
Definition: time.h:105
struct timeval ast_tvnow(void)
Returns current timeval. Meant to replace calls to gettimeofday().
Definition: time.h:157

References __do_deliver(), ast_format_compatibility_bitfield2format(), ast_format_get_default_ms(), ast_format_get_sample_rate(), AST_FRAME_VOICE, AST_FRIENDLY_OFFSET, ast_mutex_lock, ast_mutex_unlock, ast_samp2tv(), ast_test_flag64, ast_tvadd(), ast_tvdiff_ms(), ast_tvnow(), jb_frame::data, ast_frame::delivery, ast_frame_subclass::format, ast_frame::frametype, iax2_frame_free(), iax2_queue_frame(), IAX_ALREADYGONE, iaxs, iaxsl, chan_iax2_pvt::jb, JB_DROP, JB_EMPTY, jb_get(), JB_INTERP, jb_next(), JB_NOFRAME, JB_OK, chan_iax2_pvt::jbid, jb_frame::ms, iax_frame::next, ast_frame::next, NULL, ast_frame::offset, PTR_TO_CALLNO, chan_iax2_pvt::rxcore, ast_frame::samples, ast_frame::src, ast_frame::subclass, update_jbsched(), and chan_iax2_pvt::voiceformat.

Referenced by get_from_jb().

◆ __iax2_do_register_s()

static void __iax2_do_register_s ( const void *  data)
static

Definition at line 8599 of file chan_iax2.c.

8600 {
8601  struct iax2_registry *reg = (struct iax2_registry *)data;
8602 
8603  if (ast_sockaddr_isnull(&reg->addr)) {
8604  reg->addr.ss.ss_family = AST_AF_UNSPEC;
8605  ast_dnsmgr_lookup(reg->hostname, &reg->addr, &reg->dnsmgr, srvlookup ? "_iax._udp" : NULL);
8606  if (!ast_sockaddr_port(&reg->addr)) {
8607  ast_sockaddr_set_port(&reg->addr, reg->port);
8608  } else {
8609  reg->port = ast_sockaddr_port(&reg->addr);
8610  }
8611  }
8612 
8613  reg->expire = -1;
8614  iax2_do_register(reg);
8615 }
static int iax2_do_register(struct iax2_registry *reg)
Definition: chan_iax2.c:12210
static int srvlookup
Definition: chan_iax2.c:355
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.
Definition: dnsmgr.c:191
@ AST_AF_UNSPEC
Definition: netsock2.h:54
#define ast_sockaddr_port(addr)
Get the port number of a socket address.
Definition: netsock2.h:517
static int ast_sockaddr_isnull(const struct ast_sockaddr *addr)
Checks if the ast_sockaddr is null. "null" in this sense essentially means uninitialized,...
Definition: netsock2.h:127
#define ast_sockaddr_set_port(addr, port)
Sets the port number of a socket address.
Definition: netsock2.h:532
struct sockaddr_storage ss
Definition: netsock2.h:98
struct ast_sockaddr addr
Definition: chan_iax2.c:638
struct ast_dnsmgr_entry * dnsmgr
Definition: chan_iax2.c:647
char hostname[]
Definition: chan_iax2.c:650

References iax2_registry::addr, AST_AF_UNSPEC, ast_dnsmgr_lookup(), ast_sockaddr_isnull(), ast_sockaddr_port, ast_sockaddr_set_port, iax2_registry::dnsmgr, iax2_registry::expire, iax2_registry::hostname, iax2_do_register(), NULL, iax2_registry::port, srvlookup, and ast_sockaddr::ss.

Referenced by iax2_do_register_s().

◆ __iax2_poke_noanswer()

static void __iax2_poke_noanswer ( const void *  data)
static

Definition at line 12391 of file chan_iax2.c.

12392 {
12393  struct iax2_peer *peer = (struct iax2_peer *)data;
12394  int callno;
12395 
12396  if (peer->lastms > -1) {
12397  RAII_VAR(struct ast_json *, blob, NULL, ast_json_unref);
12398 
12399  ast_log(LOG_NOTICE, "Peer '%s' is now UNREACHABLE! Time: %d\n", peer->name, peer->lastms);
12401  blob = ast_json_pack("{s: s, s: i}",
12402  "peer_status", "Unreachable",
12403  "time", peer->lastms);
12405  ast_devstate_changed(AST_DEVICE_UNAVAILABLE, AST_DEVSTATE_CACHABLE, "IAX2/%s", peer->name); /* Activate notification */
12406  }
12407  if ((callno = peer->callno) > 0) {
12411  }
12412  peer->callno = 0;
12413  peer->lastms = -1;
12414  /* Try again quickly */
12416  if (peer->pokeexpire == -1)
12417  peer_unref(peer);
12418 }
static int iax2_poke_peer_s(const void *data)
Definition: chan_iax2.c:9456
static struct iax2_peer * peer_ref(struct iax2_peer *peer)
Definition: chan_iax2.c:2019
int callno
Definition: chan_iax2.c:571
int pokefreqnotok
Definition: chan_iax2.c:577
int lastms
Definition: chan_iax2.c:573
int pokeexpire
Definition: chan_iax2.c:572

References AST_DEVICE_UNAVAILABLE, AST_DEVSTATE_CACHABLE, ast_devstate_changed(), ast_endpoint_blob_publish(), AST_ENDPOINT_OFFLINE, ast_endpoint_set_state(), ast_endpoint_state_type(), ast_json_pack(), ast_json_unref(), ast_log, ast_mutex_lock, ast_mutex_unlock, iax2_peer::callno, iax2_peer::endpoint, iax2_destroy(), iax2_poke_peer_s(), iax2_sched_add(), iaxsl, iax2_peer::lastms, LOG_NOTICE, iax2_peer::name, NULL, peer_ref(), peer_unref(), iax2_peer::pokeexpire, iax2_peer::pokefreqnotok, and RAII_VAR.

Referenced by iax2_poke_noanswer().

◆ __iax2_poke_peer_s()

static void __iax2_poke_peer_s ( const void *  data)
static

Definition at line 9449 of file chan_iax2.c.

9450 {
9451  struct iax2_peer *peer = (struct iax2_peer *)data;
9452  iax2_poke_peer(peer, 0);
9453  peer_unref(peer);
9454 }
static int iax2_poke_peer(struct iax2_peer *peer, int heldcall)
Definition: chan_iax2.c:12441

References iax2_poke_peer(), and peer_unref().

Referenced by iax2_poke_peer_s().

◆ __iax2_show_peers()

static int __iax2_show_peers ( int  fd,
int *  total,
struct mansession s,
const int  argc,
const char *const  argv[] 
)
static

Definition at line 6981 of file chan_iax2.c.

6982 {
6983  struct show_peers_context cont = {
6984  .havepattern = 0,
6985  .idtext = "",
6986  .registeredonly = 0,
6987 
6988  .peerlist = 0,
6989 
6990  .total_peers = 0,
6991  .online_peers = 0,
6992  .offline_peers = 0,
6993  .unmonitored_peers = 0,
6994  };
6995 
6996  struct ao2_iterator i;
6997 
6998  struct iax2_peer *peer = NULL;
6999 
7000  switch (argc) {
7001  case 6:
7002  if (!strcasecmp(argv[3], "registered"))
7003  cont.registeredonly = 1;
7004  else
7005  return RESULT_SHOWUSAGE;
7006  if (!strcasecmp(argv[4], "like")) {
7007  if (regcomp(&cont.regexbuf, argv[5], REG_EXTENDED | REG_NOSUB))
7008  return RESULT_SHOWUSAGE;
7009  cont.havepattern = 1;
7010  } else
7011  return RESULT_SHOWUSAGE;
7012  break;
7013  case 5:
7014  if (!strcasecmp(argv[3], "like")) {
7015  if (regcomp(&cont.regexbuf, argv[4], REG_EXTENDED | REG_NOSUB))
7016  return RESULT_SHOWUSAGE;
7017  cont.havepattern = 1;
7018  } else
7019  return RESULT_SHOWUSAGE;
7020  break;
7021  case 4:
7022  if (!strcasecmp(argv[3], "registered")) {
7023  cont.registeredonly = 1;
7024  } else {
7025  return RESULT_SHOWUSAGE;
7026  }
7027  break;
7028  case 3:
7029  break;
7030  default:
7031  return RESULT_SHOWUSAGE;
7032  }
7033 
7034 
7035  if (!s) {
7036  ast_cli(fd, PEERS_FORMAT2, "Name/Username", "Host", " ", "Mask", "Port", " ", "Status", "Description");
7037  }
7038 
7039  i = ao2_iterator_init(peers, 0);
7040  for (; (peer = ao2_iterator_next(&i)); peer_unref(peer)) {
7041 
7042  if (cont.registeredonly && ast_sockaddr_isnull(&peer->addr)) {
7043  continue;
7044  }
7045  if (cont.havepattern && regexec(&cont.regexbuf, peer->name, 0, NULL, 0)) {
7046  continue;
7047  }
7048 
7049  _iax2_show_peers_one(fd, s, &cont, peer);
7050 
7051  }
7053 
7054  if (!s) {
7055  ast_cli(fd,"%d iax2 peers [%d online, %d offline, %d unmonitored]\n",
7056  cont.total_peers, cont.online_peers, cont.offline_peers, cont.unmonitored_peers);
7057  }
7058 
7059  if (cont.havepattern) {
7060  regfree(&cont.regexbuf);
7061  }
7062 
7063  if (total) {
7064  *total = cont.total_peers;
7065  }
7066 
7067  return RESULT_SUCCESS;
7068 
7069 }
#define ao2_iterator_next(iter)
Definition: astobj2.h:1911
struct ao2_iterator ao2_iterator_init(struct ao2_container *c, int flags) attribute_warn_unused_result
Create an iterator for a container.
void ao2_iterator_destroy(struct ao2_iterator *iter)
Destroy a container iterator.
#define PEERS_FORMAT2
Definition: chan_iax2.c:6877
static void _iax2_show_peers_one(int fd, struct mansession *s, struct show_peers_context *cont, struct iax2_peer *peer)
Definition: chan_iax2.c:6880
#define RESULT_SHOWUSAGE
Definition: cli.h:41
void ast_cli(int fd, const char *fmt,...)
Definition: clicompat.c:6
#define RESULT_SUCCESS
Definition: cli.h:40
static int total
Definition: res_adsi.c:968
When we need to walk through a container, we use an ao2_iterator to keep track of the current positio...
Definition: astobj2.h:1821
Used in the sip_show_peers functions to pass parameters.
Definition: chan_iax2.c:6865

References _iax2_show_peers_one(), iax2_peer::addr, ao2_iterator_destroy(), ao2_iterator_init(), ao2_iterator_next, ast_cli(), ast_sockaddr_isnull(), show_peers_context::havepattern, iax2_peer::name, NULL, show_peers_context::offline_peers, show_peers_context::online_peers, peer_unref(), PEERS_FORMAT2, show_peers_context::regexbuf, show_peers_context::registeredonly, RESULT_SHOWUSAGE, RESULT_SUCCESS, total, show_peers_context::total_peers, and show_peers_context::unmonitored_peers.

Referenced by handle_cli_iax2_show_peers(), and manager_iax2_show_peers().

◆ __reg_module()

static void __reg_module ( void  )
static

Definition at line 15050 of file chan_iax2.c.

◆ __schedule_action()

static int __schedule_action ( void(*)(const void *data)  func,
const void *  data,
const char *  funcname 
)
static

Definition at line 1649 of file chan_iax2.c.

1650 {
1651  struct iax2_thread *thread;
1652  static time_t lasterror;
1653  time_t t;
1654 
1656  if (thread != NULL) {
1657  thread->schedfunc = func;
1658  thread->scheddata = data;
1659  thread->iostate = IAX_IOSTATE_SCHEDREADY;
1660 #ifdef DEBUG_SCHED_MULTITHREAD
1661  ast_copy_string(thread->curfunc, funcname, sizeof(thread->curfunc));
1662 #endif
1663  signal_condition(&thread->lock, &thread->cond);
1664  return 0;
1665  }
1666  time(&t);
1667  if (t != lasterror) {
1668  lasterror = t;
1669  ast_debug(1, "Out of idle IAX2 threads for scheduling! (%s)\n", funcname);
1670  }
1671 
1672  return -1;
1673 }
pthread_t thread
Definition: app_meetme.c:1091
static void signal_condition(ast_mutex_t *lock, ast_cond_t *cond)
Definition: chan_iax2.c:1108
static struct iax2_thread * find_idle_thread(void)
Definition: chan_iax2.c:1582
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition: strings.h:406

References ast_copy_string(), ast_debug, find_idle_thread(), IAX_IOSTATE_SCHEDREADY, NULL, signal_condition(), and thread.

◆ __send_command()

static int __send_command ( struct chan_iax2_pvt i,
char  type,
int  command,
unsigned int  ts,
const unsigned char *  data,
int  datalen,
int  seqno,
int  now,
int  transfer,
int  final 
)
static

Definition at line 7747 of file chan_iax2.c.

7749 {
7750  struct ast_frame f = { 0, };
7751  int res = 0;
7752 
7753  f.frametype = type;
7754  f.subclass.integer = command;
7755  f.datalen = datalen;
7756  f.src = __FUNCTION__;
7757  f.data.ptr = (void *) data;
7758 
7759  if ((res = queue_signalling(i, &f)) <= 0) {
7760  return res;
7761  }
7762 
7763  return iax2_send(i, &f, ts, seqno, now, transfer, final);
7764 }
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...
Definition: chan_iax2.c:2168
static int iax2_send(struct chan_iax2_pvt *pvt, struct ast_frame *f, unsigned int ts, int seqno, int now, int transfer, int final)
Definition: chan_iax2.c:6578
static int transfer
Definition: chan_mgcp.c:197
static const char type[]
Definition: chan_ooh323.c:109
union ast_frame::@254 data

References ast_frame::data, ast_frame::datalen, ast_frame::frametype, iax2_send(), ast_frame_subclass::integer, ast_frame::ptr, queue_signalling(), ast_frame::seqno, ast_frame::src, ast_frame::subclass, transfer, ast_frame::ts, and type.

Referenced by send_command(), send_command_final(), send_command_immediate(), and send_command_transfer().

◆ __send_lagrq()

static void __send_lagrq ( const void *  data)
static

Definition at line 1777 of file chan_iax2.c.

1778 {
1779  int callno = PTR_TO_CALLNO(data);
1780 
1781  if (iax2_lock_callno_unless_destroyed(callno) == 0) {
1782  ast_debug(3, "Hangup initiated on call %d, aborting __send_lagrq\n", callno);
1783  return;
1784  }
1785 
1786  /* Mark lagid as invalid scheduler id. */
1787  iaxs[callno]->lagid = -1;
1788 
1789  /* callno is now locked. */
1790  if (iaxs[callno]->peercallno) {
1791  /* Send LAGRQ packet. */
1792  send_command(iaxs[callno], AST_FRAME_IAX, IAX_COMMAND_LAGRQ, 0, NULL, 0, -1);
1793 
1794  /* Schedule sending next lagrq. */
1795  iaxs[callno]->lagid = iax2_sched_add(sched, lagrq_time * 1000, send_lagrq, data);
1796  }
1797 
1798  ast_mutex_unlock(&iaxsl[callno]);
1799 }
static int iax2_lock_callno_unless_destroyed(int callno)
Acquire the iaxsl[callno] if call exists and not having ongoing hangup.
Definition: chan_iax2.c:1695
@ IAX_COMMAND_LAGRQ
Definition: iax2.h:62

References ast_debug, AST_FRAME_IAX, ast_mutex_unlock, iax2_thread::callno, iax2_lock_callno_unless_destroyed(), iax2_sched_add(), IAX_COMMAND_LAGRQ, iaxs, iaxsl, chan_iax2_pvt::lagid, lagrq_time, NULL, PTR_TO_CALLNO, send_command(), and send_lagrq().

Referenced by send_lagrq().

◆ __send_ping()

static void __send_ping ( const void *  data)
static

Definition at line 1713 of file chan_iax2.c.

1714 {
1715  int callno = PTR_TO_CALLNO(data);
1716 
1717  if (iax2_lock_callno_unless_destroyed(callno) == 0) {
1718  ast_debug(3, "Hangup initiated on call %d, aborting __send_ping\n", callno);
1719  return;
1720  }
1721 
1722  /* Mark pingid as invalid scheduler id. */
1723  iaxs[callno]->pingid = -1;
1724 
1725  /* callno is now locked. */
1726  if (iaxs[callno]->peercallno) {
1727  /* Send PING packet. */
1728  send_command(iaxs[callno], AST_FRAME_IAX, IAX_COMMAND_PING, 0, NULL, 0, -1);
1729 
1730  /* Schedule sending next ping. */
1731  iaxs[callno]->pingid = iax2_sched_add(sched, ping_time * 1000, send_ping, data);
1732  }
1733 
1734  ast_mutex_unlock(&iaxsl[callno]);
1735 }
@ IAX_COMMAND_PING
Definition: iax2.h:53

References ast_debug, AST_FRAME_IAX, ast_mutex_unlock, iax2_thread::callno, iax2_lock_callno_unless_destroyed(), iax2_sched_add(), IAX_COMMAND_PING, iaxs, iaxsl, NULL, ping_time, chan_iax2_pvt::pingid, PTR_TO_CALLNO, send_command(), and send_ping().

Referenced by send_ping().

◆ __unload_module()

static int __unload_module ( void  )
static

Definition at line 14677 of file chan_iax2.c.

14678 {
14679  int x;
14680 
14683 
14684  ast_manager_unregister("IAXpeers");
14685  ast_manager_unregister("IAXpeerlist");
14686  ast_manager_unregister("IAXnetstats");
14687  ast_manager_unregister("IAXregistry");
14692 
14693  if (netthreadid != AST_PTHREADT_NULL) {
14694  pthread_cancel(netthreadid);
14695  pthread_kill(netthreadid, SIGURG);
14696  pthread_join(netthreadid, NULL);
14697  }
14698 
14699  for (x = 0; x < ARRAY_LEN(iaxs); x++) {
14700  if (iaxs[x]) {
14701  iax2_destroy(x);
14702  }
14703  }
14704 
14705  /* Call for all threads to halt */
14709 
14712  for (x = 0; x < ARRAY_LEN(iaxs); x++) {
14713  if (iaxs[x]) {
14714  iax2_destroy(x);
14715  }
14716  }
14717  ast_manager_unregister( "IAXpeers" );
14718  ast_manager_unregister( "IAXpeerlist" );
14719  ast_manager_unregister( "IAXnetstats" );
14720  ast_manager_unregister( "IAXregistry" );
14725  delete_users();
14728 
14729  for (x = 0; x < ARRAY_LEN(iaxsl); x++) {
14730  ast_mutex_destroy(&iaxsl[x]);
14731  }
14732 
14733  ao2_ref(peers, -1);
14734  ao2_ref(users, -1);
14737  ao2_ref(callno_limits, -1);
14739  if (timer) {
14741  timer = NULL;
14742  }
14744 
14747  sched = NULL;
14748  ao2_ref(peercnts, -1);
14749 
14751  ast_unload_realtime("iaxpeers");
14752 
14755  return 0;
14756 }
static struct ao2_container * peercnts
Definition: chan_iax2.c:956
static struct ast_channel_tech iax2_tech
Definition: chan_iax2.c:1291
static int peercnt_remove_cb(const void *obj)
Definition: chan_iax2.c:2705
static char regcontext[AST_MAX_CONTEXT]
Definition: chan_iax2.c:318
static struct ao2_container * callno_limits
Definition: chan_iax2.c:959
static struct ast_netsock_list * netsock
Definition: chan_iax2.c:359
static struct ast_netsock_list * outsock
Definition: chan_iax2.c:360
static void acl_change_stasis_unsubscribe(void)
Definition: chan_iax2.c:1476
static struct ast_switch iax2_switch
Definition: chan_iax2.c:14619
static char * papp
Definition: chan_iax2.c:12318
static struct ast_taskprocessor * transmit_processor
Definition: chan_iax2.c:932
static struct ast_timer * timer
Definition: chan_iax2.c:357
static pthread_t netthreadid
Definition: chan_iax2.c:436
static void network_change_stasis_unsubscribe(void)
Definition: chan_iax2.c:1461
static struct ao2_container * calltoken_ignores
Definition: chan_iax2.c:962
static void delete_users(void)
Definition: chan_iax2.c:13475
static void cleanup_thread_list(void *head)
Definition: chan_iax2.c:14657
static struct ast_cli_entry cli_iax2[]
Definition: chan_iax2.c:14629
void ast_channel_unregister(const struct ast_channel_tech *tech)
Unregister a channel technology.
Definition: channel.c:570
int ast_cli_unregister_multiple(struct ast_cli_entry *e, int len)
Unregister multiple commands.
Definition: clicompat.c:30
void iax_firmware_unload(void)
Definition: firmware.c:250
int ast_manager_unregister(const char *action)
Unregister a registered manager command.
Definition: manager.c:7268
int ast_unload_realtime(const char *family)
Release any resources cached for a realtime family.
Definition: main/config.c:3475
#define AST_PTHREADT_NULL
Definition: lock.h:66
#define ast_mutex_destroy(a)
Definition: lock.h:186
int ast_unregister_application(const char *app)
Unregister an application.
Definition: pbx_app.c:392
int ast_netsock_release(struct ast_netsock_list *list)
Definition: netsock.c:85
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.
Definition: pbx_switch.c:76
int iax_provision_unload(void)
Definition: provision.c:517
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.
Definition: sched.c:409
void ast_sched_context_destroy(struct ast_sched_context *c)
destroys a schedule context
Definition: sched.c:271
struct ast_format_cap * capabilities
Definition: channel.h:632
list of users found in the config file
void * ast_taskprocessor_unreference(struct ast_taskprocessor *tps)
Unreference the specified taskprocessor and its reference count will decrement.
void ast_timer_close(struct ast_timer *handle)
Close an opened timing handle.
Definition: timing.c:154
#define ARRAY_LEN(a)
Definition: utils.h:661

References acl_change_stasis_unsubscribe(), ao2_ref, ARRAY_LEN, ast_channel_unregister(), ast_cli_unregister_multiple(), ast_context_destroy_by_name(), ast_manager_unregister(), ast_mutex_destroy, ast_netsock_release(), AST_PTHREADT_NULL, ast_sched_clean_by_callback(), ast_sched_context_destroy(), ast_taskprocessor_unreference(), ast_timer_close(), ast_unload_realtime(), ast_unregister_application(), ast_unregister_switch(), callno_limits, calltoken_ignores, ast_channel_tech::capabilities, cleanup_thread_list(), cli_iax2, delete_users(), iax2_destroy(), iax2_switch, iax2_tech, iax_firmware_unload(), iax_peercallno_pvts, iax_provision_unload(), iax_transfercallno_pvts, iaxs, iaxsl, netsock, netthreadid, network_change_stasis_unsubscribe(), NULL, outsock, papp, peercnt_remove_cb(), peercnts, regcontext, timer, and transmit_processor.

Referenced by unload_module().

◆ __unreg_module()

static void __unreg_module ( void  )
static

Definition at line 15050 of file chan_iax2.c.

◆ _iax2_show_peers_one()

static void _iax2_show_peers_one ( int  fd,
struct mansession s,
struct show_peers_context cont,
struct iax2_peer peer 
)
static

Definition at line 6880 of file chan_iax2.c.

6881 {
6882  char name[256] = "";
6883  char status[64];
6884  int retstatus;
6885  struct ast_str *encmethods = ast_str_alloca(256);
6886 
6887  char *tmp_host, *tmp_mask, *tmp_port;
6888 
6889  tmp_host = ast_strdupa(ast_sockaddr_stringify_addr(&peer->addr));
6890  tmp_mask = ast_strdupa(ast_sockaddr_stringify_addr(&peer->mask));
6891  tmp_port = ast_strdupa(ast_sockaddr_stringify_port(&peer->addr));
6892 
6893  if (!ast_strlen_zero(peer->username)) {
6894  snprintf(name, sizeof(name), "%s/%s", peer->name, peer->username);
6895  } else {
6896  ast_copy_string(name, peer->name, sizeof(name));
6897  }
6898 
6899  encmethods_to_str(peer->encmethods, &encmethods);
6900  retstatus = peer_status(peer, status, sizeof(status));
6901  if (retstatus > 0) {
6902  cont->online_peers++;
6903  } else if (!retstatus) {
6904  cont->offline_peers++;
6905  } else {
6906  cont->unmonitored_peers++;
6907  }
6908 
6909  if (s) {
6910  if (cont->peerlist) { /* IAXpeerlist */
6911  astman_append(s,
6912  "Event: PeerEntry\r\n%s"
6913  "Channeltype: IAX\r\n",
6914  cont->idtext);
6915  if (!ast_strlen_zero(peer->username)) {
6916  astman_append(s,
6917  "ObjectName: %s\r\n"
6918  "ObjectUsername: %s\r\n",
6919  peer->name,
6920  peer->username);
6921  } else {
6922  astman_append(s,
6923  "ObjectName: %s\r\n",
6924  name);
6925  }
6926  } else { /* IAXpeers */
6927  astman_append(s,
6928  "Event: PeerEntry\r\n%s"
6929  "Channeltype: IAX2\r\n"
6930  "ObjectName: %s\r\n",
6931  cont->idtext,
6932  name);
6933  }
6934  astman_append(s,
6935  "ChanObjectType: peer\r\n"
6936  "IPaddress: %s\r\n",
6937  tmp_host);
6938  if (cont->peerlist) { /* IAXpeerlist */
6939  astman_append(s,
6940  "Mask: %s\r\n"
6941  "Port: %s\r\n",
6942  tmp_mask,
6943  tmp_port);
6944  } else { /* IAXpeers */
6945  astman_append(s,
6946  "IPport: %s\r\n",
6947  tmp_port);
6948  }
6949  astman_append(s,
6950  "Dynamic: %s\r\n"
6951  "Trunk: %s\r\n"
6952  "Encryption: %s\r\n"
6953  "Status: %s\r\n",
6954  ast_test_flag64(peer, IAX_DYNAMIC) ? "yes" : "no",
6955  ast_test_flag64(peer, IAX_TRUNK) ? "yes" : "no",
6956  peer->encmethods ? ast_str_buffer(encmethods) : "no",
6957  status);
6958  if (cont->peerlist) { /* IAXpeerlist */
6959  astman_append(s, "\r\n");
6960  } else { /* IAXpeers */
6961  astman_append(s,
6962  "Description: %s\r\n\r\n",
6963  peer->description);
6964  }
6965  } else {
6966  ast_cli(fd, PEERS_FORMAT,
6967  name,
6968  tmp_host,
6969  ast_test_flag64(peer, IAX_DYNAMIC) ? "(D)" : "(S)",
6970  tmp_mask,
6971  tmp_port,
6972  ast_test_flag64(peer, IAX_TRUNK) ? "(T)" : " ",
6973  peer->encmethods ? "(E)" : " ",
6974  status,
6975  peer->description);
6976  }
6977 
6978  cont->total_peers++;
6979 }
jack_status_t status
Definition: app_jack.c:146
#define ast_strdupa(s)
duplicate a string in memory from the stack
Definition: astmm.h:298
#define IAX_TRUNK
Definition: chan_iax2.c:453
static void encmethods_to_str(int e, struct ast_str **buf)
Definition: chan_iax2.c:1747
static int peer_status(struct iax2_peer *peer, char *status, int statuslen)
peer_status: Report Peer status in character string
Definition: chan_iax2.c:3789
#define IAX_DYNAMIC
Definition: chan_iax2.c:456
#define PEERS_FORMAT
Definition: chan_iax2.c:6878
static const char name[]
Definition: format_mp3.c:68
void astman_append(struct mansession *s, const char *fmt,...)
Definition: manager.c:3087
static char * ast_sockaddr_stringify_port(const struct ast_sockaddr *addr)
Wrapper around ast_sockaddr_stringify_fmt() to return a port only.
Definition: netsock2.h:358
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition: strings.h:739
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition: strings.h:65
#define ast_str_alloca(init_len)
Definition: strings.h:826
Support for dynamic strings.
Definition: strings.h:604
const ast_string_field username
Definition: chan_iax2.c:551
const ast_string_field description
Definition: chan_iax2.c:551
struct ast_sockaddr mask
Definition: chan_iax2.c:557
int encmethods
Definition: chan_iax2.c:564
char idtext[256]
Definition: chan_iax2.c:6868

References iax2_peer::addr, ast_cli(), ast_copy_string(), ast_sockaddr_stringify_addr(), ast_sockaddr_stringify_port(), ast_str_alloca, ast_str_buffer(), ast_strdupa, ast_strlen_zero(), ast_test_flag64, astman_append(), iax2_peer::description, iax2_peer::encmethods, encmethods_to_str(), IAX_DYNAMIC, IAX_TRUNK, show_peers_context::idtext, iax2_peer::mask, name, iax2_peer::name, show_peers_context::offline_peers, show_peers_context::online_peers, peer_status(), show_peers_context::peerlist, PEERS_FORMAT, status, show_peers_context::total_peers, show_peers_context::unmonitored_peers, and iax2_peer::username.

Referenced by __iax2_show_peers(), and manager_iax2_show_peer_list().

◆ acf_channel_read()

static int acf_channel_read ( struct ast_channel chan,
const char *  funcname,
char *  preparse,
char *  buf,
size_t  buflen 
)
static

Definition at line 14543 of file chan_iax2.c.

14544 {
14545  struct chan_iax2_pvt *pvt;
14546  unsigned int callno;
14547  int res = 0;
14548 
14549  if (!chan || ast_channel_tech(chan) != &iax2_tech) {
14550  ast_log(LOG_ERROR, "This function requires a valid IAX2 channel\n");
14551  return -1;
14552  }
14553 
14556  if (!(pvt = iaxs[callno])) {
14558  return -1;
14559  }
14560 
14561  if (!strcasecmp(args, "osptoken")) {
14562  ast_copy_string(buf, pvt->osptoken, buflen);
14563  } else if (!strcasecmp(args, "peerip")) {
14565  } else if (!strcasecmp(args, "peername")) {
14566  ast_copy_string(buf, pvt->username, buflen);
14567  } else if (!strcasecmp(args, "secure_signaling") || !strcasecmp(args, "secure_media")) {
14568  snprintf(buf, buflen, "%s", IAX_CALLENCRYPTED(pvt) ? "1" : "");
14569  } else {
14570  res = -1;
14571  }
14572 
14574 
14575  return res;
14576 }
#define IAX_CALLENCRYPTED(pvt)
Definition: chan_iax2.c:392
void * ast_channel_tech_pvt(const struct ast_channel *chan)
const struct ast_channel_tech * ast_channel_tech(const struct ast_channel *chan)
char buf[BUFSIZE]
Definition: eagi_proxy.c:66
#define LOG_ERROR
const ast_string_field username
Definition: chan_iax2.c:813
const ast_string_field osptoken
Definition: chan_iax2.c:813
const char * args

References chan_iax2_pvt::addr, args, ast_channel_tech(), ast_channel_tech_pvt(), ast_copy_string(), ast_log, ast_mutex_lock, ast_mutex_unlock, ast_sockaddr_isnull(), ast_sockaddr_stringify_addr(), buf, chan_iax2_pvt::callno, iax2_tech, IAX_CALLENCRYPTED, iaxs, iaxsl, LOG_ERROR, chan_iax2_pvt::osptoken, PTR_TO_CALLNO, and chan_iax2_pvt::username.

◆ acf_iaxvar_read()

static int acf_iaxvar_read ( struct ast_channel chan,
const char *  cmd,
char *  data,
char *  buf,
size_t  len 
)
static

Definition at line 10035 of file chan_iax2.c.

10036 {
10037  struct ast_datastore *variablestore;
10038  AST_LIST_HEAD(, ast_var_t) *varlist;
10039  struct ast_var_t *var;
10040 
10041  if (!chan) {
10042  ast_log(LOG_WARNING, "No channel was provided to %s function.\n", cmd);
10043  return -1;
10044  }
10045 
10047  if (!variablestore) {
10048  *buf = '\0';
10049  return 0;
10050  }
10051  varlist = variablestore->data;
10052 
10053  AST_LIST_LOCK(varlist);
10054  AST_LIST_TRAVERSE(varlist, var, entries) {
10055  if (strcmp(var->name, data) == 0) {
10056  ast_copy_string(buf, var->value, len);
10057  break;
10058  }
10059  }
10060  AST_LIST_UNLOCK(varlist);
10061  return 0;
10062 }
#define var
Definition: ast_expr2f.c:614
static const struct ast_datastore_info iax2_variable_datastore_info
Definition: chan_iax2.c:1519
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.
Definition: channel.c:2398
static int len(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)
#define AST_LIST_TRAVERSE(head, var, field)
Loops over (traverses) the entries in a list.
Definition: linkedlists.h:491
#define AST_LIST_LOCK(head)
Locks a list.
Definition: linkedlists.h:40
#define AST_LIST_UNLOCK(head)
Attempts to unlock a list.
Definition: linkedlists.h:140
#define AST_LIST_HEAD(name, type)
Defines a structure to be used to hold a list of specified type.
Definition: linkedlists.h:173
Structure for a data store object.
Definition: datastore.h:64
void * data
Definition: datastore.h:66
struct ast_var_t::@239 entries

References ast_channel_datastore_find(), ast_copy_string(), AST_LIST_HEAD, AST_LIST_LOCK, AST_LIST_TRAVERSE, AST_LIST_UNLOCK, ast_log, buf, ast_datastore::data, ast_var_t::entries, iax2_variable_datastore_info, len(), LOG_WARNING, NULL, and var.

◆ acf_iaxvar_write()

static int acf_iaxvar_write ( struct ast_channel chan,
const char *  cmd,
char *  data,
const char *  value 
)
static

Definition at line 10064 of file chan_iax2.c.

10065 {
10066  struct ast_datastore *variablestore;
10067  AST_LIST_HEAD(, ast_var_t) *varlist;
10068  struct ast_var_t *var;
10069 
10070  if (!chan) {
10071  ast_log(LOG_WARNING, "No channel was provided to %s function.\n", cmd);
10072  return -1;
10073  }
10074 
10076  if (!variablestore) {
10078  if (!variablestore) {
10079  ast_log(LOG_ERROR, "Memory allocation error\n");
10080  return -1;
10081  }
10082  varlist = ast_calloc(1, sizeof(*varlist));
10083  if (!varlist) {
10084  ast_datastore_free(variablestore);
10085  ast_log(LOG_ERROR, "Unable to assign new variable '%s'\n", data);
10086  return -1;
10087  }
10088 
10089  AST_LIST_HEAD_INIT(varlist);
10090  variablestore->data = varlist;
10091  variablestore->inheritance = DATASTORE_INHERIT_FOREVER;
10092  ast_channel_datastore_add(chan, variablestore);
10093  } else
10094  varlist = variablestore->data;
10095 
10096  AST_LIST_LOCK(varlist);
10098  if (strcmp(var->name, data) == 0) {
10101  break;
10102  }
10103  }
10105  var = ast_var_assign(data, value);
10106  if (var)
10107  AST_LIST_INSERT_TAIL(varlist, var, entries);
10108  else
10109  ast_log(LOG_ERROR, "Unable to assign new variable '%s'\n", data);
10110  AST_LIST_UNLOCK(varlist);
10111  return 0;
10112 }
#define ast_calloc(num, len)
A wrapper for calloc()
Definition: astmm.h:202
int ast_channel_datastore_add(struct ast_channel *chan, struct ast_datastore *datastore)
Add a datastore to a channel.
Definition: channel.c:2384
#define DATASTORE_INHERIT_FOREVER
Definition: channel.h:192
#define ast_var_assign(name, value)
Definition: chanvars.h:40
void ast_var_delete(struct ast_var_t *var)
Definition: extconf.c:2472
#define ast_datastore_alloc(info, uid)
Definition: datastore.h:85
int ast_datastore_free(struct ast_datastore *datastore)
Free a data store object.
Definition: datastore.c:68
#define AST_LIST_INSERT_TAIL(head, elm, field)
Appends a list entry to the tail of a list.
Definition: linkedlists.h:731
#define AST_LIST_HEAD_INIT(head)
Initializes a list head structure.
Definition: linkedlists.h:626
#define AST_LIST_TRAVERSE_SAFE_END
Closes a safe loop traversal block.
Definition: linkedlists.h:615
#define AST_LIST_TRAVERSE_SAFE_BEGIN(head, var, field)
Loops safely over (traverses) the entries in a list.
Definition: linkedlists.h:529
#define AST_LIST_REMOVE_CURRENT(field)
Removes the current entry from a list during a traversal.
Definition: linkedlists.h:557
unsigned int inheritance
Definition: datastore.h:69
int value
Definition: syslog.c:37

References ast_calloc, ast_channel_datastore_add(), ast_channel_datastore_find(), ast_datastore_alloc, ast_datastore_free(), AST_LIST_HEAD, AST_LIST_HEAD_INIT, AST_LIST_INSERT_TAIL, AST_LIST_LOCK, AST_LIST_REMOVE_CURRENT, AST_LIST_TRAVERSE_SAFE_BEGIN, AST_LIST_TRAVERSE_SAFE_END, AST_LIST_UNLOCK, ast_log, ast_var_assign, ast_var_delete(), ast_datastore::data, DATASTORE_INHERIT_FOREVER, ast_var_t::entries, iax2_variable_datastore_info, ast_datastore::inheritance, LOG_ERROR, LOG_WARNING, NULL, value, and var.

◆ acl_change_stasis_cb()

static void acl_change_stasis_cb ( void *  data,
struct stasis_subscription sub,
struct stasis_message message 
)
static

Definition at line 1508 of file chan_iax2.c.

1510 {
1512  return;
1513  }
1514 
1515  ast_log(LOG_NOTICE, "Reloading chan_iax2 in response to ACL change event.\n");
1516  reload_config(1);
1517 }
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
static int reload_config(int forced_reload)
Definition: chan_iax2.c:14086
struct stasis_message_type * stasis_message_type(const struct stasis_message *msg)
Get the message type for a stasis_message.

References ast_log, ast_named_acl_change_type(), LOG_NOTICE, reload_config(), and stasis_message_type().

Referenced by acl_change_stasis_subscribe(), and rtp_reload().

◆ acl_change_stasis_subscribe()

static void acl_change_stasis_subscribe ( void  )
static

Definition at line 1466 of file chan_iax2.c.

1467 {
1468  if (!acl_change_sub) {
1473  }
1474 }
static struct stasis_subscription * acl_change_sub
Definition: chan_iax2.c:321
static void acl_change_stasis_cb(void *data, struct stasis_subscription *sub, struct stasis_message *message)
Definition: chan_iax2.c:1508
struct stasis_topic * ast_security_topic(void)
A stasis_topic which publishes messages for security related issues.
@ STASIS_SUBSCRIPTION_FILTER_SELECTIVE
Definition: stasis.h:297
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.
Definition: stasis.c:1025
int stasis_subscription_set_filter(struct stasis_subscription *subscription, enum stasis_subscription_message_filter filter)
Set the message type filtering level on a subscription.
Definition: stasis.c:1079
#define stasis_subscribe(topic, callback, data)
Definition: stasis.h:649

References acl_change_stasis_cb(), acl_change_sub, ast_named_acl_change_type(), ast_security_topic(), NULL, stasis_subscribe, stasis_subscription_accept_message_type(), STASIS_SUBSCRIPTION_FILTER_SELECTIVE, and stasis_subscription_set_filter().

Referenced by build_peer(), and build_user().

◆ acl_change_stasis_unsubscribe()

static void acl_change_stasis_unsubscribe ( void  )
static

Definition at line 1476 of file chan_iax2.c.

1477 {
1479 }
struct stasis_subscription * stasis_unsubscribe_and_join(struct stasis_subscription *subscription)
Cancel a subscription, blocking until the last message is processed.
Definition: stasis.c:1136

References acl_change_sub, and stasis_unsubscribe_and_join().

Referenced by __unload_module().

◆ add_calltoken_ignore()

static int add_calltoken_ignore ( const char *  addr)
static

Definition at line 2792 of file chan_iax2.c.

2793 {
2794  struct addr_range tmp;
2795  struct addr_range *addr_range = NULL;
2796  struct ast_ha *ha = NULL;
2797  int error = 0;
2798 
2799  if (ast_strlen_zero(addr)) {
2800  ast_log(LOG_WARNING, "invalid calltokenoptional (null)\n");
2801  return -1;
2802  }
2803 
2804  ha = ast_append_ha("permit", addr, NULL, &error);
2805 
2806  /* check for valid config information */
2807  if (error) {
2808  ast_log(LOG_WARNING, "Error %d creating calltokenoptional entry %s\n", error, addr);
2809  return -1;
2810  }
2811 
2812  ast_copy_ha(ha, &tmp.ha);
2813  /* find or create the addr_range */
2816  addr_range->delme = 0;
2818  } else if ((addr_range = ao2_alloc(sizeof(*addr_range), NULL))) {
2819  /* copy over config data into addr_range object */
2820  ast_copy_ha(ha, &addr_range->ha); /* this is safe because only one ha is possible */
2822  } else {
2823  ast_free_ha(ha);
2824  return -1;
2825  }
2826 
2827  ast_free_ha(ha);
2828  ao2_ref(addr_range, -1); /* decrement ref from ao2_find and ao2_alloc, only container ref remains */
2829 
2830  return 0;
2831 }
void ast_free_ha(struct ast_ha *ha)
Free a list of HAs.
Definition: acl.c:222
void ast_copy_ha(const struct ast_ha *from, struct ast_ha *to)
Copy the contents of one HA to another.
Definition: acl.c:255
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.
Definition: acl.c:713
#define ao2_link(container, obj)
Add an object to a container.
Definition: astobj2.h:1532
#define ao2_unlock(a)
Definition: astobj2.h:729
#define ao2_lock(a)
Definition: astobj2.h:717
#define ao2_alloc(data_size, destructor_fn)
Definition: astobj2.h:409
static int tmp()
Definition: bt_open.c:389
struct ast_ha ha
Definition: chan_iax2.c:992
unsigned char delme
Definition: chan_iax2.c:996
internal representation of ACL entries In principle user applications would have no need for this,...
Definition: acl.h:51
struct ast_sockaddr addr
Definition: acl.h:53
int error(const char *format,...)
Definition: utils/frame.c:999

References ast_ha::addr, ao2_alloc, ao2_find, ao2_link, ao2_lock, ao2_ref, ao2_unlock, ast_append_ha(), ast_copy_ha(), ast_free_ha(), ast_log, ast_strlen_zero(), calltoken_ignores, addr_range::delme, error(), addr_range::ha, LOG_WARNING, NULL, OBJ_POINTER, and tmp().

Referenced by set_config().

◆ add_empty_calltoken_ie()

static void add_empty_calltoken_ie ( struct chan_iax2_pvt pvt,
struct iax_ie_data ied 
)
static

Definition at line 4797 of file chan_iax2.c.

4798 {
4799  /* first make sure their are two empty bytes left in ied->buf */
4800  if (pvt && ied && (2 < ((int) sizeof(ied->buf) - ied->pos))) {
4801  ied->buf[ied->pos++] = IAX_IE_CALLTOKEN; /* type */
4802  ied->buf[ied->pos++] = 0; /* data size, ZERO in this case */
4803  pvt->calltoken_ie_len = 2;
4804  }
4805 }
#define IAX_IE_CALLTOKEN
Definition: iax2.h:185
unsigned char calltoken_ie_len
Definition: chan_iax2.c:883
int pos
Definition: parser.h:151
unsigned char buf[1024]
Definition: parser.h:150

References iax_ie_data::buf, chan_iax2_pvt::calltoken_ie_len, IAX_IE_CALLTOKEN, and iax_ie_data::pos.

Referenced by cache_get_callno_locked(), iax2_call(), iax2_do_register(), iax2_poke_peer(), and registry_rerequest().

◆ addr_range_cmp_cb()

static int addr_range_cmp_cb ( void *  obj,
void *  arg,
int  flags 
)
static

Definition at line 2448 of file chan_iax2.c.

2449 {
2450  struct addr_range *lim1 = obj, *lim2 = arg;
2451  return (!(ast_sockaddr_cmp_addr(&lim1->ha.addr, &lim2->ha.addr)) &&
2452  !(ast_sockaddr_cmp_addr(&lim1->ha.netmask, &lim2->ha.netmask))) ?
2453  CMP_MATCH | CMP_STOP : 0;
2454 }
@ CMP_MATCH
Definition: astobj2.h:1027
@ CMP_STOP
Definition: astobj2.h:1028
int ast_sockaddr_cmp_addr(const struct ast_sockaddr *a, const struct ast_sockaddr *b)
Compares the addresses of two ast_sockaddr structures.
Definition: netsock2.c:413
struct ast_sockaddr netmask
Definition: acl.h:54

References ast_ha::addr, ast_sockaddr_cmp_addr(), CMP_MATCH, CMP_STOP, addr_range::ha, and ast_ha::netmask.

Referenced by load_objects().

◆ addr_range_delme_cb()

static int addr_range_delme_cb ( void *  obj,
void *  arg,
int  flags 
)
static

Definition at line 2435 of file chan_iax2.c.

2436 {
2437  struct addr_range *lim = obj;
2438  lim->delme = 1;
2439  return 0;
2440 }

References addr_range::delme.

Referenced by set_config_destroy().

◆ addr_range_hash_cb()

static int addr_range_hash_cb ( const void *  obj,
const int  flags 
)
static

Definition at line 2442 of file chan_iax2.c.

2443 {
2444  const struct addr_range *lim = obj;
2445  return abs(ast_sockaddr_hash(&lim->ha.addr));
2446 }
#define abs(x)
Definition: f2c.h:195
int ast_sockaddr_hash(const struct ast_sockaddr *addr)
Computes a hash value from the address. The port is ignored.
Definition: netsock2.c:548

References abs, ast_ha::addr, ast_sockaddr_hash(), and addr_range::ha.

Referenced by load_objects().

◆ addr_range_match_address_cb()

static int addr_range_match_address_cb ( void *  obj,
void *  arg,
int  flags 
)
static

Definition at line 2472 of file chan_iax2.c.

2473 {
2474  struct addr_range *addr_range = obj;
2475  struct ast_sockaddr *addr = arg;
2476  struct ast_sockaddr tmp_addr;
2477 
2478  ast_sockaddr_apply_netmask(addr, &addr_range->ha.netmask, &tmp_addr);
2479 
2480  if (!ast_sockaddr_cmp_addr(&tmp_addr, &addr_range->ha.addr)) {
2481  return CMP_MATCH | CMP_STOP;
2482  }
2483  return 0;
2484 }
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.
Definition: netsock2.c:357
Socket address structure.
Definition: netsock2.h:97

References ast_ha::addr, ast_sockaddr_apply_netmask(), ast_sockaddr_cmp_addr(), CMP_MATCH, CMP_STOP, addr_range::ha, and ast_ha::netmask.

Referenced by calltoken_required(), and set_peercnt_limit().

◆ apply_context()

static int apply_context ( struct iax2_context con,
const char *  context 
)
static

Definition at line 7811 of file chan_iax2.c.

7812 {
7813  while(con) {
7814  if (!strcmp(con->context, context) || !strcmp(con->context, "*"))
7815  return -1;
7816  con = con->next;
7817  }
7818  return 0;
7819 }
static char context[AST_MAX_CONTEXT]
Definition: chan_alsa.c:120
char context[AST_MAX_CONTEXT]
Definition: chan_iax2.c:445
struct iax2_context * next
Definition: chan_iax2.c:446

References context, iax2_context::context, and iax2_context::next.

Referenced by check_access().

◆ ast_cli_netstats()

static int ast_cli_netstats ( struct mansession s,
int  fd,
int  limit_fmt 
)
static

Definition at line 7512 of file chan_iax2.c.

7513 {
7514  int x;
7515  int numchans = 0;
7516  char first_message[10] = { 0, };
7517  char last_message[10] = { 0, };
7518 #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"
7519 #define ACN_FORMAT2 "%s %u %d %d %d %d %d %d %d %d %d %d %d %d %d %d %s%s %s%s\n"
7520  for (x = 0; x < ARRAY_LEN(iaxs); x++) {
7521  ast_mutex_lock(&iaxsl[x]);
7522  if (iaxs[x]) {
7523  int localjitter, localdelay, locallost, locallosspct, localdropped, localooo;
7524  jb_info jbinfo;
7525  iax_frame_subclass2str(iaxs[x]->first_iax_message & ~MARK_IAX_SUBCLASS_TX, first_message, sizeof(first_message));
7526  iax_frame_subclass2str(iaxs[x]->last_iax_message & ~MARK_IAX_SUBCLASS_TX, last_message, sizeof(last_message));
7527 
7529  jb_getinfo(iaxs[x]->jb, &jbinfo);
7530  localjitter = jbinfo.jitter;
7531  localdelay = jbinfo.current - jbinfo.min;
7532  locallost = jbinfo.frames_lost;
7533  locallosspct = jbinfo.losspct/1000;
7534  localdropped = jbinfo.frames_dropped;
7535  localooo = jbinfo.frames_ooo;
7536  } else {
7537  localjitter = -1;
7538  localdelay = 0;
7539  locallost = -1;
7540  locallosspct = -1;
7541  localdropped = 0;
7542  localooo = -1;
7543  }
7544  if (s)
7545  astman_append(s, limit_fmt ? ACN_FORMAT1 : ACN_FORMAT2,
7546  iaxs[x]->owner ? ast_channel_name(iaxs[x]->owner) : "(None)",
7547  iaxs[x]->pingtime,
7548  localjitter,
7549  localdelay,
7550  locallost,
7551  locallosspct,
7552  localdropped,
7553  localooo,
7554  iaxs[x]->frames_received/1000,
7555  iaxs[x]->remote_rr.jitter,
7556  iaxs[x]->remote_rr.delay,
7557  iaxs[x]->remote_rr.losscnt,
7558  iaxs[x]->remote_rr.losspct,
7559  iaxs[x]->remote_rr.dropped,
7560  iaxs[x]->remote_rr.ooo,
7561  iaxs[x]->remote_rr.packets/1000,
7562  (iaxs[x]->first_iax_message & MARK_IAX_SUBCLASS_TX) ? "Tx:" : "Rx:",
7563  first_message,
7564  (iaxs[x]->last_iax_message & MARK_IAX_SUBCLASS_TX) ? "Tx:" : "Rx:",
7565  last_message);
7566  else
7567  ast_cli(fd, limit_fmt ? ACN_FORMAT1 : ACN_FORMAT2,
7568  iaxs[x]->owner ? ast_channel_name(iaxs[x]->owner) : "(None)",
7569  iaxs[x]->pingtime,
7570  localjitter,
7571  localdelay,
7572  locallost,
7573  locallosspct,
7574  localdropped,
7575  localooo,
7576  iaxs[x]->frames_received/1000,
7577  iaxs[x]->remote_rr.jitter,
7578  iaxs[x]->remote_rr.delay,
7579  iaxs[x]->remote_rr.losscnt,
7580  iaxs[x]->remote_rr.losspct,
7581  iaxs[x]->remote_rr.dropped,
7582  iaxs[x]->remote_rr.ooo,
7583  iaxs[x]->remote_rr.packets/1000,
7584  (iaxs[x]->first_iax_message & MARK_IAX_SUBCLASS_TX) ? "Tx:" : "Rx:",
7585  first_message,
7586  (iaxs[x]->last_iax_message & MARK_IAX_SUBCLASS_TX) ? "Tx:" : "Rx:",
7587  last_message);
7588  numchans++;
7589  }
7590  ast_mutex_unlock(&iaxsl[x]);
7591  }
7592 
7593  return numchans;
7594 }
#define MARK_IAX_SUBCLASS_TX
Definition: chan_iax2.c:670
#define ACN_FORMAT2
#define ACN_FORMAT1
enum jb_return_code jb_getinfo(jitterbuf *jb, jb_info *stats)
get jitterbuf info: only "statistics" may be valid
Definition: jitterbuf.c:815
void iax_frame_subclass2str(enum iax_frame_subclass subclass, char *str, size_t len)
Definition: parser.c:463
int first_iax_message
Definition: chan_iax2.c:718
struct iax_rr remote_rr
Definition: chan_iax2.c:873
int last_iax_message
Definition: chan_iax2.c:720
int ooo
Definition: chan_iax2.c:685
int losscnt
Definition: chan_iax2.c:681
int delay
Definition: chan_iax2.c:683
int losspct
Definition: chan_iax2.c:680
int dropped
Definition: chan_iax2.c:684
int packets
Definition: chan_iax2.c:682
long min
Definition: jitterbuf.h:87
long current
Definition: jitterbuf.h:88
long losspct
Definition: jitterbuf.h:90
long frames_lost
Definition: jitterbuf.h:82
long frames_ooo
Definition: jitterbuf.h:84
long frames_dropped
Definition: jitterbuf.h:83
long jitter
Definition: jitterbuf.h:86

References ACN_FORMAT1, ACN_FORMAT2, ARRAY_LEN, ast_channel_name(), ast_cli(), ast_mutex_lock, ast_mutex_unlock, ast_test_flag64, astman_append(), jb_info::current, iax_rr::delay, iax_rr::dropped, chan_iax2_pvt::first_iax_message, jb_info::frames_dropped, jb_info::frames_lost, jb_info::frames_ooo, iax_frame_subclass2str(), IAX_USEJITTERBUF, iaxs, iaxsl, jb_getinfo(), jb_info::jitter, chan_iax2_pvt::last_iax_message, iax_rr::losscnt, iax_rr::losspct, jb_info::losspct, MARK_IAX_SUBCLASS_TX, jb_info::min, iax_rr::ooo, iax_rr::packets, and chan_iax2_pvt::remote_rr.

Referenced by handle_cli_iax2_show_netstats(), and manager_iax2_show_netstats().

◆ ast_iax2_new()

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 
)
static

Create new call, interface with the PBX core.

Definition at line 5845 of file chan_iax2.c.

5848 {
5849  struct ast_channel *tmp = NULL;
5850  struct chan_iax2_pvt *i;
5851  struct iax2_peer *peer;
5852  struct ast_variable *v = NULL;
5853  struct ast_format_cap *native;
5854  struct ast_format *tmpfmt;
5855  ast_callid callid;
5856  char *peer_name = NULL;
5857 
5858  if (!(i = iaxs[callno])) {
5859  ast_log(LOG_WARNING, "No IAX2 pvt found for callno '%d' !\n", callno);
5860  return NULL;
5861  }
5862 
5863  if (!capability) {
5864  ast_log(LOG_WARNING, "No formats specified for call to: IAX2/%s-%d\n",
5865  i->host, i->callno);
5866  return NULL;
5867  }
5869  if (!native) {
5870  return NULL;
5871  }
5872  if (iax2_codec_pref_best_bitfield2cap(capability, prefs, native)
5873  || !ast_format_cap_count(native)) {
5874  ast_log(LOG_WARNING, "No requested formats available for call to: IAX2/%s-%d\n",
5875  i->host, i->callno);
5876  ao2_ref(native, -1);
5877  return NULL;
5878  }
5879 
5880  if (!ast_strlen_zero(i->peer)) {
5881  peer_name = ast_strdupa(i->peer);
5882  } else if (!ast_strlen_zero(i->host)) {
5883  peer_name = ast_strdupa(i->host);
5884  }
5885 
5886  /* Don't hold call lock while making a channel or looking up a peer */
5887  ast_mutex_unlock(&iaxsl[callno]);
5888 
5889  if (!ast_strlen_zero(peer_name)) {
5890  peer = find_peer(peer_name, 1);
5891  if (peer && peer->endpoint) {
5893  i->accountcode, i->exten, i->context, assignedids, requestor,
5894  i->amaflags, peer->endpoint, "IAX2/%s-%d", i->host, i->callno);
5895  }
5896  ao2_cleanup(peer);
5897  }
5898 
5899  if (!tmp) {
5901  i->exten, i->context, assignedids, requestor, i->amaflags, "IAX2/%s-%d",
5902  i->host, i->callno);
5903  }
5904 
5905  ast_mutex_lock(&iaxsl[callno]);
5906  if (i != iaxs[callno]) {
5907  if (tmp) {
5908  /* unlock and relock iaxsl[callno] to preserve locking order */
5909  ast_mutex_unlock(&iaxsl[callno]);
5912  ast_mutex_lock(&iaxsl[callno]);
5913  }
5914  ao2_ref(native, -1);
5915  return NULL;
5916  }
5917  if (!tmp) {
5918  ao2_ref(native, -1);
5919  return NULL;
5920  }
5921 
5923 
5924  if ((callid = iaxs[callno]->callid)) {
5925  ast_channel_callid_set(tmp, callid);
5926  }
5927 
5929 
5930  /* We can support any format by default, until we get restricted */
5932  tmpfmt = ast_format_cap_get_format(native, 0);
5933 
5938 
5939  ao2_ref(tmpfmt, -1);
5940  ao2_ref(native, -1);
5941 
5943 
5944  if (!ast_strlen_zero(i->parkinglot))
5945  ast_channel_parkinglot_set(tmp, i->parkinglot);
5946  /* Don't use ast_set_callerid() here because it will
5947  * generate a NewCallerID event before the NewChannel event */
5948  if (!ast_strlen_zero(i->ani)) {
5951  } else if (!ast_strlen_zero(i->cid_num)) {
5954  }
5956  if (!ast_strlen_zero(i->rdnis)) {
5959  }
5965  if (!ast_strlen_zero(i->language))
5966  ast_channel_language_set(tmp, i->language);
5967  if (!ast_strlen_zero(i->accountcode))
5968  ast_channel_accountcode_set(tmp, i->accountcode);
5969  if (i->amaflags)
5973  if (i->adsi)
5975  else
5977  i->owner = tmp;
5978  i->capability = capability;
5979 
5980  if (!cachable) {
5982  }
5983 
5984  /* Set inherited variables */
5985  if (i->vars) {
5986  for (v = i->vars ; v ; v = v->next)
5988  }
5989  if (i->iaxvars) {
5990  struct ast_datastore *variablestore;
5991  struct ast_variable *var, *prev = NULL;
5992  AST_LIST_HEAD(, ast_var_t) *varlist;
5993  ast_debug(1, "Loading up the channel with IAXVARs\n");
5994  varlist = ast_calloc(1, sizeof(*varlist));
5996  if (variablestore && varlist) {
5997  variablestore->data = varlist;
5998  variablestore->inheritance = DATASTORE_INHERIT_FOREVER;
5999  AST_LIST_HEAD_INIT(varlist);
6000  for (var = i->iaxvars; var; var = var->next) {
6001  struct ast_var_t *newvar = ast_var_assign(var->name, var->value);
6002  if (prev)
6003  ast_free(prev);
6004  prev = var;
6005  if (!newvar) {
6006  /* Don't abort list traversal, as this would leave i->iaxvars in an inconsistent state. */
6007  ast_log(LOG_ERROR, "Memory allocation error while processing IAX2 variables\n");
6008  } else {
6009  AST_LIST_INSERT_TAIL(varlist, newvar, entries);
6010  }
6011  }
6012  if (prev)
6013  ast_free(prev);
6014  i->iaxvars = NULL;
6015  ast_channel_datastore_add(i->owner, variablestore);
6016  } else {
6017  if (variablestore) {
6018  ast_datastore_free(variablestore);
6019  }
6020  if (varlist) {
6021  ast_free(varlist);
6022  }
6023  }
6024  }
6025 
6028 
6029  if (state != AST_STATE_DOWN) {
6030  if (ast_pbx_start(tmp)) {
6031  ast_log(LOG_WARNING, "Unable to start PBX on %s\n", ast_channel_name(tmp));
6032  /* unlock and relock iaxsl[callno] to preserve locking order */
6033  ast_mutex_unlock(&iaxsl[callno]);
6034  ast_hangup(tmp);
6035  ast_mutex_lock(&iaxsl[callno]);
6036  return NULL;
6037  }
6038  }
6039 
6041  return tmp;
6042 }
#define ast_free(a)
Definition: astmm.h:180
#define ast_strdup(str)
A wrapper for strdup()
Definition: astmm.h:241
#define ao2_cleanup(obj)
Definition: astobj2.h:1934
#define CALLNO_TO_PTR(a)
Definition: chan_iax2.c:286
static struct iax2_peer * find_peer(const char *name, int realtime)
Definition: chan_iax2.c:2006
struct ast_channel * ast_channel_release(struct ast_channel *chan)
Unlink and release reference to a channel.
Definition: channel.c:1578
void ast_channel_exten_set(struct ast_channel *chan, const char *value)
#define ast_channel_alloc_with_endpoint(needqueue, state, cid_num, cid_name, acctcode, exten, context, assignedids, requestor, amaflag, endpoint,...)
Definition: channel.h:1262
void ast_hangup(struct ast_channel *chan)
Hang up a channel.
Definition: channel.c:2542
#define ast_channel_alloc(needqueue, state, cid_num, cid_name, acctcode, exten, context, assignedids, requestor, amaflag,...)
Create a channel structure.
Definition: channel.h:1258
void ast_channel_nativeformats_set(struct ast_channel *chan, struct ast_format_cap *value)
struct ast_party_dialed * ast_channel_dialed(struct ast_channel *chan)
@ AST_ADSI_UNAVAILABLE
Definition: channel.h:871
@ AST_FLAG_DISABLE_DEVSTATE_CACHE
Definition: channel.h:1029
struct ast_flags * ast_channel_flags(struct ast_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)
void ast_channel_set_rawwriteformat(struct ast_channel *chan, struct ast_format *format)
void ast_channel_set_readformat(struct ast_channel *chan, struct ast_format *format)
void ast_channel_amaflags_set(struct ast_channel *chan, enum ama_flags value)
struct ast_party_caller * ast_channel_caller(struct ast_channel *chan)
void ast_channel_context_set(struct ast_channel *chan, const char *value)
struct ast_party_redirecting * ast_channel_redirecting(struct ast_channel *chan)
void ast_channel_callid_set(struct ast_channel *chan, ast_callid 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)
Definition: channel.h:2923
void ast_channel_set_writeformat(struct ast_channel *chan, struct ast_format *format)
@ AST_STATE_DOWN
Definition: channelstate.h:36
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.
Definition: codec_pref.c:112
@ AST_FORMAT_CAP_FLAG_DEFAULT
Definition: format_cap.h:38
struct ast_format * ast_format_cap_get_format(const struct ast_format_cap *cap, int position)
Get the format at a specific index.
Definition: format_cap.c:400
#define ast_format_cap_alloc(flags)
Allocate a new ast_format_cap structure.
Definition: format_cap.h:49
size_t ast_format_cap_count(const struct ast_format_cap *cap)
Get the number of formats present within the capabilities structure.
Definition: format_cap.c:395
void ast_channel_stage_snapshot_done(struct ast_channel *chan)
Clear flag to indicate channel snapshot is being staged, and publish snapshot.
void ast_channel_stage_snapshot(struct ast_channel *chan)
Set flag to indicate channel snapshot is being staged.
unsigned int ast_callid
#define ast_module_ref(mod)
Hold a reference to the module.
Definition: module.h:443
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.
enum ast_pbx_result ast_pbx_start(struct ast_channel *c)
Create a new thread and start the PBX.
Definition: pbx.c:4715
Main Channel structure associated with a channel.
Format capabilities structure, holds formats + preference order + etc.
Definition: format_cap.c:54
struct ast_module * self
Definition: module.h:342
struct ast_party_id id
Caller party ID.
Definition: channel.h:420
int ani2
Automatic Number Identification 2 (Info Digits)
Definition: channel.h:433
struct ast_party_id ani
Automatic Number Identification (ANI)
Definition: channel.h:427
struct ast_party_dialed::@236 number
Dialed/Called number.
char * str
Subscriber phone number (Malloced)
Definition: channel.h:386
int transit_network_select
Transit Network Select.
Definition: channel.h:397
struct ast_party_name name
Subscriber name.
Definition: channel.h:340
struct ast_party_number number
Subscriber phone number.
Definition: channel.h:342
int presentation
Q.931 encoded presentation-indicator encoded field.
Definition: channel.h:277
int presentation
Q.931 presentation-indicator and screening-indicator encoded fields.
Definition: channel.h:295
unsigned char valid
TRUE if the number information is valid/present.
Definition: channel.h:297
char * str
Subscriber phone number (Malloced)
Definition: channel.h:291
int plan
Q.931 Type-Of-Number and Numbering-Plan encoded fields.
Definition: channel.h:293
struct ast_party_id from
Who is redirecting the call (Sent to the party the call is redirected toward)
Definition: channel.h:527
Structure for variables, used for configurations and for channel variables.
struct ast_variable * next
struct ast_variable * vars
Definition: chan_iax2.c:869
const ast_string_field language
Definition: chan_iax2.c:813
int calling_ani2
Definition: chan_iax2.c:865
const ast_string_field cid_num
Definition: chan_iax2.c:813
iax2_format capability
Definition: chan_iax2.c:708
const ast_string_field accountcode
Definition: chan_iax2.c:813
struct ast_variable * iaxvars
Definition: chan_iax2.c:871
const ast_string_field context
Definition: chan_iax2.c:813
const ast_string_field parkinglot
Definition: chan_iax2.c:813
const ast_string_field rdnis
Definition: chan_iax2.c:813
int calling_pres
Definition: chan_iax2.c:864
const ast_string_field exten
Definition: chan_iax2.c:813
const ast_string_field ani
Definition: chan_iax2.c:813
const ast_string_field cid_name
Definition: chan_iax2.c:813
const ast_string_field dnid
Definition: chan_iax2.c:813
const ast_string_field peer
Definition: chan_iax2.c:813
#define ast_set_flag(p, flag)
Definition: utils.h:70

References chan_iax2_pvt::accountcode, chan_iax2_pvt::adsi, chan_iax2_pvt::amaflags, chan_iax2_pvt::ani, ast_party_caller::ani, ast_party_caller::ani2, ao2_cleanup, ao2_ref, AST_ADSI_UNAVAILABLE, ast_calloc, ast_channel_adsicpe_set(), ast_channel_alloc, ast_channel_alloc_with_endpoint, ast_channel_amaflags_set(), ast_channel_caller(), ast_channel_callid_set(), ast_channel_context_set(), ast_channel_datastore_add(), ast_channel_dialed(), ast_channel_exten_set(), ast_channel_flags(), ast_channel_name(), ast_channel_nativeformats_set(), ast_channel_redirecting(), ast_channel_release(), ast_channel_set_rawreadformat(), ast_channel_set_rawwriteformat(), ast_channel_set_readformat(), ast_channel_set_writeformat(), ast_channel_stage_snapshot(), ast_channel_stage_snapshot_done(), ast_channel_tech_pvt_set(), ast_channel_tech_set(), ast_channel_unlock, ast_datastore_alloc, ast_datastore_free(), ast_debug, AST_FLAG_DISABLE_DEVSTATE_CACHE, ast_format_cap_alloc, ast_format_cap_count(), AST_FORMAT_CAP_FLAG_DEFAULT, ast_format_cap_get_format(), ast_free, ast_hangup(), AST_LIST_HEAD, AST_LIST_HEAD_INIT, AST_LIST_INSERT_TAIL, ast_log, ast_module_ref, ast_mutex_lock, ast_mutex_unlock, ast_pbx_start(), ast_set_flag, AST_STATE_DOWN, ast_strdup, ast_strdupa, ast_strlen_zero(), ast_var_assign, chan_iax2_pvt::calling_ani2, chan_iax2_pvt::calling_pres, chan_iax2_pvt::calling_tns, chan_iax2_pvt::calling_ton, chan_iax2_pvt::callno, CALLNO_TO_PTR, chan_iax2_pvt::capability, chan_iax2_pvt::cid_name, chan_iax2_pvt::cid_num, chan_iax2_pvt::context, ast_datastore::data, DATASTORE_INHERIT_FOREVER, chan_iax2_pvt::dnid, iax2_peer::endpoint, ast_var_t::entries, chan_iax2_pvt::exten, find_peer(), ast_party_redirecting::from, chan_iax2_pvt::host, iax2_codec_pref_best_bitfield2cap(), iax2_tech, iax2_variable_datastore_info, iaxs, iaxsl, chan_iax2_pvt::iaxvars, ast_party_caller::id, ast_datastore::inheritance, chan_iax2_pvt::language, LOG_ERROR, LOG_WARNING, ast_party_id::name, ast_variable::name, ast_variable::next, NULL, ast_party_id::number, ast_party_dialed::number, chan_iax2_pvt::owner, chan_iax2_pvt::parkinglot, pbx_builtin_setvar_helper(), chan_iax2_pvt::peer, chan_iax2_pvt::peeradsicpe, ast_party_number::plan, ast_party_name::presentation, ast_party_number::presentation, chan_iax2_pvt::rdnis, ast_module_info::self, ast_party_number::str, ast_party_dialed::str, tmp(), ast_party_dialed::transit_network_select, ast_party_number::valid, ast_variable::value, var, and chan_iax2_pvt::vars.

Referenced by iax2_request(), and socket_process_helper().

◆ AST_MODULE_SELF_SYM()

struct ast_module* AST_MODULE_SELF_SYM ( void  )

Definition at line 15050 of file chan_iax2.c.

◆ attempt_transmit()

static int attempt_transmit ( const void *  data)
static

Definition at line 3628 of file chan_iax2.c.

3629 {
3630 #ifdef SCHED_MULTITHREADED
3632 #endif
3633  __attempt_transmit(data);
3634  return 0;
3635 }
#define schedule_action(func, data)
Definition: chan_iax2.c:1674
static void __attempt_transmit(const void *data)
Definition: chan_iax2.c:3545

References __attempt_transmit(), ast_frame::data, and schedule_action.

Referenced by __attempt_transmit(), and transmit_frame().

◆ auth_fail()

static int auth_fail ( int  callno,
int  failcode 
)
static

Definition at line 9374 of file chan_iax2.c.

9375 {
9376  /* Schedule sending the authentication failure in one second, to prevent
9377  guessing */
9378  if (iaxs[callno]) {
9379  iaxs[callno]->authfail = failcode;
9380  if (delayreject) {
9381  iaxs[callno]->authid = iax2_sched_replace(iaxs[callno]->authid,
9382  sched, 1000, auth_reject, (void *)(long)callno);
9383  } else
9384  auth_reject((void *)(long)callno);
9385  }
9386  return 0;
9387 }
static int delayreject
Definition: chan_iax2.c:430
static int auth_reject(const void *data)
Definition: chan_iax2.c:9360
static int iax2_sched_replace(int id, struct ast_sched_context *con, int when, ast_sched_cb callback, const void *data)
Definition: chan_iax2.c:1677

References auth_reject(), chan_iax2_pvt::authfail, chan_iax2_pvt::authid, delayreject, iax2_sched_replace(), and iaxs.

Referenced by socket_process_helper().

◆ auth_reject()

static int auth_reject ( const void *  data)
static

Definition at line 9360 of file chan_iax2.c.

9361 {
9362  int callno = (int)(long)(data);
9363  ast_mutex_lock(&iaxsl[callno]);
9364  if (iaxs[callno])
9365  iaxs[cal