Asterisk - The Open Source Telephony Project  18.5.0
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   "%-20.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)
 
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 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 = "30ef0c93b36035ec78c9cfd712d36d9b" , .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
See also
  • Config_iax
Todo:
Implement musicclass settings for IAX2 devices

Definition in file chan_iax2.c.

Macro Definition Documentation

◆ ACN_FORMAT1

#define ACN_FORMAT1   "%-20.25s %4u %4d %4d %5d %3d %5d %4d %6d %4d %4d %5d %3d %5d %4d %6d %s%s %4s%s\n"

Referenced by ast_cli_netstats().

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

Referenced by ast_cli_netstats().

◆ CALLNO_ENTRY_GET_CALLNO

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

Definition at line 907 of file chan_iax2.c.

Referenced by __find_callno(), make_trunk(), and replace_callno().

◆ CALLNO_ENTRY_IS_VALIDATED

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

Definition at line 906 of file chan_iax2.c.

Referenced by make_trunk(), and replace_callno().

◆ CALLNO_ENTRY_SET_VALIDATED

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

Definition at line 905 of file chan_iax2.c.

Referenced by get_unused_callno().

◆ CALLNO_ENTRY_TO_PTR

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

Definition at line 903 of file chan_iax2.c.

Referenced by __find_callno(), make_trunk(), and sched_delay_remove().

◆ CALLNO_TO_PTR

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

Definition at line 289 of file chan_iax2.c.

Referenced by ast_iax2_new(), iax2_call(), iax2_hangup(), and update_jbsched().

◆ CALLTOKEN_HASH_FORMAT

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

Referenced by handle_call_token().

◆ CALLTOKEN_IE_FORMAT

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

Referenced by handle_call_token().

◆ DEBUG_SCHED_MULTITHREAD

#define DEBUG_SCHED_MULTITHREAD

Definition at line 281 of file chan_iax2.c.

◆ DEBUG_SUPPORT

#define DEBUG_SUPPORT

Definition at line 297 of file chan_iax2.c.

◆ DEFAULT_CONTEXT

#define DEFAULT_CONTEXT   "default"

Definition at line 316 of file chan_iax2.c.

Referenced by check_access(), and handle_cli_iax2_show_users().

◆ DEFAULT_DROP

#define DEFAULT_DROP   3

Definition at line 295 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 392 of file chan_iax2.c.

Referenced by build_peer(), handle_response_peerpoke(), and sip_poke_noanswer().

◆ DEFAULT_FREQ_OK

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

Definition at line 391 of file chan_iax2.c.

Referenced by build_peer().

◆ DEFAULT_MAX_THREAD_COUNT

#define DEFAULT_MAX_THREAD_COUNT   100

Definition at line 292 of file chan_iax2.c.

◆ DEFAULT_MAXMS

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

Definition at line 390 of file chan_iax2.c.

Referenced by build_peer(), reload_config(), and set_config().

◆ DEFAULT_RETRY_TIME

#define DEFAULT_RETRY_TIME   1000

Definition at line 293 of file chan_iax2.c.

Referenced by __find_callno(), and complete_transfer().

◆ DEFAULT_THREAD_COUNT

#define DEFAULT_THREAD_COUNT   10

Definition at line 291 of file chan_iax2.c.

◆ DEFAULT_TRUNKDATA

#define DEFAULT_TRUNKDATA   640 * 10

40ms, uncompressed linear * 10 channels

Definition at line 665 of file chan_iax2.c.

Referenced by iax2_trunk_queue().

◆ 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 302 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 593 of file chan_iax2.c.

Referenced by iax2_trunk_queue().

◆ IAX_ALLOWFWDOWNLOAD

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

Allow the FWDOWNL command?

Definition at line 478 of file chan_iax2.c.

Referenced by set_config(), and socket_process_helper().

◆ IAX_ALREADYGONE

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

Already disconnected

Definition at line 462 of file chan_iax2.c.

Referenced by __do_deliver(), __get_from_jb(), iax2_hangup(), iax2_predestroy(), iax2_write(), pvt_destructor(), and socket_process_helper().

◆ IAX_CALLENCRYPTED

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

Definition at line 395 of file chan_iax2.c.

Referenced by acf_channel_read(), iax2_key_rotate(), iax2_send(), and socket_process_helper().

◆ IAX_CAPABILITY_FULLBANDWIDTH

#define IAX_CAPABILITY_FULLBANDWIDTH   0xFFFF

Definition at line 369 of file chan_iax2.c.

Referenced by cache_get_callno_locked(), and set_config().

◆ 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:371

Definition at line 381 of file chan_iax2.c.

Referenced by set_config().

◆ IAX_CAPABILITY_LOWFREE

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

Definition at line 386 of file chan_iax2.c.

◆ IAX_CAPABILITY_MEDBANDWIDTH

#define IAX_CAPABILITY_MEDBANDWIDTH

Definition at line 371 of file chan_iax2.c.

Referenced by set_config().

◆ IAX_CODEC_NOCAP

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

only consider requested format and ignore capabilities

Definition at line 469 of file chan_iax2.c.

Referenced by build_user(), check_access(), handle_cli_iax2_show_users(), set_config(), and socket_process_helper().

◆ IAX_CODEC_NOPREFS

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

Force old behaviour by turning off prefs

Definition at line 468 of file chan_iax2.c.

Referenced by build_user(), check_access(), handle_cli_iax2_show_users(), set_config(), and socket_process_helper().

◆ 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 467 of file chan_iax2.c.

Referenced by build_user(), check_access(), handle_cli_iax2_show_users(), set_config(), and socket_process_helper().

◆ IAX_DEBUGDIGEST

#define IAX_DEBUGDIGEST (   msg,
  key 
)

Definition at line 398 of file chan_iax2.c.

Referenced by iax2_key_rotate(), and socket_process_helper().

◆ 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 477 of file chan_iax2.c.

Referenced by socket_process_helper().

◆ IAX_DELME

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

Needs to be deleted

Definition at line 454 of file chan_iax2.c.

Referenced by build_peer(), build_user(), peer_delme_cb(), prune_peers(), prune_users(), and user_delme_cb().

◆ IAX_DYNAMIC

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

◆ IAX_ENCRYPTED

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

Whether we should assume encrypted tx/rx

Definition at line 465 of file chan_iax2.c.

Referenced by authenticate_reply(), authenticate_request(), iax2_send(), and socket_process_helper().

◆ IAX_FORCE_ENCRYPT

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

◆ IAX_HASCALLERID

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

CallerID has been specified

Definition at line 453 of file chan_iax2.c.

Referenced by build_peer(), build_user(), check_access(), and update_registry().

◆ IAX_IMMEDIATE

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

Allow immediate off-hook to extension s

Definition at line 479 of file chan_iax2.c.

Referenced by build_user(), check_access(), and socket_process_helper().

◆ IAX_KEYPOPULATED

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

Whether we have a key populated

Definition at line 466 of file chan_iax2.c.

Referenced by authenticate_reply(), decrypt_frame(), and iax2_send().

◆ IAX_MAXAUTHREQ

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

Maximum outstanding AUTHREQ restriction is in place

Definition at line 476 of file chan_iax2.c.

Referenced by authenticate_request(), authenticate_verify(), check_access(), and iax2_destroy_helper().

◆ IAX_NOTRANSFER

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

◆ IAX_PROVISION

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

This is a provisioning request

Definition at line 463 of file chan_iax2.c.

Referenced by iax2_provision(), and socket_process_helper().

◆ IAX_QUELCH

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

Whether or not we quelch audio

Definition at line 464 of file chan_iax2.c.

Referenced by iax2_write(), and socket_process_helper().

◆ IAX_RECVCONNECTEDLINE

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

Allow receiving of connected line updates

Definition at line 481 of file chan_iax2.c.

Referenced by __find_callno(), build_peer(), build_user(), check_access(), create_addr(), iax2_request(), set_config(), set_config_destroy(), and socket_process_helper().

◆ IAX_RTAUTOCLEAR

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

erase me on expire

Definition at line 472 of file chan_iax2.c.

Referenced by __expire_registry(), handle_cli_iax2_prune_realtime(), realtime_peer(), and set_config().

◆ IAX_RTCACHEFRIENDS

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

let realtime stay till your reload

Definition at line 470 of file chan_iax2.c.

Referenced by __expire_registry(), handle_cli_iax2_prune_realtime(), prune_peers(), prune_users(), realtime_peer(), realtime_user(), set_config(), and update_registry().

◆ IAX_RTIGNOREREGEXPIRE

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

When using realtime, ignore registration expiration

Definition at line 473 of file chan_iax2.c.

Referenced by realtime_peer(), and set_config().

◆ IAX_RTSAVE_SYSNAME

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

Save Systname on Realtime Updates

Definition at line 461 of file chan_iax2.c.

Referenced by realtime_update_peer(), and set_config().

◆ IAX_RTUPDATE

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

Send a realtime update

Definition at line 471 of file chan_iax2.c.

Referenced by __expire_registry(), set_config(), and update_registry().

◆ IAX_SENDANI

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

Send ANI along with CallerID

Definition at line 460 of file chan_iax2.c.

Referenced by build_peer(), create_addr(), iax2_call(), and iax2_request().

◆ IAX_SENDCONNECTEDLINE

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

Allow sending of connected line updates

Definition at line 480 of file chan_iax2.c.

Referenced by __find_callno(), build_peer(), build_user(), check_access(), create_addr(), iax2_indicate(), iax2_request(), set_config(), and set_config_destroy().

◆ IAX_SHRINKCALLERID

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

Turn on and off caller id shrinking

Definition at line 483 of file chan_iax2.c.

Referenced by check_access(), and set_config().

◆ IAX_TEMPONLY

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

Temporary (realtime)

Definition at line 455 of file chan_iax2.c.

Referenced by __expire_registry(), realtime_peer(), realtime_user(), reg_source_db(), and update_registry().

◆ IAX_TRANSFERMEDIA

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

When doing IAX2 transfers, transfer media only

Definition at line 475 of file chan_iax2.c.

Referenced by __find_callno(), build_peer(), build_user(), check_access(), create_addr(), iax2_key_rotate(), iax2_request(), set_config(), and set_config_destroy().

◆ IAX_TRUNK

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

◆ IAX_TRUNKTIMESTAMPS

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

Send trunk timestamps

Definition at line 474 of file chan_iax2.c.

Referenced by iax2_trunk_queue(), send_trunk(), and set_config().

◆ IAX_USEJITTERBUF

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

◆ MARK_IAX_SUBCLASS_TX

#define MARK_IAX_SUBCLASS_TX   0x8000

Definition at line 673 of file chan_iax2.c.

Referenced by ast_cli_netstats(), handle_cli_iax2_show_channels(), and iax2_send().

◆ MAX_JITTER_BUFFER

#define MAX_JITTER_BUFFER   50

Definition at line 662 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 950 of file chan_iax2.c.

Referenced by load_objects().

◆ MAX_RETRY_TIME

#define MAX_RETRY_TIME   10000

Definition at line 660 of file chan_iax2.c.

Referenced by __attempt_transmit(), iax2_poke_peer(), and iax2_send().

◆ MAX_TIMESTAMP_SKEW

#define MAX_TIMESTAMP_SKEW   160

maximum difference between actual and predicted ts for sending

Definition at line 667 of file chan_iax2.c.

Referenced by calc_timestamp(), and calc_txpeerstamp().

◆ 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 311 of file chan_iax2.c.

Referenced by handle_cli_iax2_set_mtu(), and set_config().

◆ MAX_TRUNKDATA

#define MAX_TRUNKDATA   640 * 200

40ms, uncompressed linear * 200 channels

Definition at line 336 of file chan_iax2.c.

Referenced by set_config(), and set_config_destroy().

◆ MAX_USER_BUCKETS

#define MAX_USER_BUCKETS   MAX_PEER_BUCKETS

Definition at line 954 of file chan_iax2.c.

Referenced by load_objects().

◆ MEMORY_SIZE

#define MEMORY_SIZE   100

Definition at line 294 of file chan_iax2.c.

◆ MIN_JITTER_BUFFER

#define MIN_JITTER_BUFFER   10

Definition at line 663 of file chan_iax2.c.

◆ MIN_RETRY_TIME

#define MIN_RETRY_TIME   100

Definition at line 659 of file chan_iax2.c.

Referenced by iax2_send().

◆ MIN_REUSE_TIME

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

Definition at line 299 of file chan_iax2.c.

Referenced by make_trunk(), and sched_delay_remove().

◆ PEERS_FORMAT

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

Definition at line 6843 of file chan_iax2.c.

Referenced by _iax2_show_peers_one().

◆ PEERS_FORMAT2

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

Definition at line 6842 of file chan_iax2.c.

Referenced by __iax2_show_peers().

◆ PTR_TO_CALLNO

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

◆ PTR_TO_CALLNO_ENTRY

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

Definition at line 902 of file chan_iax2.c.

Referenced by replace_callno().

◆ 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 277 of file chan_iax2.c.

◆ schedule_action

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

◆ TRUNK_CALL_START

#define TRUNK_CALL_START   (IAX_MAX_CALLS / 2)

Definition at line 1174 of file chan_iax2.c.

Referenced by create_callno_pools(), make_trunk(), and replace_callno().

◆ TS_GAP_FOR_JB_RESYNC

#define TS_GAP_FOR_JB_RESYNC   5000

Definition at line 670 of file chan_iax2.c.

Typedef Documentation

◆ callno_entry

typedef uint16_t callno_entry

Definition at line 691 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 1001 of file chan_iax2.c.

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

◆ anonymous enum

anonymous enum
Enumerator
NEW_PREVENT 
NEW_ALLOW 
NEW_FORCE 
NEW_ALLOW_CALLTOKEN_VALIDATED 

Definition at line 2303 of file chan_iax2.c.

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

◆ callno_type

Enumerator
CALLNO_TYPE_NORMAL 
CALLNO_TYPE_TRUNK 

Definition at line 897 of file chan_iax2.c.

◆ 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 491 of file chan_iax2.c.

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

◆ iax2_state

enum iax2_state
Enumerator
IAX_STATE_STARTED 
IAX_STATE_AUTHENTICATED 
IAX_STATE_TBD 

Definition at line 441 of file chan_iax2.c.

441  {
442  IAX_STATE_STARTED = (1 << 0),
443  IAX_STATE_AUTHENTICATED = (1 << 1),
444  IAX_STATE_TBD = (1 << 2),
445 };

◆ iax2_thread_iostate

Enumerator
IAX_IOSTATE_IDLE 
IAX_IOSTATE_READY 
IAX_IOSTATE_PROCESSING 
IAX_IOSTATE_SCHEDREADY 

Definition at line 1042 of file chan_iax2.c.

◆ iax2_thread_type

Enumerator
IAX_THREAD_TYPE_POOL 
IAX_THREAD_TYPE_DYNAMIC 

Definition at line 1049 of file chan_iax2.c.

◆ 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 616 of file chan_iax2.c.

◆ 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 626 of file chan_iax2.c.

Function Documentation

◆ __attempt_transmit()

static void __attempt_transmit ( const void *  data)
static

Definition at line 3548 of file chan_iax2.c.

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(), iax_frame::callno, 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, 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().

3549 {
3550  /* Attempt to transmit the frame to the remote peer...
3551  Called without iaxsl held. */
3552  struct iax_frame *f = (struct iax_frame *)data;
3553  int freeme = 0;
3554  int callno = f->callno;
3555 
3556  /* Make sure this call is still active */
3557  if (callno)
3558  ast_mutex_lock(&iaxsl[callno]);
3559  if (callno && iaxs[callno]) {
3560  if (f->retries < 0) {
3561  /* Already ACK'd */
3562  freeme = 1;
3563  } else if (f->retries >= max_retries) {
3564  /* Too many attempts. Record an error. */
3565  if (f->transfer) {
3566  /* Transfer timeout */
3567  send_command(iaxs[callno], AST_FRAME_IAX, IAX_COMMAND_TXREJ, 0, NULL, 0, -1);
3568  } else if (f->final) {
3569  iax2_destroy(callno);
3570  } else {
3571  if (iaxs[callno]->owner) {
3572  ast_log(LOG_WARNING, "Max retries exceeded to host %s on %s (type = %u, subclass = %d, ts=%u, seqno=%d)\n",
3575  f->af.frametype,
3576  f->af.subclass.integer,
3577  f->ts,
3578  f->oseqno);
3579  }
3580  iaxs[callno]->error = ETIMEDOUT;
3581  if (iaxs[callno]->owner) {
3583  /* Hangup the fd */
3584  iax2_queue_frame(callno, &fr); /* XXX */
3585  /* Remember, owner could disappear */
3586  if (iaxs[callno] && iaxs[callno]->owner)
3588  } else {
3589  if (iaxs[callno]->reg) {
3590  memset(&iaxs[callno]->reg->us, 0, sizeof(iaxs[callno]->reg->us));
3591  iaxs[callno]->reg->regstate = REG_STATE_TIMEOUT;
3592  iaxs[callno]->reg->refresh = IAX_DEFAULT_REG_EXPIRE;
3593  }
3594  iax2_destroy(callno);
3595  }
3596  }
3597  freeme = 1;
3598  } else {
3599  /* Update it if it needs it */
3600  update_packet(f);
3601  /* Attempt transmission */
3602  send_packet(f);
3603  f->retries++;
3604  /* Try again later after 10 times as long */
3605  f->retrytime *= 10;
3606  if (f->retrytime > MAX_RETRY_TIME)
3608  /* Transfer messages max out at one second */
3609  if (f->transfer && (f->retrytime > 1000))
3610  f->retrytime = 1000;
3612  }
3613  } else {
3614  /* Make sure it gets freed */
3615  f->retries = -1;
3616  freeme = 1;
3617  }
3618 
3619  if (freeme) {
3620  /* Don't attempt delivery, just remove it from the queue */
3621  AST_LIST_REMOVE(&frame_queue[callno], f, list);
3622  ast_mutex_unlock(&iaxsl[callno]);
3623  f->retrans = -1; /* this is safe because this is the scheduled function */
3624  /* Free the IAX frame */
3625  iax2_frame_free(f);
3626  } else if (callno) {
3627  ast_mutex_unlock(&iaxsl[callno]);
3628  }
3629 }
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:290
static ast_mutex_t iaxsl[ARRAY_LEN(iaxs)]
chan_iax2_pvt structure locks
Definition: chan_iax2.c:1163
struct ast_frame af
Definition: parser.h:141
struct iax2_registry * reg
Definition: chan_iax2.c:835
void ast_channel_hangupcause_set(struct ast_channel *chan, int value)
static int update_packet(struct iax_frame *f)
Definition: chan_iax2.c:3521
#define LOG_WARNING
Definition: logger.h:274
static int iax2_queue_frame(int callno, struct ast_frame *f)
Queue a frame to a call&#39;s owning asterisk channel.
Definition: chan_iax2.c:3253
enum iax_reg_state regstate
Definition: chan_iax2.c:646
#define IAX_DEFAULT_REG_EXPIRE
Definition: iax2.h:123
Definition: sched.c:76
#define ast_mutex_lock(a)
Definition: lock.h:187
#define NULL
Definition: resample.c:96
#define AST_LIST_REMOVE(head, elm, field)
Removes a specific entry from a list.
Definition: linkedlists.h:855
#define MAX_RETRY_TIME
Definition: chan_iax2.c:660
struct ast_frame_subclass subclass
#define ast_log
Definition: astobj2.c:42
static void iax2_destroy(int callno)
Definition: chan_iax2.c:3459
static struct @112 frame_queue[IAX_MAX_CALLS]
a list of frames that may need to be retransmitted
#define AST_CAUSE_DESTINATION_OUT_OF_ORDER
Definition: causes.h:114
static void iax2_frame_free(struct iax_frame *fr)
Definition: chan_iax2.c:2130
unsigned int final
Definition: parser.h:119
unsigned int transfer
Definition: parser.h:117
void * data
Definition: parser.h:103
static struct chan_iax2_pvt * iaxs[IAX_MAX_CALLS]
an array of iax2 pvt structures
Definition: chan_iax2.c:1125
unsigned short callno
Definition: parser.h:99
static int max_retries
Definition: chan_iax2.c:328
unsigned int ts
Definition: parser.h:109
int retries
Definition: parser.h:107
static int iax2_sched_add(struct ast_sched_context *sched, int when, ast_sched_cb callback, const void *data)
Definition: chan_iax2.c:1687
int retrytime
Definition: parser.h:111
int retrans
Definition: parser.h:129
static int send_packet(struct iax_frame *f)
Definition: chan_iax2.c:3402
struct ast_sockaddr addr
Definition: chan_iax2.c:731
struct ast_sockaddr us
Definition: chan_iax2.c:649
const char * ast_channel_name(const struct ast_channel *chan)
struct ast_channel * owner
Definition: chan_iax2.c:763
static int send_command(struct chan_iax2_pvt *, char, int, unsigned int, const unsigned char *, int, int)
Definition: chan_iax2.c:7731
Data structure associated with a single frame of data.
int oseqno
Definition: parser.h:125
enum ast_frame_type frametype
static int attempt_transmit(const void *data)
Definition: chan_iax2.c:3631
#define ast_mutex_unlock(a)
Definition: lock.h:188

◆ __auth_reject()

static void __auth_reject ( const void *  nothing)
static

Definition at line 9282 of file chan_iax2.c.

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, iax_ie_data::pos, and send_command_final().

Referenced by auth_reject().

9283 {
9284  /* Called from IAX thread only, without iaxs lock */
9285  int callno = (int)(long)(nothing);
9286  struct iax_ie_data ied;
9287  ast_mutex_lock(&iaxsl[callno]);
9288  if (iaxs[callno]) {
9289  memset(&ied, 0, sizeof(ied));
9290  if (iaxs[callno]->authfail == IAX_COMMAND_REGREJ) {
9291  iax_ie_append_str(&ied, IAX_IE_CAUSE, "Registration Refused");
9293  } else if (iaxs[callno]->authfail == IAX_COMMAND_REJECT) {
9294  iax_ie_append_str(&ied, IAX_IE_CAUSE, "No authority found");
9296  }
9297  send_command_final(iaxs[callno], AST_FRAME_IAX, iaxs[callno]->authfail, 0, ied.buf, ied.pos, -1);
9298  }
9299  ast_mutex_unlock(&iaxsl[callno]);
9300 }
static ast_mutex_t iaxsl[ARRAY_LEN(iaxs)]
chan_iax2_pvt structure locks
Definition: chan_iax2.c:1163
#define AST_CAUSE_FACILITY_REJECTED
Definition: causes.h:116
#define ast_mutex_lock(a)
Definition: lock.h:187
#define IAX_IE_CAUSECODE
Definition: iax2.h:172
#define AST_CAUSE_FACILITY_NOT_SUBSCRIBED
Definition: causes.h:125
static struct chan_iax2_pvt * iaxs[IAX_MAX_CALLS]
an array of iax2 pvt structures
Definition: chan_iax2.c:1125
static int send_command_final(struct chan_iax2_pvt *, char, int, unsigned int, const unsigned char *, int, int)
Definition: chan_iax2.c:7756
int iax_ie_append_byte(struct iax_ie_data *ied, unsigned char ie, unsigned char dat)
Definition: parser.c:774
int iax_ie_append_str(struct iax_ie_data *ied, unsigned char ie, const char *str)
Definition: parser.c:769
#define IAX_IE_CAUSE
Definition: iax2.h:152
#define ast_mutex_unlock(a)
Definition: lock.h:188

◆ __auto_congest()

static void __auto_congest ( const void *  nothing)
static

Definition at line 4724 of file chan_iax2.c.

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

Referenced by auto_congest().

4725 {
4726  int callno = PTR_TO_CALLNO(nothing);
4728  ast_mutex_lock(&iaxsl[callno]);
4729  if (iaxs[callno]) {
4730  iaxs[callno]->initid = -1;
4731  iax2_queue_frame(callno, &f);
4732  ast_log(LOG_NOTICE, "Auto-congesting call due to slow response\n");
4733  }
4734  ast_mutex_unlock(&iaxsl[callno]);
4735 }
static ast_mutex_t iaxsl[ARRAY_LEN(iaxs)]
chan_iax2_pvt structure locks
Definition: chan_iax2.c:1163
static int iax2_queue_frame(int callno, struct ast_frame *f)
Queue a frame to a call&#39;s owning asterisk channel.
Definition: chan_iax2.c:3253
#define ast_mutex_lock(a)
Definition: lock.h:187
#define ast_log
Definition: astobj2.c:42
#define PTR_TO_CALLNO(a)
Definition: chan_iax2.c:288
static struct chan_iax2_pvt * iaxs[IAX_MAX_CALLS]
an array of iax2 pvt structures
Definition: chan_iax2.c:1125
#define LOG_NOTICE
Definition: logger.h:263
Data structure associated with a single frame of data.
#define ast_mutex_unlock(a)
Definition: lock.h:188

◆ __auto_hangup()

static void __auto_hangup ( const void *  nothing)
static

Definition at line 9331 of file chan_iax2.c.

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, iax_ie_data::pos, and send_command_final().

Referenced by auto_hangup().

9332 {
9333  /* Called from IAX thread only, without iaxs lock */
9334  int callno = (int)(long)(nothing);
9335  struct iax_ie_data ied;
9336  ast_mutex_lock(&iaxsl[callno]);
9337  if (iaxs[callno]) {
9338  memset(&ied, 0, sizeof(ied));
9339  iax_ie_append_str(&ied, IAX_IE_CAUSE, "Timeout");
9341  send_command_final(iaxs[callno], AST_FRAME_IAX, IAX_COMMAND_HANGUP, 0, ied.buf, ied.pos, -1);
9342  }
9343  ast_mutex_unlock(&iaxsl[callno]);
9344 }
static ast_mutex_t iaxsl[ARRAY_LEN(iaxs)]
chan_iax2_pvt structure locks
Definition: chan_iax2.c:1163
#define ast_mutex_lock(a)
Definition: lock.h:187
#define AST_CAUSE_NO_USER_RESPONSE
Definition: causes.h:107
#define IAX_IE_CAUSECODE
Definition: iax2.h:172
static struct chan_iax2_pvt * iaxs[IAX_MAX_CALLS]
an array of iax2 pvt structures
Definition: chan_iax2.c:1125
static int send_command_final(struct chan_iax2_pvt *, char, int, unsigned int, const unsigned char *, int, int)
Definition: chan_iax2.c:7756
int iax_ie_append_byte(struct iax_ie_data *ied, unsigned char ie, unsigned char dat)
Definition: parser.c:774
int iax_ie_append_str(struct iax_ie_data *ied, unsigned char ie, const char *str)
Definition: parser.c:769
#define IAX_IE_CAUSE
Definition: iax2.h:152
#define ast_mutex_unlock(a)
Definition: lock.h:188

◆ __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 3340 of file chan_iax2.c.

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

Referenced by __get_from_jb(), and schedule_delivery().

3341 {
3342  /* Just deliver the packet by using queueing. This is called by
3343  the IAX thread with the iaxsl lock held. */
3344  struct iax_frame *fr = data;
3345  fr->retrans = -1;
3347  if (iaxs[fr->callno] && !ast_test_flag64(iaxs[fr->callno], IAX_ALREADYGONE))
3348  iax2_queue_frame(fr->callno, &fr->af);
3349  /* Free our iax frame */
3350  iax2_frame_free(fr);
3351  /* And don't run again */
3352  return 0;
3353 }
struct ast_frame af
Definition: parser.h:141
static int iax2_queue_frame(int callno, struct ast_frame *f)
Queue a frame to a call&#39;s owning asterisk channel.
Definition: chan_iax2.c:3253
static void iax2_frame_free(struct iax_frame *fr)
Definition: chan_iax2.c:2130
void * data
Definition: parser.h:103
static struct chan_iax2_pvt * iaxs[IAX_MAX_CALLS]
an array of iax2 pvt structures
Definition: chan_iax2.c:1125
unsigned short callno
Definition: parser.h:99
int retrans
Definition: parser.h:129
#define ast_clear_flag(p, flag)
Definition: utils.h:77
#define IAX_ALREADYGONE
Definition: chan_iax2.c:462
#define ast_test_flag64(p, flag)
Definition: utils.h:120

◆ __expire_registry()

static void __expire_registry ( const void *  data)
static

Definition at line 8898 of file chan_iax2.c.

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, 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().

8899 {
8900  struct iax2_peer *peer = (struct iax2_peer *) data;
8901  RAII_VAR(struct ast_json *, blob, NULL, ast_json_unref);
8902 
8903  if (!peer)
8904  return;
8905  if (peer->expire == -1) {
8906  /* Removed already (possibly through CLI), ignore */
8907  return;
8908  }
8909 
8910  peer->expire = -1;
8911 
8912  ast_debug(1, "Expiring registration for peer '%s'\n", peer->name);
8914  realtime_update_peer(peer->name, &peer->addr, 0);
8916  blob = ast_json_pack("{s: s, s: s}",
8917  "peer_status", "Unregistered",
8918  "cause", "Expired");
8920  /* modify entry in peercnts table as _not_ registered */
8921  peercnt_modify((unsigned char) 0, 0, &peer->addr);
8922  /* Reset the address */
8923  ast_sockaddr_setnull(&peer->addr);
8924  /* Reset expiry value */
8925  peer->expiry = min_reg_expire;
8926  if (!ast_test_flag64(peer, IAX_TEMPONLY))
8927  ast_db_del("IAX/Registry", peer->name);
8928  register_peer_exten(peer, 0);
8929  ast_devstate_changed(AST_DEVICE_UNAVAILABLE, AST_DEVSTATE_CACHABLE, "IAX2/%s", peer->name); /* Activate notification */
8930  if (iax2_regfunk)
8931  iax2_regfunk(peer->name, 0);
8932 
8933  if (ast_test_flag64(peer, IAX_RTAUTOCLEAR))
8934  unlink_peer(peer);
8935 
8936  peer_unref(peer);
8937 }
struct ast_json * ast_json_pack(char const *format,...)
Helper for creating complex JSON values.
Definition: json.c:591
int expire
Definition: chan_iax2.c:569
static void realtime_update_peer(const char *peername, struct ast_sockaddr *sockaddr, time_t regtime)
Definition: chan_iax2.c:4566
static struct iax2_peer * peer_unref(struct iax2_peer *peer)
Definition: chan_iax2.c:2028
void ast_json_unref(struct ast_json *value)
Decrease refcount on value. If refcount reaches zero, value is freed.
Definition: json.c:73
static void unlink_peer(struct iax2_peer *peer)
Definition: chan_iax2.c:8879
static void register_peer_exten(struct iax2_peer *peer, int onoff)
Definition: chan_iax2.c:8860
const ast_string_field name
Definition: chan_iax2.c:554
void ast_endpoint_set_state(struct ast_endpoint *endpoint, enum ast_endpoint_state state)
Updates the state of the given endpoint.
#define NULL
Definition: resample.c:96
static void ast_sockaddr_setnull(struct ast_sockaddr *addr)
Sets address addr to null.
Definition: netsock2.h:140
int expiry
Definition: chan_iax2.c:570
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:452
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
#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:911
#define IAX_RTCACHEFRIENDS
Definition: chan_iax2.c:470
static int(* iax2_regfunk)(const char *username, int onoff)
Definition: chan_iax2.c:366
struct stasis_message_type * ast_endpoint_state_type(void)
Message type for endpoint state changes.
static void peercnt_modify(unsigned char reg, uint16_t limit, struct ast_sockaddr *sockaddr)
Definition: chan_iax2.c:2603
static int min_reg_expire
Definition: chan_iax2.c:355
static struct ast_flags64 globalflags
Definition: chan_iax2.c:437
struct ast_endpoint * endpoint
Definition: chan_iax2.c:590
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 ast_sockaddr addr
Definition: chan_iax2.c:557
#define IAX_RTAUTOCLEAR
Definition: chan_iax2.c:472
int ast_db_del(const char *family, const char *key)
Delete entry in astdb.
Definition: main/db.c:429
Abstract JSON element (object, array, string, int, ...).
#define IAX_RTUPDATE
Definition: chan_iax2.c:471
#define IAX_TEMPONLY
Definition: chan_iax2.c:455
#define ast_test_flag64(p, flag)
Definition: utils.h:120

◆ __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

Definition at line 3108 of file chan_iax2.c.

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(), host, iax2_getpeername(), iax2_sched_add(), IAX_FORCE_ENCRYPT, IAX_NOTRANSFER, IAX_RECVCONNECTEDLINE, IAX_SENDCONNECTEDLINE, IAX_TRANSFERMEDIA, IAX_USEJITTERBUF, iaxdebug, 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(), chan_iax2_pvt::sockfd, store_by_peercallno(), and chan_iax2_pvt::transfer.

Referenced by find_callno(), and find_callno_locked().

3109 {
3110  int res = 0;
3111  int x;
3112  /* this call is calltoken validated as long as it is either NEW_FORCE
3113  * or NEW_ALLOW_CALLTOKEN_VALIDATED */
3114  int validated = (new > NEW_ALLOW) ? 1 : 0;
3115  char host[80];
3116 
3117  if (new <= NEW_ALLOW) {
3118  if (callno) {
3119  struct chan_iax2_pvt *pvt;
3120  struct chan_iax2_pvt tmp_pvt = {
3121  .callno = dcallno,
3122  .peercallno = callno,
3123  .transfercallno = callno,
3124  /* hack!! */
3125  .frames_received = check_dcallno,
3126  };
3127 
3128  ast_sockaddr_copy(&tmp_pvt.addr, addr);
3129  /* this works for finding normal call numbers not involving transfering */
3130  if ((pvt = ao2_find(iax_peercallno_pvts, &tmp_pvt, OBJ_POINTER))) {
3131  if (return_locked) {
3132  ast_mutex_lock(&iaxsl[pvt->callno]);
3133  }
3134  res = pvt->callno;
3135  ao2_ref(pvt, -1);
3136  pvt = NULL;
3137  return res;
3138  }
3139  /* this searches for transfer call numbers that might not get caught otherwise */
3140  memset(&tmp_pvt.addr, 0, sizeof(tmp_pvt.addr));
3141  ast_sockaddr_copy(&tmp_pvt.transfer, addr);
3142  if ((pvt = ao2_find(iax_transfercallno_pvts, &tmp_pvt, OBJ_POINTER))) {
3143  if (return_locked) {
3144  ast_mutex_lock(&iaxsl[pvt->callno]);
3145  }
3146  res = pvt->callno;
3147  ao2_ref(pvt, -1);
3148  pvt = NULL;
3149  return res;
3150  }
3151  }
3152  /* This will occur on the first response to a message that we initiated,
3153  * such as a PING. */
3154  if (dcallno) {
3155  ast_mutex_lock(&iaxsl[dcallno]);
3156  }
3157  if (callno && dcallno && iaxs[dcallno] && !iaxs[dcallno]->peercallno && match(addr, callno, dcallno, iaxs[dcallno], check_dcallno)) {
3158  iaxs[dcallno]->peercallno = callno;
3159  res = dcallno;
3160  store_by_peercallno(iaxs[dcallno]);
3161  if (!res || !return_locked) {
3162  ast_mutex_unlock(&iaxsl[dcallno]);
3163  }
3164  return res;
3165  }
3166  if (dcallno) {
3167  ast_mutex_unlock(&iaxsl[dcallno]);
3168  }
3169  }
3170  if (!res && (new >= NEW_ALLOW)) {
3172 
3173  /* It may seem odd that we look through the peer list for a name for
3174  * this *incoming* call. Well, it is weird. However, users don't
3175  * have an IP address/port number that we can match against. So,
3176  * this is just checking for a peer that has that IP/port and
3177  * assuming that we have a user of the same name. This isn't always
3178  * correct, but it will be changed if needed after authentication. */
3179  if (!iax2_getpeername(*addr, host, sizeof(host)))
3180  snprintf(host, sizeof(host), "%s", ast_sockaddr_stringify(addr));
3181 
3182  if (peercnt_add(addr)) {
3183  /* This address has hit its callnumber limit. When the limit
3184  * is reached, the connection is not added to the peercnts table.*/
3185  return 0;
3186  }
3187 
3188  if (get_unused_callno(CALLNO_TYPE_NORMAL, validated, &entry)) {
3189  /* since we ran out of space, remove the peercnt
3190  * entry we added earlier */
3191  peercnt_remove_by_addr(addr);
3192  ast_log(LOG_WARNING, "No more space\n");
3193  return 0;
3194  }
3195  x = CALLNO_ENTRY_GET_CALLNO(entry);
3196  ast_mutex_lock(&iaxsl[x]);
3197 
3198  iaxs[x] = new_iax(addr, host);
3199  if (iaxs[x]) {
3200  if (iaxdebug)
3201  ast_debug(1, "Creating new call structure %d\n", x);
3202  iaxs[x]->callno_entry = entry;
3203  iaxs[x]->sockfd = sockfd;
3204  ast_sockaddr_copy(&iaxs[x]->addr, addr);
3205  iaxs[x]->peercallno = callno;
3206  iaxs[x]->callno = x;
3208  iaxs[x]->expiry = min_reg_expire;
3209  iaxs[x]->pingid = iax2_sched_add(sched, ping_time * 1000, send_ping, (void *)(long)x);
3210  iaxs[x]->lagid = iax2_sched_add(sched, lagrq_time * 1000, send_lagrq, (void *)(long)x);
3211  iaxs[x]->amaflags = amaflags;
3217 
3218  if (iaxs[x]->peercallno) {
3220  }
3221  } else {
3222  ast_log(LOG_WARNING, "Out of resources\n");
3223  ast_mutex_unlock(&iaxsl[x]);
3225  return 0;
3226  }
3227  if (!return_locked)
3228  ast_mutex_unlock(&iaxsl[x]);
3229  res = x;
3230  }
3231  return res;
3232 }
static ast_mutex_t iaxsl[ARRAY_LEN(iaxs)]
chan_iax2_pvt structure locks
Definition: chan_iax2.c:1163
static char accountcode[AST_MAX_ACCOUNT_CODE]
Definition: chan_iax2.c:428
uint16_t callno_entry
Definition: chan_iax2.c:691
#define ast_copy_flags64(dest, src, flagz)
Definition: utils.h:141
static char parkinglot[AST_MAX_CONTEXT]
Definition: chan_mgcp.c:163
static int amaflags
Definition: chan_iax2.c:431
static struct ao2_container * iax_peercallno_pvts
Another container of iax2_pvt structures.
Definition: chan_iax2.c:1154
static int send_lagrq(const void *data)
Definition: chan_iax2.c:1804
#define IAX_USEJITTERBUF
Definition: chan_iax2.c:458
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:171
#define OBJ_POINTER
Definition: astobj2.h:1154
static int send_ping(const void *data)
Definition: chan_iax2.c:1740
#define LOG_WARNING
Definition: logger.h:274
static int iax2_getpeername(struct ast_sockaddr addr, char *host, int len)
Definition: chan_iax2.c:2045
static struct chan_iax2_pvt * new_iax(struct ast_sockaddr *addr, const char *host)
Definition: chan_iax2.c:2243
#define IAX_FORCE_ENCRYPT
Definition: chan_iax2.c:482
static int ping_time
Definition: chan_iax2.c:329
Definition: sched.c:76
int callno
Definition: chan_iax2.c:574
#define ast_mutex_lock(a)
Definition: lock.h:187
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:2315
static int peercnt_add(struct ast_sockaddr *addr)
Definition: chan_iax2.c:2631
#define NULL
Definition: resample.c:96
#define CALLNO_ENTRY_GET_CALLNO(a)
Definition: chan_iax2.c:907
callno_entry callno_entry
Definition: chan_iax2.c:739
static char mohinterpret[MAX_MUSICCLASS]
Definition: chan_iax2.c:429
static char default_parkinglot[AST_MAX_CONTEXT]
Definition: chan_iax2.c:318
static int lagrq_time
Definition: chan_iax2.c:330
static struct ao2_container * iax_transfercallno_pvts
Another container of iax2_pvt structures.
Definition: chan_iax2.c:1170
unsigned int pingtime
Definition: chan_iax2.c:727
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:452
#define ast_log
Definition: astobj2.c:42
static char host[256]
Definition: muted.c:77
#define DEFAULT_RETRY_TIME
Definition: chan_iax2.c:293
static char mohsuggest[MAX_MUSICCLASS]
Definition: chan_iax2.c:430
unsigned short peercallno
Definition: chan_iax2.c:741
#define ao2_ref(o, delta)
Definition: astobj2.h:464
static int iaxdebug
Definition: chan_iax2.c:416
#define IAX_RECVCONNECTEDLINE
Definition: chan_iax2.c:481
static void store_by_peercallno(struct chan_iax2_pvt *pvt)
Definition: chan_iax2.c:2418
static int replace_callno(const void *obj)
Definition: chan_iax2.c:2982
static struct chan_iax2_pvt * iaxs[IAX_MAX_CALLS]
an array of iax2 pvt structures
Definition: chan_iax2.c:1125
static char * ast_sockaddr_stringify(const struct ast_sockaddr *addr)
Wrapper around ast_sockaddr_stringify_fmt() with default format.
Definition: netsock2.h:260
static int min_reg_expire
Definition: chan_iax2.c:355
#define CALLNO_ENTRY_TO_PTR(a)
Definition: chan_iax2.c:903
static struct ast_flags64 globalflags
Definition: chan_iax2.c:437
#define IAX_TRANSFERMEDIA
Definition: chan_iax2.c:475
static int iax2_sched_add(struct ast_sched_context *sched, int when, ast_sched_cb callback, const void *data)
Definition: chan_iax2.c:1687
static int get_unused_callno(enum callno_type type, int validated, callno_entry *entry)
Definition: chan_iax2.c:2905
#define IAX_NOTRANSFER
Definition: chan_iax2.c:457
#define ao2_find(container, arg, flags)
Definition: astobj2.h:1756
struct ast_sockaddr addr
Definition: chan_iax2.c:731
Definition: search.h:40
unsigned short callno
Definition: chan_iax2.c:737
#define IAX_SENDCONNECTEDLINE
Definition: chan_iax2.c:480
struct ast_sockaddr transfer
Definition: chan_iax2.c:847
static int peercnt_remove_by_addr(struct ast_sockaddr *addr)
Definition: chan_iax2.c:2722
#define ast_mutex_unlock(a)
Definition: lock.h:188
#define ast_string_field_set(x, field, data)
Set a field to a simple string value.
Definition: stringfields.h:514

◆ __get_from_jb()

static void __get_from_jb ( const void *  p)
static

Definition at line 4125 of file chan_iax2.c.

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, 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, 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().

4126 {
4127  int callno = PTR_TO_CALLNO(p);
4128  struct chan_iax2_pvt *pvt = NULL;
4129  struct iax_frame *fr;
4130  jb_frame frame;
4131  int ret;
4132  long ms;
4133  long next;
4134  struct timeval now = ast_tvnow();
4135 
4136  /* Make sure we have a valid private structure before going on */
4137  ast_mutex_lock(&iaxsl[callno]);
4138  pvt = iaxs[callno];
4139  if (!pvt) {
4140  /* No go! */
4141  ast_mutex_unlock(&iaxsl[callno]);
4142  return;
4143  }
4144 
4145  pvt->jbid = -1;
4146 
4147  /* round up a millisecond since ast_sched_runq does; */
4148  /* prevents us from spinning while waiting for our now */
4149  /* to catch up with runq's now */
4150  now.tv_usec += 1000;
4151 
4152  ms = ast_tvdiff_ms(now, pvt->rxcore);
4153 
4154  if(ms >= (next = jb_next(pvt->jb))) {
4155  struct ast_format *voicefmt;
4157  ret = jb_get(pvt->jb, &frame, ms, voicefmt ? ast_format_get_default_ms(voicefmt) : 20);
4158  switch(ret) {
4159  case JB_OK:
4160  fr = frame.data;
4161  __do_deliver(fr);
4162  /* __do_deliver() can cause the call to disappear */
4163  pvt = iaxs[callno];
4164  break;
4165  case JB_INTERP:
4166  {
4167  struct ast_frame af = { 0, };
4168 
4169  /* create an interpolation frame */
4171  af.subclass.format = voicefmt;
4172  af.samples = frame.ms * (ast_format_get_sample_rate(voicefmt) / 1000);
4173  af.src = "IAX2 JB interpolation";
4174  af.delivery = ast_tvadd(pvt->rxcore, ast_samp2tv(next, 1000));
4176 
4177  /* queue the frame: For consistency, we would call __do_deliver here, but __do_deliver wants an iax_frame,
4178  * which we'd need to malloc, and then it would free it. That seems like a drag */
4179  if (!ast_test_flag64(iaxs[callno], IAX_ALREADYGONE)) {
4180  iax2_queue_frame(callno, &af);
4181  /* iax2_queue_frame() could cause the call to disappear */
4182  pvt = iaxs[callno];
4183  }
4184  }
4185  break;
4186  case JB_DROP:
4187  iax2_frame_free(frame.data);
4188  break;
4189  case JB_NOFRAME:
4190  case JB_EMPTY:
4191  /* do nothing */
4192  break;
4193  default:
4194  /* shouldn't happen */
4195  break;
4196  }
4197  }
4198  if (pvt)
4199  update_jbsched(pvt);
4200  ast_mutex_unlock(&iaxsl[callno]);
4201 }
static ast_mutex_t iaxsl[ARRAY_LEN(iaxs)]
chan_iax2_pvt structure locks
Definition: chan_iax2.c:1163
struct iax_frame * next
Definition: parser.h:139
struct timeval rxcore
Definition: chan_iax2.c:753
struct ast_format * ast_format_compatibility_bitfield2format(uint64_t bitfield)
Convert a bitfield to its respective format structure.
static int iax2_queue_frame(int callno, struct ast_frame *f)
Queue a frame to a call&#39;s owning asterisk channel.
Definition: chan_iax2.c:3253
Definition of a media format.
Definition: format.c:43
struct timeval ast_tvnow(void)
Returns current timeval. Meant to replace calls to gettimeofday().
Definition: time.h:150
#define ast_mutex_lock(a)
Definition: lock.h:187
int64_t ast_tvdiff_ms(struct timeval end, struct timeval start)
Computes the difference (in milliseconds) between two struct timeval instances.
Definition: time.h:98
jitterbuf * jb
Definition: chan_iax2.c:755
#define NULL
Definition: resample.c:96
enum jb_return_code jb_get(jitterbuf *jb, jb_frame *frame, long now, long interpl)
get a frame for time now (receiver&#39;s time) return value is one of JB_OK: You&#39;ve got frame! JB_DROP: H...
Definition: jitterbuf.c:785
struct ast_frame_subclass subclass
long jb_next(jitterbuf *jb)
when is the next frame due out, in receiver&#39;s time (0=EMPTY) This value may change as frames are adde...
Definition: jitterbuf.c:767
#define AST_FRIENDLY_OFFSET
Offset into a frame&#39;s data buffer.
const char * src
#define PTR_TO_CALLNO(a)
Definition: chan_iax2.c:288
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:238
static int __do_deliver(void *data)
Definition: chan_iax2.c:3340
iax2_format voiceformat
Definition: chan_iax2.c:703
static void iax2_frame_free(struct iax_frame *fr)
Definition: chan_iax2.c:2130
void * data
Definition: jitterbuf.h:100
static struct chan_iax2_pvt * iaxs[IAX_MAX_CALLS]
an array of iax2 pvt structures
Definition: chan_iax2.c:1125
struct timeval ast_tvadd(struct timeval a, struct timeval b)
Returns the sum of two timevals a + b.
Definition: extconf.c:2283
long ms
Definition: jitterbuf.h:102
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 timeval delivery
#define IAX_ALREADYGONE
Definition: chan_iax2.c:462
static void update_jbsched(struct chan_iax2_pvt *pvt)
Definition: chan_iax2.c:4108
unsigned int ast_format_get_sample_rate(const struct ast_format *format)
Get the sample rate of a media format.
Definition: format.c:379
Data structure associated with a single frame of data.
enum ast_frame_type frametype
unsigned short callno
Definition: chan_iax2.c:737
struct ast_format * format
#define ast_mutex_unlock(a)
Definition: lock.h:188
#define ast_test_flag64(p, flag)
Definition: utils.h:120

◆ __iax2_do_register_s()

static void __iax2_do_register_s ( const void *  data)
static

Definition at line 8541 of file chan_iax2.c.

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().

8542 {
8543  struct iax2_registry *reg = (struct iax2_registry *)data;
8544 
8545  if (ast_sockaddr_isnull(&reg->addr)) {
8546  reg->addr.ss.ss_family = AST_AF_UNSPEC;
8547  ast_dnsmgr_lookup(reg->hostname, &reg->addr, &reg->dnsmgr, srvlookup ? "_iax._udp" : NULL);
8548  if (!ast_sockaddr_port(&reg->addr)) {
8549  ast_sockaddr_set_port(&reg->addr, reg->port);
8550  } else {
8551  reg->port = ast_sockaddr_port(&reg->addr);
8552  }
8553  }
8554 
8555  reg->expire = -1;
8556  iax2_do_register(reg);
8557 }
struct sockaddr_storage ss
Definition: netsock2.h:98
static int srvlookup
Definition: chan_iax2.c:358
struct ast_dnsmgr_entry * dnsmgr
Definition: chan_iax2.c:650
#define NULL
Definition: resample.c:96
static int ast_sockaddr_isnull(const struct ast_sockaddr *addr)
Checks if the ast_sockaddr is null. "null" in this sense essentially means uninitialized, or having a 0 length.
Definition: netsock2.h:127
#define ast_sockaddr_port(addr)
Get the port number of a socket address.
Definition: netsock2.h:521
#define ast_sockaddr_set_port(addr, port)
Sets the port number of a socket address.
Definition: netsock2.h:537
char hostname[]
Definition: chan_iax2.c:653
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
struct ast_sockaddr addr
Definition: chan_iax2.c:641
static int iax2_do_register(struct iax2_registry *reg)
Definition: chan_iax2.c:12136

◆ __iax2_poke_noanswer()

static void __iax2_poke_noanswer ( const void *  data)
static

Definition at line 12317 of file chan_iax2.c.

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(), 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().

12318 {
12319  struct iax2_peer *peer = (struct iax2_peer *)data;
12320  int callno;
12321 
12322  if (peer->lastms > -1) {
12323  RAII_VAR(struct ast_json *, blob, NULL, ast_json_unref);
12324 
12325  ast_log(LOG_NOTICE, "Peer '%s' is now UNREACHABLE! Time: %d\n", peer->name, peer->lastms);
12327  blob = ast_json_pack("{s: s, s: i}",
12328  "peer_status", "Unreachable",
12329  "time", peer->lastms);
12331  ast_devstate_changed(AST_DEVICE_UNAVAILABLE, AST_DEVSTATE_CACHABLE, "IAX2/%s", peer->name); /* Activate notification */
12332  }
12333  if ((callno = peer->callno) > 0) {
12334  ast_mutex_lock(&iaxsl[callno]);
12335  iax2_destroy(callno);
12336  ast_mutex_unlock(&iaxsl[callno]);
12337  }
12338  peer->callno = 0;
12339  peer->lastms = -1;
12340  /* Try again quickly */
12342  if (peer->pokeexpire == -1)
12343  peer_unref(peer);
12344 }
static ast_mutex_t iaxsl[ARRAY_LEN(iaxs)]
chan_iax2_pvt structure locks
Definition: chan_iax2.c:1163
struct ast_json * ast_json_pack(char const *format,...)
Helper for creating complex JSON values.
Definition: json.c:591
static struct iax2_peer * peer_unref(struct iax2_peer *peer)
Definition: chan_iax2.c:2028
void ast_json_unref(struct ast_json *value)
Decrease refcount on value. If refcount reaches zero, value is freed.
Definition: json.c:73
const ast_string_field name
Definition: chan_iax2.c:554
Definition: sched.c:76
int callno
Definition: chan_iax2.c:574
void ast_endpoint_set_state(struct ast_endpoint *endpoint, enum ast_endpoint_state state)
Updates the state of the given endpoint.
#define ast_mutex_lock(a)
Definition: lock.h:187
#define NULL
Definition: resample.c:96
#define ast_log
Definition: astobj2.c:42
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
static void iax2_destroy(int callno)
Definition: chan_iax2.c:3459
#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:911
int lastms
Definition: chan_iax2.c:576
static int iax2_poke_peer_s(const void *data)
Definition: chan_iax2.c:9398
int pokeexpire
Definition: chan_iax2.c:575
struct stasis_message_type * ast_endpoint_state_type(void)
Message type for endpoint state changes.
#define LOG_NOTICE
Definition: logger.h:263
static int iax2_sched_add(struct ast_sched_context *sched, int when, ast_sched_cb callback, const void *data)
Definition: chan_iax2.c:1687
struct ast_endpoint * endpoint
Definition: chan_iax2.c:590
int pokefreqnotok
Definition: chan_iax2.c:580
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.
static struct iax2_peer * peer_ref(struct iax2_peer *peer)
Definition: chan_iax2.c:2022
Abstract JSON element (object, array, string, int, ...).
#define ast_mutex_unlock(a)
Definition: lock.h:188

◆ __iax2_poke_peer_s()

static void __iax2_poke_peer_s ( const void *  data)
static

Definition at line 9391 of file chan_iax2.c.

References iax2_poke_peer(), and peer_unref().

Referenced by iax2_poke_peer_s().

9392 {
9393  struct iax2_peer *peer = (struct iax2_peer *)data;
9394  iax2_poke_peer(peer, 0);
9395  peer_unref(peer);
9396 }
static struct iax2_peer * peer_unref(struct iax2_peer *peer)
Definition: chan_iax2.c:2028
static int iax2_poke_peer(struct iax2_peer *peer, int heldcall)
Definition: chan_iax2.c:12367

◆ __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 6946 of file chan_iax2.c.

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, show_peers_context::total_peers, and show_peers_context::unmonitored_peers.

Referenced by handle_cli_iax2_show_peers(), and manager_iax2_show_peers().

6947 {
6948  struct show_peers_context cont = {
6949  .havepattern = 0,
6950  .idtext = "",
6951  .registeredonly = 0,
6952 
6953  .peerlist = 0,
6954 
6955  .total_peers = 0,
6956  .online_peers = 0,
6957  .offline_peers = 0,
6958  .unmonitored_peers = 0,
6959  };
6960 
6961  struct ao2_iterator i;
6962 
6963  struct iax2_peer *peer = NULL;
6964 
6965  switch (argc) {
6966  case 6:
6967  if (!strcasecmp(argv[3], "registered"))
6968  cont.registeredonly = 1;
6969  else
6970  return RESULT_SHOWUSAGE;
6971  if (!strcasecmp(argv[4], "like")) {
6972  if (regcomp(&cont.regexbuf, argv[5], REG_EXTENDED | REG_NOSUB))
6973  return RESULT_SHOWUSAGE;
6974  cont.havepattern = 1;
6975  } else
6976  return RESULT_SHOWUSAGE;
6977  break;
6978  case 5:
6979  if (!strcasecmp(argv[3], "like")) {
6980  if (regcomp(&cont.regexbuf, argv[4], REG_EXTENDED | REG_NOSUB))
6981  return RESULT_SHOWUSAGE;
6982  cont.havepattern = 1;
6983  } else
6984  return RESULT_SHOWUSAGE;
6985  break;
6986  case 4:
6987  if (!strcasecmp(argv[3], "registered")) {
6988  cont.registeredonly = 1;
6989  } else {
6990  return RESULT_SHOWUSAGE;
6991  }
6992  break;
6993  case 3:
6994  break;
6995  default:
6996  return RESULT_SHOWUSAGE;
6997  }
6998 
6999 
7000  if (!s) {
7001  ast_cli(fd, PEERS_FORMAT2, "Name/Username", "Host", " ", "Mask", "Port", " ", "Status", "Description");
7002  }
7003 
7004  i = ao2_iterator_init(peers, 0);
7005  for (; (peer = ao2_iterator_next(&i)); peer_unref(peer)) {
7006 
7007  if (cont.registeredonly && ast_sockaddr_isnull(&peer->addr)) {
7008  continue;
7009  }
7010  if (cont.havepattern && regexec(&cont.regexbuf, peer->name, 0, NULL, 0)) {
7011  continue;
7012  }
7013 
7014  _iax2_show_peers_one(fd, s, &cont, peer);
7015 
7016  }
7018 
7019  if (!s) {
7020  ast_cli(fd,"%d iax2 peers [%d online, %d offline, %d unmonitored]\n",
7021  cont.total_peers, cont.online_peers, cont.offline_peers, cont.unmonitored_peers);
7022  }
7023 
7024  if (cont.havepattern) {
7025  regfree(&cont.regexbuf);
7026  }
7027 
7028  if (total) {
7029  *total = cont.total_peers;
7030  }
7031 
7032  return RESULT_SUCCESS;
7033 
7034 }
static struct iax2_peer * peer_unref(struct iax2_peer *peer)
Definition: chan_iax2.c:2028
#define RESULT_SHOWUSAGE
Definition: cli.h:41
const ast_string_field name
Definition: chan_iax2.c:554
Used in the sip_show_peers functions to pass parameters.
Definition: chan_iax2.c:6830
void ao2_iterator_destroy(struct ao2_iterator *iter)
Destroy a container iterator.
#define NULL
Definition: resample.c:96
void ast_cli(int fd, const char *fmt,...)
Definition: clicompat.c:6
#define PEERS_FORMAT2
Definition: chan_iax2.c:6842
static int ast_sockaddr_isnull(const struct ast_sockaddr *addr)
Checks if the ast_sockaddr is null. "null" in this sense essentially means uninitialized, or having a 0 length.
Definition: netsock2.h:127
#define ao2_iterator_next(iter)
Definition: astobj2.h:1933
struct ast_sockaddr addr
Definition: chan_iax2.c:557
When we need to walk through a container, we use an ao2_iterator to keep track of the current positio...
Definition: astobj2.h:1841
static int total
Definition: res_adsi.c:968
static void _iax2_show_peers_one(int fd, struct mansession *s, struct show_peers_context *cont, struct iax2_peer *peer)
Definition: chan_iax2.c:6845
#define RESULT_SUCCESS
Definition: cli.h:40
struct ao2_iterator ao2_iterator_init(struct ao2_container *c, int flags) attribute_warn_unused_result
Create an iterator for a container.

◆ __reg_module()

static void __reg_module ( void  )
static

Definition at line 14974 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 1653 of file chan_iax2.c.

References ast_copy_string(), ast_debug, iax2_thread::cond, iax2_thread::curfunc, stasis_subscription::data, find_idle_thread(), IAX_IOSTATE_SCHEDREADY, iax2_thread::iostate, iax2_thread::lock, NULL, iax2_thread::scheddata, iax2_thread::schedfunc, signal_condition(), and thread.

1654 {
1655  struct iax2_thread *thread;
1656  static time_t lasterror;
1657  time_t t;
1658 
1659  thread = find_idle_thread();
1660  if (thread != NULL) {
1661  thread->schedfunc = func;
1662  thread->scheddata = data;
1663  thread->iostate = IAX_IOSTATE_SCHEDREADY;
1664 #ifdef DEBUG_SCHED_MULTITHREAD
1665  ast_copy_string(thread->curfunc, funcname, sizeof(thread->curfunc));
1666 #endif
1667  signal_condition(&thread->lock, &thread->cond);
1668  return 0;
1669  }
1670  time(&t);
1671  if (t != lasterror) {
1672  lasterror = t;
1673  ast_debug(1, "Out of idle IAX2 threads for scheduling! (%s)\n", funcname);
1674  }
1675 
1676  return -1;
1677 }
pthread_t thread
Definition: app_meetme.c:1089
static struct iax2_thread * find_idle_thread(void)
Definition: chan_iax2.c:1586
#define NULL
Definition: resample.c:96
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:452
enum iax2_thread_iostate iostate
Definition: chan_iax2.c:1063
ast_cond_t cond
Definition: chan_iax2.c:1082
const void * scheddata
Definition: chan_iax2.c:1066
void(* schedfunc)(const void *)
Definition: chan_iax2.c:1065
ast_mutex_t lock
Definition: chan_iax2.c:1081
char curfunc[80]
Definition: chan_iax2.c:1069
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition: strings.h:401
static void signal_condition(ast_mutex_t *lock, ast_cond_t *cond)
Definition: chan_iax2.c:1110

◆ __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 7712 of file chan_iax2.c.

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

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

7714 {
7715  struct ast_frame f = { 0, };
7716  int res = 0;
7717 
7718  f.frametype = type;
7719  f.subclass.integer = command;
7720  f.datalen = datalen;
7721  f.src = __FUNCTION__;
7722  f.data.ptr = (void *) data;
7723 
7724  if ((res = queue_signalling(i, &f)) <= 0) {
7725  return res;
7726  }
7727 
7728  return iax2_send(i, &f, ts, seqno, now, transfer, final);
7729 }
static const char type[]
Definition: chan_ooh323.c:109
static int transfer
Definition: chan_mgcp.c:194
struct ast_frame_subclass subclass
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:6543
const char * src
Data structure associated with a single frame of data.
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:2171
union ast_frame::@263 data
enum ast_frame_type frametype

◆ __send_lagrq()

static void __send_lagrq ( const void *  data)
static

Definition at line 1780 of file chan_iax2.c.

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

Referenced by send_lagrq().

1781 {
1782  int callno = PTR_TO_CALLNO(data);
1783 
1784  if (iax2_lock_callno_unless_destroyed(callno) == 0) {
1785  ast_debug(3, "Hangup initiated on call %d, aborting __send_lagrq\n", callno);
1786  return;
1787  }
1788 
1789  /* Mark lagid as invalid scheduler id. */
1790  iaxs[callno]->lagid = -1;
1791 
1792  /* callno is now locked. */
1793  if (iaxs[callno]->peercallno) {
1794  /* Send LAGRQ packet. */
1795  send_command(iaxs[callno], AST_FRAME_IAX, IAX_COMMAND_LAGRQ, 0, NULL, 0, -1);
1796 
1797  /* Schedule sending next lagrq. */
1798  iaxs[callno]->lagid = iax2_sched_add(sched, lagrq_time * 1000, send_lagrq, data);
1799  }
1800 
1801  ast_mutex_unlock(&iaxsl[callno]);
1802 }
static ast_mutex_t iaxsl[ARRAY_LEN(iaxs)]
chan_iax2_pvt structure locks
Definition: chan_iax2.c:1163
static int send_lagrq(const void *data)
Definition: chan_iax2.c:1804
Definition: sched.c:76
#define NULL
Definition: resample.c:96
static int lagrq_time
Definition: chan_iax2.c:330
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:452
static int iax2_lock_callno_unless_destroyed(int callno)
Definition: chan_iax2.c:1698
#define PTR_TO_CALLNO(a)
Definition: chan_iax2.c:288
static struct chan_iax2_pvt * iaxs[IAX_MAX_CALLS]
an array of iax2 pvt structures
Definition: chan_iax2.c:1125
static int iax2_sched_add(struct ast_sched_context *sched, int when, ast_sched_cb callback, const void *data)
Definition: chan_iax2.c:1687
static int send_command(struct chan_iax2_pvt *, char, int, unsigned int, const unsigned char *, int, int)
Definition: chan_iax2.c:7731
union ast_frame::@263 data
#define ast_mutex_unlock(a)
Definition: lock.h:188

◆ __send_ping()

static void __send_ping ( const void *  data)
static

Definition at line 1716 of file chan_iax2.c.

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

Referenced by send_ping().

1717 {
1718  int callno = PTR_TO_CALLNO(data);
1719 
1720  if (iax2_lock_callno_unless_destroyed(callno) == 0) {
1721  ast_debug(3, "Hangup initiated on call %d, aborting __send_ping\n", callno);
1722  return;
1723  }
1724 
1725  /* Mark pingid as invalid scheduler id. */
1726  iaxs[callno]->pingid = -1;
1727 
1728  /* callno is now locked. */
1729  if (iaxs[callno]->peercallno) {
1730  /* Send PING packet. */
1731  send_command(iaxs[callno], AST_FRAME_IAX, IAX_COMMAND_PING, 0, NULL, 0, -1);
1732 
1733  /* Schedule sending next ping. */
1734  iaxs[callno]->pingid = iax2_sched_add(sched, ping_time * 1000, send_ping, data);
1735  }
1736 
1737  ast_mutex_unlock(&iaxsl[callno]);
1738 }
static ast_mutex_t iaxsl[ARRAY_LEN(iaxs)]
chan_iax2_pvt structure locks
Definition: chan_iax2.c:1163
static int send_ping(const void *data)
Definition: chan_iax2.c:1740
static int ping_time
Definition: chan_iax2.c:329
Definition: sched.c:76
#define NULL
Definition: resample.c:96
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:452
static int iax2_lock_callno_unless_destroyed(int callno)
Definition: chan_iax2.c:1698
#define PTR_TO_CALLNO(a)
Definition: chan_iax2.c:288
static struct chan_iax2_pvt * iaxs[IAX_MAX_CALLS]
an array of iax2 pvt structures
Definition: chan_iax2.c:1125
static int iax2_sched_add(struct ast_sched_context *sched, int when, ast_sched_cb callback, const void *data)
Definition: chan_iax2.c:1687
static int send_command(struct chan_iax2_pvt *, char, int, unsigned int, const unsigned char *, int, int)
Definition: chan_iax2.c:7731
union ast_frame::@263 data
#define ast_mutex_unlock(a)
Definition: lock.h:188

◆ __unload_module()

static int __unload_module ( void  )
static

Definition at line 14601 of file chan_iax2.c.

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(), ast_channel_tech::capabilities, cleanup_thread_list(), delete_users(), iax2_destroy(), iax_firmware_unload(), iax_provision_unload(), netthreadid, network_change_stasis_unsubscribe(), NULL, peercnt_remove_cb(), and regcontext.

Referenced by load_module(), and unload_module().

14602 {
14603  int x;
14604 
14607 
14608  ast_manager_unregister("IAXpeers");
14609  ast_manager_unregister("IAXpeerlist");
14610  ast_manager_unregister("IAXnetstats");
14611  ast_manager_unregister("IAXregistry");
14616 
14617  if (netthreadid != AST_PTHREADT_NULL) {
14618  pthread_cancel(netthreadid);
14619  pthread_kill(netthreadid, SIGURG);
14620  pthread_join(netthreadid, NULL);
14621  }
14622 
14623  for (x = 0; x < ARRAY_LEN(iaxs); x++) {
14624  if (iaxs[x]) {
14625  iax2_destroy(x);
14626  }
14627  }
14628 
14629  /* Call for all threads to halt */
14633 
14636  for (x = 0; x < ARRAY_LEN(iaxs); x++) {
14637  if (iaxs[x]) {
14638  iax2_destroy(x);
14639  }
14640  }
14641  ast_manager_unregister( "IAXpeers" );
14642  ast_manager_unregister( "IAXpeerlist" );
14643  ast_manager_unregister( "IAXnetstats" );
14644  ast_manager_unregister( "IAXregistry" );
14649  delete_users();
14652 
14653  for (x = 0; x < ARRAY_LEN(iaxsl); x++) {
14654  ast_mutex_destroy(&iaxsl[x]);
14655  }
14656 
14657  ao2_ref(peers, -1);
14658  ao2_ref(users, -1);
14661  ao2_ref(callno_limits, -1);
14663  if (timer) {
14665  timer = NULL;
14666  }
14668 
14671  sched = NULL;
14672  ao2_ref(peercnts, -1);
14673 
14675  ast_unload_realtime("iaxpeers");
14676 
14679  return 0;
14680 }
static ast_mutex_t iaxsl[ARRAY_LEN(iaxs)]
chan_iax2_pvt structure locks
Definition: chan_iax2.c:1163
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:407
#define ARRAY_LEN(a)
Definition: isdn_lib.c:42
static pthread_t netthreadid
Definition: chan_iax2.c:439
static struct ao2_container * iax_peercallno_pvts
Another container of iax2_pvt structures.
Definition: chan_iax2.c:1154
int ast_cli_unregister_multiple(struct ast_cli_entry *e, int len)
Unregister multiple commands.
Definition: clicompat.c:30
void ast_channel_unregister(const struct ast_channel_tech *tech)
Unregister a channel technology.
Definition: channel.c:570
int ast_netsock_release(struct ast_netsock_list *list)
Definition: netsock.c:85
static struct ast_netsock_list * netsock
Definition: chan_iax2.c:362
int ast_unload_realtime(const char *family)
Release any resources cached for a realtime family.
Definition: main/config.c:3406
Definition: sched.c:76
void ast_timer_close(struct ast_timer *handle)
Close an opened timing handle.
Definition: timing.c:154
int iax_provision_unload(void)
Definition: provision.c:520
void ast_unregister_switch(struct ast_switch *sw)
Unregister an alternative switch.
Definition: pbx_switch.c:76
#define NULL
Definition: resample.c:96
list of users found in the config file
int ast_unregister_application(const char *app)
Unregister an application.
Definition: pbx_app.c:392
static struct ao2_container * iax_transfercallno_pvts
Another container of iax2_pvt structures.
Definition: chan_iax2.c:1170
int ast_context_destroy_by_name(const char *context, const char *registrar)
Destroy a context by name.
Definition: pbx.c:8244
static void iax2_destroy(int callno)
Definition: chan_iax2.c:3459
#define AST_PTHREADT_NULL
Definition: lock.h:66
#define ao2_ref(o, delta)
Definition: astobj2.h:464
static char * papp
Definition: chan_iax2.c:12244
static struct ao2_container * calltoken_ignores
Definition: chan_iax2.c:964
static void delete_users(void)
Definition: chan_iax2.c:13399
static int peercnt_remove_cb(const void *obj)
Definition: chan_iax2.c:2708
static void acl_change_stasis_unsubscribe(void)
Definition: chan_iax2.c:1480
int ast_manager_unregister(const char *action)
Unregister a registered manager command.
Definition: manager.c:7258
static struct ast_taskprocessor * transmit_processor
Definition: chan_iax2.c:934
void iax_firmware_unload(void)
Definition: firmware.c:250
static struct chan_iax2_pvt * iaxs[IAX_MAX_CALLS]
an array of iax2 pvt structures
Definition: chan_iax2.c:1125
static struct ast_netsock_list * outsock
Definition: chan_iax2.c:363
static struct ast_channel_tech iax2_tech
Definition: chan_iax2.c:1293
struct ast_format_cap * capabilities
Definition: channel.h:633
static void cleanup_thread_list(void *head)
Definition: chan_iax2.c:14581
static struct ast_cli_entry cli_iax2[]
Definition: chan_iax2.c:14553
static void network_change_stasis_unsubscribe(void)
Definition: chan_iax2.c:1465
void * ast_taskprocessor_unreference(struct ast_taskprocessor *tps)
Unreference the specified taskprocessor and its reference count will decrement.
static char regcontext[AST_MAX_CONTEXT]
Definition: chan_iax2.c:321
#define ast_mutex_destroy(a)
Definition: lock.h:186
static struct ast_timer * timer
Definition: chan_iax2.c:360
static struct ao2_container * callno_limits
Definition: chan_iax2.c:961
static struct ast_switch iax2_switch
Definition: chan_iax2.c:14543
void ast_sched_context_destroy(struct ast_sched_context *c)
destroys a schedule context
Definition: sched.c:269
static struct ao2_container * peercnts
Definition: chan_iax2.c:958

◆ __unreg_module()

static void __unreg_module ( void  )
static

Definition at line 14974 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 6845 of file chan_iax2.c.

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, 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().

6846 {
6847  char name[256] = "";
6848  char status[64];
6849  int retstatus;
6850  struct ast_str *encmethods = ast_str_alloca(256);
6851 
6852  char *tmp_host, *tmp_mask, *tmp_port;
6853 
6854  tmp_host = ast_strdupa(ast_sockaddr_stringify_addr(&peer->addr));
6855  tmp_mask = ast_strdupa(ast_sockaddr_stringify_addr(&peer->mask));
6856  tmp_port = ast_strdupa(ast_sockaddr_stringify_port(&peer->addr));
6857 
6858  if (!ast_strlen_zero(peer->username)) {
6859  snprintf(name, sizeof(name), "%s/%s", peer->name, peer->username);
6860  } else {
6861  ast_copy_string(name, peer->name, sizeof(name));
6862  }
6863 
6864  encmethods_to_str(peer->encmethods, &encmethods);
6865  retstatus = peer_status(peer, status, sizeof(status));
6866  if (retstatus > 0) {
6867  cont->online_peers++;
6868  } else if (!retstatus) {
6869  cont->offline_peers++;
6870  } else {
6871  cont->unmonitored_peers++;
6872  }
6873 
6874  if (s) {
6875  if (cont->peerlist) { /* IAXpeerlist */
6876  astman_append(s,
6877  "Event: PeerEntry\r\n%s"
6878  "Channeltype: IAX\r\n",
6879  cont->idtext);
6880  if (!ast_strlen_zero(peer->username)) {
6881  astman_append(s,
6882  "ObjectName: %s\r\n"
6883  "ObjectUsername: %s\r\n",
6884  peer->name,
6885  peer->username);
6886  } else {
6887  astman_append(s,
6888  "ObjectName: %s\r\n",
6889  name);
6890  }
6891  } else { /* IAXpeers */
6892  astman_append(s,
6893  "Event: PeerEntry\r\n%s"
6894  "Channeltype: IAX2\r\n"
6895  "ObjectName: %s\r\n",
6896  cont->idtext,
6897  name);
6898  }
6899  astman_append(s,
6900  "ChanObjectType: peer\r\n"
6901  "IPaddress: %s\r\n",
6902  tmp_host);
6903  if (cont->peerlist) { /* IAXpeerlist */
6904  astman_append(s,
6905  "Mask: %s\r\n"
6906  "Port: %s\r\n",
6907  tmp_mask,
6908  tmp_port);
6909  } else { /* IAXpeers */
6910  astman_append(s,
6911  "IPport: %s\r\n",
6912  tmp_port);
6913  }
6914  astman_append(s,
6915  "Dynamic: %s\r\n"
6916  "Trunk: %s\r\n"
6917  "Encryption: %s\r\n"
6918  "Status: %s\r\n",
6919  ast_test_flag64(peer, IAX_DYNAMIC) ? "yes" : "no",
6920  ast_test_flag64(peer, IAX_TRUNK) ? "yes" : "no",
6921  peer->encmethods ? ast_str_buffer(encmethods) : "no",
6922  status);
6923  if (cont->peerlist) { /* IAXpeerlist */
6924  astman_append(s, "\r\n");
6925  } else { /* IAXpeers */
6926  astman_append(s,
6927  "Description: %s\r\n\r\n",
6928  peer->description);
6929  }
6930  } else {
6931  ast_cli(fd, PEERS_FORMAT,
6932  name,
6933  tmp_host,
6934  ast_test_flag64(peer, IAX_DYNAMIC) ? "(D)" : "(S)",
6935  tmp_mask,
6936  tmp_port,
6937  ast_test_flag64(peer, IAX_TRUNK) ? "(T)" : " ",
6938  peer->encmethods ? "(E)" : " ",
6939  status,
6940  peer->description);
6941  }
6942 
6943  cont->total_peers++;
6944 }
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:290
void astman_append(struct mansession *s, const char *fmt,...)
Definition: manager.c:3080
int encmethods
Definition: chan_iax2.c:567
char idtext[256]
Definition: chan_iax2.c:6833
const ast_string_field description
Definition: chan_iax2.c:554
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition: strings.h:714
const ast_string_field name
Definition: chan_iax2.c:554
#define ast_str_alloca(init_len)
Definition: strings.h:800
void ast_cli(int fd, const char *fmt,...)
Definition: clicompat.c:6
#define ast_strlen_zero(foo)
Definition: strings.h:52
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:362
#define IAX_DYNAMIC
Definition: chan_iax2.c:459
#define ast_strdupa(s)
duplicate a string in memory from the stack
Definition: astmm.h:300
static int peer_status(struct iax2_peer *peer, char *status, int statuslen)
peer_status: Report Peer status in character string
Definition: chan_iax2.c:3792
#define IAX_TRUNK
Definition: chan_iax2.c:456
The descriptor of a dynamic string XXX storage will be optimized later if needed We use the ts field ...
Definition: strings.h:584
const ast_string_field username
Definition: chan_iax2.c:554
static const char name[]
Definition: cdr_mysql.c:74
#define PEERS_FORMAT
Definition: chan_iax2.c:6843
struct ast_sockaddr addr
Definition: chan_iax2.c:557
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition: strings.h:401
struct ast_sockaddr mask
Definition: chan_iax2.c:560
static void encmethods_to_str(int e, struct ast_str **buf)
Definition: chan_iax2.c:1750
jack_status_t status
Definition: app_jack.c:146
#define ast_test_flag64(p, flag)
Definition: utils.h:120

◆ 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 14467 of file chan_iax2.c.

References chan_iax2_pvt::addr, 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(), chan_iax2_pvt::callno, IAX_CALLENCRYPTED, LOG_ERROR, chan_iax2_pvt::osptoken, PTR_TO_CALLNO, and chan_iax2_pvt::username.

Referenced by jb_debug_output().

14468 {
14469  struct chan_iax2_pvt *pvt;
14470  unsigned int callno;
14471  int res = 0;
14472 
14473  if (!chan || ast_channel_tech(chan) != &iax2_tech) {
14474  ast_log(LOG_ERROR, "This function requires a valid IAX2 channel\n");
14475  return -1;
14476  }
14477 
14478  callno = PTR_TO_CALLNO(ast_channel_tech_pvt(chan));
14479  ast_mutex_lock(&iaxsl[callno]);
14480  if (!(pvt = iaxs[callno])) {
14481  ast_mutex_unlock(&iaxsl[callno]);
14482  return -1;
14483  }
14484 
14485  if (!strcasecmp(args, "osptoken")) {
14486  ast_copy_string(buf, pvt->osptoken, buflen);
14487  } else if (!strcasecmp(args, "peerip")) {
14489  } else if (!strcasecmp(args, "peername")) {
14490  ast_copy_string(buf, pvt->username, buflen);
14491  } else if (!strcasecmp(args, "secure_signaling") || !strcasecmp(args, "secure_media")) {
14492  snprintf(buf, buflen, "%s", IAX_CALLENCRYPTED(pvt) ? "1" : "");
14493  } else {
14494  res = -1;
14495  }
14496 
14497  ast_mutex_unlock(&iaxsl[callno]);
14498 
14499  return res;
14500 }
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:290
static ast_mutex_t iaxsl[ARRAY_LEN(iaxs)]
chan_iax2_pvt structure locks
Definition: chan_iax2.c:1163
#define IAX_CALLENCRYPTED(pvt)
Definition: chan_iax2.c:395
const ast_string_field osptoken
Definition: chan_iax2.c:816
void * ast_channel_tech_pvt(const struct ast_channel *chan)
char buf[BUFSIZE]
Definition: eagi_proxy.c:66
#define ast_mutex_lock(a)
Definition: lock.h:187
const char * args
static int ast_sockaddr_isnull(const struct ast_sockaddr *addr)
Checks if the ast_sockaddr is null. "null" in this sense essentially means uninitialized, or having a 0 length.
Definition: netsock2.h:127
#define ast_log
Definition: astobj2.c:42
#define PTR_TO_CALLNO(a)
Definition: chan_iax2.c:288
const ast_string_field username
Definition: chan_iax2.c:816
#define LOG_ERROR
Definition: logger.h:285
static struct chan_iax2_pvt * iaxs[IAX_MAX_CALLS]
an array of iax2 pvt structures
Definition: chan_iax2.c:1125
static struct ast_channel_tech iax2_tech
Definition: chan_iax2.c:1293
struct ast_sockaddr addr
Definition: chan_iax2.c:731
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition: strings.h:401
unsigned short callno
Definition: chan_iax2.c:737
const struct ast_channel_tech * ast_channel_tech(const struct ast_channel *chan)
#define ast_mutex_unlock(a)
Definition: lock.h:188

◆ 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 9977 of file chan_iax2.c.

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

9978 {
9979  struct ast_datastore *variablestore;
9980  AST_LIST_HEAD(, ast_var_t) *varlist;
9981  struct ast_var_t *var;
9982 
9983  if (!chan) {
9984  ast_log(LOG_WARNING, "No channel was provided to %s function.\n", cmd);
9985  return -1;
9986  }
9987 
9989  if (!variablestore) {
9990  *buf = '\0';
9991  return 0;
9992  }
9993  varlist = variablestore->data;
9994 
9995  AST_LIST_LOCK(varlist);
9996  AST_LIST_TRAVERSE(varlist, var, entries) {
9997  if (strcmp(var->name, data) == 0) {
9998  ast_copy_string(buf, var->value, len);
9999  break;
10000  }
10001  }
10002  AST_LIST_UNLOCK(varlist);
10003  return 0;
10004 }
#define AST_LIST_LOCK(head)
Locks a list.
Definition: linkedlists.h:39
#define AST_LIST_HEAD(name, type)
Defines a structure to be used to hold a list of specified type.
Definition: linkedlists.h:172
char buf[BUFSIZE]
Definition: eagi_proxy.c:66
#define LOG_WARNING
Definition: logger.h:274
#define AST_LIST_UNLOCK(head)
Attempts to unlock a list.
Definition: linkedlists.h:139
#define var
Definition: ast_expr2f.c:614
Structure for a data store object.
Definition: datastore.h:68
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:2404
#define NULL
Definition: resample.c:96
#define ast_log
Definition: astobj2.c:42
char name[0]
Definition: chanvars.h:31
static int len(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)
char * value
Definition: chanvars.h:30
static const struct ast_datastore_info iax2_variable_datastore_info
Definition: chan_iax2.c:1523
#define AST_LIST_TRAVERSE(head, var, field)
Loops over (traverses) the entries in a list.
Definition: linkedlists.h:490
struct ast_var_t::@249 entries
void * data
Definition: datastore.h:70
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition: strings.h:401

◆ acf_iaxvar_write()

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

Definition at line 10006 of file chan_iax2.c.

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, ast_datastore::inheritance, LOG_ERROR, LOG_WARNING, ast_var_t::name, NULL, and var.

10007 {
10008  struct ast_datastore *variablestore;
10009  AST_LIST_HEAD(, ast_var_t) *varlist;
10010  struct ast_var_t *var;
10011 
10012  if (!chan) {
10013  ast_log(LOG_WARNING, "No channel was provided to %s function.\n", cmd);
10014  return -1;
10015  }
10016 
10018  if (!variablestore) {
10020  if (!variablestore) {
10021  ast_log(LOG_ERROR, "Memory allocation error\n");
10022  return -1;
10023  }
10024  varlist = ast_calloc(1, sizeof(*varlist));
10025  if (!varlist) {
10026  ast_datastore_free(variablestore);
10027  ast_log(LOG_ERROR, "Unable to assign new variable '%s'\n", data);
10028  return -1;
10029  }
10030 
10031  AST_LIST_HEAD_INIT(varlist);
10032  variablestore->data = varlist;
10033  variablestore->inheritance = DATASTORE_INHERIT_FOREVER;
10034  ast_channel_datastore_add(chan, variablestore);
10035  } else
10036  varlist = variablestore->data;
10037 
10038  AST_LIST_LOCK(varlist);
10039  AST_LIST_TRAVERSE_SAFE_BEGIN(varlist, var, entries) {
10040  if (strcmp(var->name, data) == 0) {
10042  ast_var_delete(var);
10043  break;
10044  }
10045  }
10047  var = ast_var_assign(data, value);
10048  if (var)
10049  AST_LIST_INSERT_TAIL(varlist, var, entries);
10050  else
10051  ast_log(LOG_ERROR, "Unable to assign new variable '%s'\n", data);
10052  AST_LIST_UNLOCK(varlist);
10053  return 0;
10054 }
#define AST_LIST_LOCK(head)
Locks a list.
Definition: linkedlists.h:39
#define AST_LIST_HEAD(name, type)
Defines a structure to be used to hold a list of specified type.
Definition: linkedlists.h:172
#define LOG_WARNING
Definition: logger.h:274
#define AST_LIST_UNLOCK(head)
Attempts to unlock a list.
Definition: linkedlists.h:139
#define var
Definition: ast_expr2f.c:614
Structure for a data store object.
Definition: datastore.h:68
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:2404
#define NULL
Definition: resample.c:96
int value
Definition: syslog.c:37
#define AST_LIST_TRAVERSE_SAFE_END
Closes a safe loop traversal block.
Definition: linkedlists.h:614
int ast_datastore_free(struct ast_datastore *datastore)
Free a data store object.
Definition: datastore.c:68
#define ast_log
Definition: astobj2.c:42
#define AST_LIST_REMOVE_CURRENT(field)
Removes the current entry from a list during a traversal.
Definition: linkedlists.h:556
char name[0]
Definition: chanvars.h:31
#define LOG_ERROR
Definition: logger.h:285
#define AST_LIST_INSERT_TAIL(head, elm, field)
Appends a list entry to the tail of a list.
Definition: linkedlists.h:730
void ast_var_delete(struct ast_var_t *var)
Definition: extconf.c:2473
static const struct ast_datastore_info iax2_variable_datastore_info
Definition: chan_iax2.c:1523
#define AST_LIST_HEAD_INIT(head)
Initializes a list head structure.
Definition: linkedlists.h:625
#define ast_calloc(num, len)
A wrapper for calloc()
Definition: astmm.h:204
struct ast_var_t::@249 entries
#define ast_var_assign(name, value)
Definition: chanvars.h:40
#define DATASTORE_INHERIT_FOREVER
Definition: channel.h:193
unsigned int inheritance
Definition: datastore.h:73
void * data
Definition: datastore.h:70
#define ast_datastore_alloc(info, uid)
Definition: datastore.h:89
#define AST_LIST_TRAVERSE_SAFE_BEGIN(head, var, field)
Loops safely over (traverses) the entries in a list.
Definition: linkedlists.h:528
int ast_channel_datastore_add(struct ast_channel *chan, struct ast_datastore *datastore)
Add a datastore to a channel.
Definition: channel.c:2390

◆ acl_change_stasis_cb()

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

Definition at line 1512 of file chan_iax2.c.

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

Referenced by jb_debug_output().

1514 {
1515  if (stasis_message_type(message) != ast_named_acl_change_type()) {
1516  return;
1517  }
1518 
1519  ast_log(LOG_NOTICE, "Reloading chan_iax2 in response to ACL change event.\n");
1520  reload_config(1);
1521 }
struct stasis_message_type * stasis_message_type(const struct stasis_message *msg)
Get the message type for a stasis_message.
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 ...
#define ast_log
Definition: astobj2.c:42
static int reload_config(int forced_reload)
Definition: chan_iax2.c:14010
#define LOG_NOTICE
Definition: logger.h:263

◆ acl_change_stasis_subscribe()

static void acl_change_stasis_subscribe ( void  )
static

Definition at line 1470 of file chan_iax2.c.

References 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().

1471 {
1472  if (!acl_change_sub) {
1477  }
1478 }
struct stasis_topic * ast_security_topic(void)
A stasis_topic which publishes messages for security related issues.
static void acl_change_stasis_cb(void *data, struct stasis_subscription *sub, struct stasis_message *message)
Definition: chan_iax2.c:1512
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
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 ...
#define NULL
Definition: resample.c:96
#define stasis_subscribe(topic, callback, data)
Definition: stasis.h:652
static struct stasis_subscription * acl_change_sub
Definition: chan_iax2.c:324
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

◆ acl_change_stasis_unsubscribe()

static void acl_change_stasis_unsubscribe ( void  )
static

Definition at line 1480 of file chan_iax2.c.

References stasis_unsubscribe_and_join().

Referenced by __unload_module().

1481 {
1483 }
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
static struct stasis_subscription * acl_change_sub
Definition: chan_iax2.c:324

◆ add_calltoken_ignore()

static int add_calltoken_ignore ( const char *  addr)
static

Definition at line 2795 of file chan_iax2.c.

References 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, addr_range::delme, addr_range::ha, LOG_WARNING, NULL, and OBJ_POINTER.

Referenced by set_config().

2796 {
2797  struct addr_range tmp;
2798  struct addr_range *addr_range = NULL;
2799  struct ast_ha *ha = NULL;
2800  int error = 0;
2801 
2802  if (ast_strlen_zero(addr)) {
2803  ast_log(LOG_WARNING, "invalid calltokenoptional (null)\n");
2804  return -1;
2805  }
2806 
2807  ha = ast_append_ha("permit", addr, NULL, &error);
2808 
2809  /* check for valid config information */
2810  if (error) {
2811  ast_log(LOG_WARNING, "Error %d creating calltokenoptional entry %s\n", error, addr);
2812  return -1;
2813  }
2814 
2815  ast_copy_ha(ha, &tmp.ha);
2816  /* find or create the addr_range */
2817  if ((addr_range = ao2_find(calltoken_ignores, &tmp, OBJ_POINTER))) {
2818  ao2_lock(addr_range);
2819  addr_range->delme = 0;
2820  ao2_unlock(addr_range);
2821  } else if ((addr_range = ao2_alloc(sizeof(*addr_range), NULL))) {
2822  /* copy over config data into addr_range object */
2823  ast_copy_ha(ha, &addr_range->ha); /* this is safe because only one ha is possible */
2824  ao2_link(calltoken_ignores, addr_range);
2825  } else {
2826  ast_free_ha(ha);
2827  return -1;
2828  }
2829 
2830  ast_free_ha(ha);
2831  ao2_ref(addr_range, -1); /* decrement ref from ao2_find and ao2_alloc, only container ref remains */
2832 
2833  return 0;
2834 }
struct ast_sockaddr addr
Definition: acl.h:53
struct ast_ha ha
Definition: chan_iax2.c:994
#define OBJ_POINTER
Definition: astobj2.h:1154
#define LOG_WARNING
Definition: logger.h:274
static int tmp()
Definition: bt_open.c:389
unsigned char delme
Definition: chan_iax2.c:998
#define ao2_unlock(a)
Definition: astobj2.h:730
#define NULL
Definition: resample.c:96
#define ast_strlen_zero(foo)
Definition: strings.h:52
internal representation of ACL entries In principle user applications would have no need for this...
Definition: acl.h:51
#define ast_log
Definition: astobj2.c:42
#define ao2_ref(o, delta)
Definition: astobj2.h:464
#define ao2_lock(a)
Definition: astobj2.h:718
static struct ao2_container * calltoken_ignores
Definition: chan_iax2.c:964
#define ao2_alloc(data_size, destructor_fn)
Definition: astobj2.h:411
#define ao2_find(container, arg, flags)
Definition: astobj2.h:1756
void ast_free_ha(struct ast_ha *ha)
Free a list of HAs.
Definition: acl.c:222
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
int error(const char *format,...)
Definition: utils/frame.c:999
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
#define ao2_link(container, obj)
Definition: astobj2.h:1549

◆ add_empty_calltoken_ie()

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

Definition at line 4800 of file chan_iax2.c.

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().

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

◆ addr_range_cmp_cb()

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

Definition at line 2451 of file chan_iax2.c.

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

Referenced by load_objects().

2452 {
2453  struct addr_range *lim1 = obj, *lim2 = arg;
2454  return (!(ast_sockaddr_cmp_addr(&lim1->ha.addr, &lim2->ha.addr)) &&
2455  !(ast_sockaddr_cmp_addr(&lim1->ha.netmask, &lim2->ha.netmask))) ?
2456  CMP_MATCH | CMP_STOP : 0;
2457 }
struct ast_sockaddr addr
Definition: acl.h:53
struct ast_ha ha
Definition: chan_iax2.c:994
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

◆ addr_range_delme_cb()

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

Definition at line 2438 of file chan_iax2.c.

References addr_range::delme.

Referenced by set_config_destroy().

2439 {
2440  struct addr_range *lim = obj;
2441  lim->delme = 1;
2442  return 0;
2443 }
unsigned char delme
Definition: chan_iax2.c:998

◆ addr_range_hash_cb()

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

Definition at line 2445 of file chan_iax2.c.

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

Referenced by load_objects().

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

◆ addr_range_match_address_cb()

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

Definition at line 2475 of file chan_iax2.c.

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().

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

◆ apply_context()

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

Definition at line 7776 of file chan_iax2.c.

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

Referenced by check_access().

7777 {
7778  while(con) {
7779  if (!strcmp(con->context, context) || !strcmp(con->context, "*"))
7780  return -1;
7781  con = con->next;
7782  }
7783  return 0;
7784 }
struct iax2_context * next
Definition: chan_iax2.c:449
char context[AST_MAX_CONTEXT]
Definition: chan_iax2.c:448
static char context[AST_MAX_CONTEXT]
Definition: chan_alsa.c:116

◆ ast_cli_netstats()

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

Definition at line 7477 of file chan_iax2.c.

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, jb_getinfo(), jb_info::jitter, chan_iax2_pvt::last_iax_message, iax_rr::losscnt, jb_info::losspct, iax_rr::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().

7478 {
7479  int x;
7480  int numchans = 0;
7481  char first_message[10] = { 0, };
7482  char last_message[10] = { 0, };
7483 #define ACN_FORMAT1 "%-20.25s %4u %4d %4d %5d %3d %5d %4d %6d %4d %4d %5d %3d %5d %4d %6d %s%s %4s%s\n"
7484 #define ACN_FORMAT2 "%s %u %d %d %d %d %d %d %d %d %d %d %d %d %d %d %s%s %s%s\n"
7485  for (x = 0; x < ARRAY_LEN(iaxs); x++) {
7486  ast_mutex_lock(&iaxsl[x]);
7487  if (iaxs[x]) {
7488  int localjitter, localdelay, locallost, locallosspct, localdropped, localooo;
7489  jb_info jbinfo;
7490  iax_frame_subclass2str(iaxs[x]->first_iax_message & ~MARK_IAX_SUBCLASS_TX, first_message, sizeof(first_message));
7491  iax_frame_subclass2str(iaxs[x]->last_iax_message & ~MARK_IAX_SUBCLASS_TX, last_message, sizeof(last_message));
7492 
7494  jb_getinfo(iaxs[x]->jb, &jbinfo);
7495  localjitter = jbinfo.jitter;
7496  localdelay = jbinfo.current - jbinfo.min;
7497  locallost = jbinfo.frames_lost;
7498  locallosspct = jbinfo.losspct/1000;
7499  localdropped = jbinfo.frames_dropped;
7500  localooo = jbinfo.frames_ooo;
7501  } else {
7502  localjitter = -1;
7503  localdelay = 0;
7504  locallost = -1;
7505  locallosspct = -1;
7506  localdropped = 0;
7507  localooo = -1;
7508  }
7509  if (s)
7510  astman_append(s, limit_fmt ? ACN_FORMAT1 : ACN_FORMAT2,
7511  iaxs[x]->owner ? ast_channel_name(iaxs[x]->owner) : "(None)",
7512  iaxs[x]->pingtime,
7513  localjitter,
7514  localdelay,
7515  locallost,
7516  locallosspct,
7517  localdropped,
7518  localooo,
7519  iaxs[x]->frames_received/1000,
7520  iaxs[x]->remote_rr.jitter,
7521  iaxs[x]->remote_rr.delay,
7522  iaxs[x]->remote_rr.losscnt,
7523  iaxs[x]->remote_rr.losspct,
7524  iaxs[x]->remote_rr.dropped,
7525  iaxs[x]->remote_rr.ooo,
7526  iaxs[x]->remote_rr.packets/1000,
7527  (iaxs[x]->first_iax_message & MARK_IAX_SUBCLASS_TX) ? "Tx:" : "Rx:",
7528  first_message,
7529  (iaxs[x]->last_iax_message & MARK_IAX_SUBCLASS_TX) ? "Tx:" : "Rx:",
7530  last_message);
7531  else
7532  ast_cli(fd, limit_fmt ? ACN_FORMAT1 : ACN_FORMAT2,
7533  iaxs[x]->owner ? ast_channel_name(iaxs[x]->owner) : "(None)",
7534  iaxs[x]->pingtime,
7535  localjitter,
7536  localdelay,
7537  locallost,
7538  locallosspct,
7539  localdropped,
7540  localooo,
7541  iaxs[x]->frames_received/1000,
7542  iaxs[x]->remote_rr.jitter,
7543  iaxs[x]->remote_rr.delay,
7544  iaxs[x]->remote_rr.losscnt,
7545  iaxs[x]->remote_rr.losspct,
7546  iaxs[x]->remote_rr.dropped,
7547  iaxs[x]->remote_rr.ooo,
7548  iaxs[x]->remote_rr.packets/1000,
7549  (iaxs[x]->first_iax_message & MARK_IAX_SUBCLASS_TX) ? "Tx:" : "Rx:",
7550  first_message,
7551  (iaxs[x]->last_iax_message & MARK_IAX_SUBCLASS_TX) ? "Tx:" : "Rx:",
7552  last_message);
7553  numchans++;
7554  }
7555  ast_mutex_unlock(&iaxsl[x]);
7556  }
7557 
7558  return numchans;
7559 }
static ast_mutex_t iaxsl[ARRAY_LEN(iaxs)]
chan_iax2_pvt structure locks
Definition: chan_iax2.c:1163
void astman_append(struct mansession *s, const char *fmt,...)
Definition: manager.c:3080
#define ARRAY_LEN(a)
Definition: isdn_lib.c:42
void iax_frame_subclass2str(enum iax_frame_subclass subclass, char *str, size_t len)
Definition: parser.c:462
#define IAX_USEJITTERBUF
Definition: chan_iax2.c:458
long losspct
Definition: jitterbuf.h:88
#define MARK_IAX_SUBCLASS_TX
Definition: chan_iax2.c:673
int ooo
Definition: chan_iax2.c:688
long frames_lost
Definition: jitterbuf.h:80
int packets
Definition: chan_iax2.c:685
int dropped
Definition: chan_iax2.c:687
#define ast_mutex_lock(a)
Definition: lock.h:187
void ast_cli(int fd, const char *fmt,...)
Definition: clicompat.c:6
long frames_ooo
Definition: jitterbuf.h:82
int losspct
Definition: chan_iax2.c:683
int last_iax_message
Definition: chan_iax2.c:723
long frames_dropped
Definition: jitterbuf.h:81
int first_iax_message
Definition: chan_iax2.c:721
int delay
Definition: chan_iax2.c:686
static struct chan_iax2_pvt * iaxs[IAX_MAX_CALLS]
an array of iax2 pvt structures
Definition: chan_iax2.c:1125
int losscnt
Definition: chan_iax2.c:684
struct iax_rr remote_rr
Definition: chan_iax2.c:875
const char * ast_channel_name(const struct ast_channel *chan)
enum jb_return_code jb_getinfo(jitterbuf *jb, jb_info *stats)
get jitterbuf info: only "statistics" may be valid
Definition: jitterbuf.c:815
long min
Definition: jitterbuf.h:85
long jitter
Definition: jitterbuf.h:84
long current
Definition: jitterbuf.h:86
#define ACN_FORMAT2
#define ast_mutex_unlock(a)
Definition: lock.h:188
#define ACN_FORMAT1
#define ast_test_flag64(p, flag)
Definition: utils.h:120

◆ 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 5829 of file chan_iax2.c.

References chan_iax2_pvt::accountcode, chan_iax2_pvt::adsi, chan_iax2_pvt::amaflags, ast_party_caller::ani, chan_iax2_pvt::ani, 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_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(), chan_iax2_pvt::iaxvars, ast_party_caller::id, ast_datastore::inheritance, chan_iax2_pvt::language, LOG_ERROR, LOG_WARNING, ast_variable::name, ast_party_id::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().

5832 {
5833  struct ast_channel *tmp = NULL;
5834  struct chan_iax2_pvt *i;
5835  struct iax2_peer *peer;
5836  struct ast_variable *v = NULL;
5837  struct ast_format_cap *native;
5838  struct ast_format *tmpfmt;
5839  ast_callid callid;
5840  char *peer_name = NULL;
5841 
5842  if (!(i = iaxs[callno])) {
5843  ast_log(LOG_WARNING, "No IAX2 pvt found for callno '%d' !\n", callno);
5844  return NULL;
5845  }
5846 
5847  if (!capability) {
5848  ast_log(LOG_WARNING, "No formats specified for call to: IAX2/%s-%d\n",
5849  i->host, i->callno);
5850  return NULL;
5851  }
5853  if (!native) {
5854  return NULL;
5855  }
5856  if (iax2_codec_pref_best_bitfield2cap(capability, prefs, native)
5857  || !ast_format_cap_count(native)) {
5858  ast_log(LOG_WARNING, "No requested formats available for call to: IAX2/%s-%d\n",
5859  i->host, i->callno);
5860  ao2_ref(native, -1);
5861  return NULL;
5862  }
5863 
5864  if (!ast_strlen_zero(i->peer)) {
5865  peer_name = ast_strdupa(i->peer);
5866  } else if (!ast_strlen_zero(i->host)) {
5867  peer_name = ast_strdupa(i->host);
5868  }
5869 
5870  /* Don't hold call lock while making a channel or looking up a peer */
5871  ast_mutex_unlock(&iaxsl[callno]);
5872 
5873  if (!ast_strlen_zero(peer_name)) {
5874  peer = find_peer(peer_name, 1);
5875  if (peer && peer->endpoint) {
5877  i->accountcode, i->exten, i->context, assignedids, requestor,
5878  i->amaflags, peer->endpoint, "IAX2/%s-%d", i->host, i->callno);
5879  }
5880  ao2_cleanup(peer);
5881  }
5882 
5883  if (!tmp) {
5884  tmp = ast_channel_alloc(1, state, i->cid_num, i->cid_name, i->accountcode,
5885  i->exten, i->context, assignedids, requestor, i->amaflags, "IAX2/%s-%d",
5886  i->host, i->callno);
5887  }
5888 
5889  ast_mutex_lock(&iaxsl[callno]);
5890  if (i != iaxs[callno]) {
5891  if (tmp) {
5892  /* unlock and relock iaxsl[callno] to preserve locking order */
5893  ast_mutex_unlock(&iaxsl[callno]);
5894  ast_channel_unlock(tmp);
5895  tmp = ast_channel_release(tmp);
5896  ast_mutex_lock(&iaxsl[callno]);
5897  }
5898  ao2_ref(native, -1);
5899  return NULL;
5900  }
5901  if (!tmp) {
5902  ao2_ref(native, -1);
5903  return NULL;
5904  }
5905 
5907 
5908  if ((callid = iaxs[callno]->callid)) {
5909  ast_channel_callid_set(tmp, callid);
5910  }
5911 
5913 
5914  /* We can support any format by default, until we get restricted */
5915  ast_channel_nativeformats_set(tmp, native);
5916  tmpfmt = ast_format_cap_get_format(native, 0);
5917 
5918  ast_channel_set_readformat(tmp, tmpfmt);
5919  ast_channel_set_rawreadformat(tmp, tmpfmt);
5920  ast_channel_set_writeformat(tmp, tmpfmt);
5921  ast_channel_set_rawwriteformat(tmp, tmpfmt);
5922 
5923  ao2_ref(tmpfmt, -1);
5924  ao2_ref(native, -1);
5925 
5927 
5928  if (!ast_strlen_zero(i->parkinglot))
5929  ast_channel_parkinglot_set(tmp, i->parkinglot);
5930  /* Don't use ast_set_callerid() here because it will
5931  * generate a NewCallerID event before the NewChannel event */
5932  if (!ast_strlen_zero(i->ani)) {
5933  ast_channel_caller(tmp)->ani.number.valid = 1;
5935  } else if (!ast_strlen_zero(i->cid_num)) {
5936  ast_channel_caller(tmp)->ani.number.valid = 1;
5938  }
5940  if (!ast_strlen_zero(i->rdnis)) {
5943  }
5948  if (!ast_strlen_zero(i->language))
5949  ast_channel_language_set(tmp, i->language);
5950  if (!ast_strlen_zero(i->accountcode))
5951  ast_channel_accountcode_set(tmp, i->accountcode);
5952  if (i->amaflags)
5954