[asterisk-commits] kmoore: branch kmoore/iax2-ipv6 r384473 - in /team/kmoore/iax2-ipv6: channels...
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Mon Apr 1 11:02:11 CDT 2013
Author: kmoore
Date: Mon Apr 1 11:02:08 2013
New Revision: 384473
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=384473
Log:
Commit work up to this point
IAX2 has been refactored to use IPv6. Most of this work was done during
the last Astricon and it is entirely untested.
Modified:
team/kmoore/iax2-ipv6/channels/chan_iax2.c
team/kmoore/iax2-ipv6/channels/iax2/include/parser.h
team/kmoore/iax2-ipv6/channels/iax2/parser.c
team/kmoore/iax2-ipv6/include/asterisk/netsock2.h
team/kmoore/iax2-ipv6/main/acl.c
team/kmoore/iax2-ipv6/main/netsock2.c
Modified: team/kmoore/iax2-ipv6/channels/chan_iax2.c
URL: http://svnview.digium.com/svn/asterisk/team/kmoore/iax2-ipv6/channels/chan_iax2.c?view=diff&rev=384473&r1=384472&r2=384473
==============================================================================
--- team/kmoore/iax2-ipv6/channels/chan_iax2.c (original)
+++ team/kmoore/iax2-ipv6/channels/chan_iax2.c Mon Apr 1 11:02:08 2013
@@ -522,12 +522,12 @@
struct ast_sockaddr addr;
int formats;
int sockfd; /*!< Socket to use for transmission */
- struct in_addr mask;
+ struct ast_sockaddr mask;
int adsi;
uint64_t flags;
/* Dynamic Registration fields */
- struct sockaddr_in defaddr; /*!< Default address if there is one */
+ struct ast_sockaddr defaddr; /*!< Default address if there is one */
int authmethods; /*!< Authentication methods (IAX_AUTH_*) */
int encmethods; /*!< Encryption methods (IAX_ENCRYPT_*) */
@@ -558,7 +558,7 @@
struct iax2_trunk_peer {
ast_mutex_t lock;
int sockfd;
- struct sockaddr_in addr;
+ struct ast_sockaddr addr;
struct timeval txtrunktime; /*!< Transmit trunktime */
struct timeval rxtrunktime; /*!< Receive trunktime */
struct timeval lasttxtime; /*!< Last transmitted trunktime */
@@ -609,7 +609,7 @@
enum iax_reg_state regstate;
int messages; /*!< Message count, low 8 bits = new, high 8 bits = old */
int callno; /*!< Associated call number if applicable */
- struct sockaddr_in us; /*!< Who the server thinks we are */
+ struct ast_sockaddr us; /*!< Who the server thinks we are */
struct ast_dnsmgr_entry *dnsmgr; /*!< DNS refresh manager */
AST_LIST_ENTRY(iax2_registry) entry;
};
@@ -689,7 +689,7 @@
/*! Max time for initial response */
int maxtime;
/*! Peer Address */
- struct sockaddr_in addr;
+ struct ast_sockaddr addr;
/*! Actual used codec preferences */
struct ast_codec_pref prefs;
/*! Requested codec preferences */
@@ -805,7 +805,7 @@
/*! Transfer identifier */
int transferid;
/*! Who we are IAX transferring to */
- struct sockaddr_in transfer;
+ struct ast_sockaddr transfer;
/*! What's the new call number for the transfer */
unsigned short transfercallno;
/*! Transfer encrypt AES-128 Key */
@@ -937,7 +937,7 @@
* consumed by a single ip address */
struct peercnt {
/*! ip address consuming call numbers */
- unsigned long addr;
+ struct ast_sockaddr addr;
/*! Number of call numbers currently used by this ip address */
uint16_t cur;
/*! Max call numbers allowed for this ip address */
@@ -991,8 +991,8 @@
static AST_LIST_HEAD_STATIC(dpcache, iax2_dpcache);
static void reg_source_db(struct iax2_peer *p);
-static struct iax2_peer *realtime_peer(const char *peername, struct sockaddr_in *sin);
-static struct iax2_user *realtime_user(const char *username, struct sockaddr_in *sin);
+static struct iax2_peer *realtime_peer(const char *peername, struct ast_sockaddr *sin);
+static struct iax2_user *realtime_user(const char *username, struct ast_sockaddr *sin);
static int ast_cli_netstats(struct mansession *s, int fd, int limit_fmt);
static char *complete_iax2_peers(const char *line, const char *word, int pos, int state, uint64_t flags);
@@ -1030,7 +1030,7 @@
int actions;
pthread_t threadid;
int threadnum;
- struct sockaddr_in iosin;
+ struct ast_sockaddr iosin;
unsigned char readbuf[4096];
unsigned char *buf;
ssize_t buf_len;
@@ -1047,7 +1047,7 @@
frames for that callno to other threads */
struct {
unsigned short callno;
- struct sockaddr_in sin;
+ struct ast_sockaddr sin;
unsigned char type;
unsigned char csub;
} ffinfo;
@@ -1141,15 +1141,14 @@
#define TRUNK_CALL_START (IAX_MAX_CALLS / 2)
/* Debug routines... */
-static struct sockaddr_in debugaddr;
-
-static void iax_outputframe(struct iax_frame *f, struct ast_iax2_full_hdr *fhi, int rx, struct sockaddr_in *sin, int datalen)
+static struct ast_sockaddr debugaddr;
+
+static void iax_outputframe(struct iax_frame *f, struct ast_iax2_full_hdr *fhi, int rx, struct ast_sockaddr *sin, int datalen)
{
if (iaxdebug ||
- (sin && debugaddr.sin_addr.s_addr &&
- (!ntohs(debugaddr.sin_port) ||
- debugaddr.sin_port == sin->sin_port) &&
- debugaddr.sin_addr.s_addr == sin->sin_addr.s_addr)) {
+ (!ast_sockaddr_isnull(sin) && !ast_sockaddr_is_any(&debugaddr) &&
+ (!ast_sockaddr_port(&debugaddr) ||
+ !ast_sockaddr_cmp(&debugaddr, sin)))) {
if (iaxdebug) {
iax_showframe(f, fhi, rx, sin, datalen);
} else {
@@ -1219,7 +1218,7 @@
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_poke_peer(struct iax2_peer *peer, int heldcall);
-static int iax2_provision(struct sockaddr_in *end, int sockfd, const char *dest, const char *template, int force);
+static int iax2_provision(struct ast_sockaddr *end, int sockfd, const char *dest, const char *template, int force);
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);
@@ -1253,7 +1252,7 @@
static void build_rand_pad(unsigned char *buf, ssize_t len);
static int get_unused_callno(enum callno_type type, int validated, callno_entry *entry);
static int replace_callno(const void *obj);
-static void sched_delay_remove(struct sockaddr_in *sin, callno_entry entry);
+static void sched_delay_remove(struct ast_sockaddr *sin, callno_entry entry);
static void network_change_event_cb(const struct ast_event *, void *);
static void acl_change_event_cb(const struct ast_event *, void *);
@@ -1876,7 +1875,7 @@
return NULL;
}
-static int iax2_getpeername(struct sockaddr_in sin, char *host, int len)
+static int iax2_getpeername(struct ast_sockaddr *sin, char *host, int len)
{
struct iax2_peer *peer = NULL;
int res = 0;
@@ -1884,12 +1883,7 @@
i = ao2_iterator_init(peers, 0);
while ((peer = ao2_iterator_next(&i))) {
- struct sockaddr_in peer_addr;
-
- ast_sockaddr_to_sin(&peer->addr, &peer_addr);
-
- if ((peer_addr.sin_addr.s_addr == sin.sin_addr.s_addr) &&
- (peer_addr.sin_port == sin.sin_port)) {
+ if (!ast_sockaddr_cmp(&peer->addr, sin)) {
ast_copy_string(host, peer->name, len);
peer_unref(peer);
res = 1;
@@ -1900,7 +1894,7 @@
ao2_iterator_destroy(&i);
if (!peer) {
- peer = realtime_peer(NULL, &sin);
+ peer = realtime_peer(NULL, sin);
if (peer) {
ast_copy_string(host, peer->name, len);
peer_unref(peer);
@@ -2057,7 +2051,7 @@
}
-static struct chan_iax2_pvt *new_iax(struct sockaddr_in *sin, const char *host)
+static struct chan_iax2_pvt *new_iax(struct ast_sockaddr *sin, const char *host)
{
struct chan_iax2_pvt *tmp;
jb_conf jbconf;
@@ -2128,10 +2122,9 @@
NEW_ALLOW_CALLTOKEN_VALIDATED = 3,
};
-static int match(struct sockaddr_in *sin, unsigned short callno, unsigned short dcallno, const struct chan_iax2_pvt *cur, int check_dcallno)
-{
- if ((cur->addr.sin_addr.s_addr == sin->sin_addr.s_addr) &&
- (cur->addr.sin_port == sin->sin_port)) {
+static int match(struct ast_sockaddr *sin, unsigned short callno, unsigned short dcallno, const struct chan_iax2_pvt *cur, int check_dcallno)
+{
+ if (!ast_sockaddr_cmp(&cur->addr, sin)) {
/* This is the main host */
if ( (cur->peercallno == 0 || cur->peercallno == callno) &&
(check_dcallno ? dcallno == cur->callno : 1) ) {
@@ -2139,8 +2132,7 @@
return 1;
}
}
- if ((cur->transfer.sin_addr.s_addr == sin->sin_addr.s_addr) &&
- (cur->transfer.sin_port == sin->sin_port) && (cur->transferring)) {
+ if (!ast_sockaddr_cmp(&cur->transfer, sin) && (cur->transferring)) {
/* We're transferring */
if ((dcallno == cur->callno) || (cur->transferring == TRANSFER_MEDIAPASS && cur->transfercallno == callno))
return 1;
@@ -2263,9 +2255,7 @@
static int addr_range_hash_cb(const void *obj, const int flags)
{
const struct addr_range *lim = obj;
- struct sockaddr_in sin;
- ast_sockaddr_to_sin(&lim->ha.addr, &sin);
- return abs((int) sin.sin_addr.s_addr);
+ return ast_sockaddr_hash(&lim->ha.addr);
}
static int addr_range_cmp_cb(void *obj, void *arg, int flags)
@@ -2279,26 +2269,23 @@
static int peercnt_hash_cb(const void *obj, const int flags)
{
const struct peercnt *peercnt = obj;
- return abs((int) peercnt->addr);
+ return ast_sockaddr_hash(&peercnt->addr);
}
static int peercnt_cmp_cb(void *obj, void *arg, int flags)
{
struct peercnt *peercnt1 = obj, *peercnt2 = arg;
- return (peercnt1->addr == peercnt2->addr) ? CMP_MATCH | CMP_STOP : 0;
+ return !ast_sockaddr_cmp_addr(&peercnt1->addr, &peercnt2->addr) ? CMP_MATCH | CMP_STOP : 0;
}
static int addr_range_match_address_cb(void *obj, void *arg, int flags)
{
struct addr_range *addr_range = obj;
- struct sockaddr_in *sin = arg;
- struct sockaddr_in ha_netmask_sin;
- struct sockaddr_in ha_addr_sin;
-
- ast_sockaddr_to_sin(&addr_range->ha.netmask, &ha_netmask_sin);
- ast_sockaddr_to_sin(&addr_range->ha.addr, &ha_addr_sin);
-
- if ((sin->sin_addr.s_addr & ha_netmask_sin.sin_addr.s_addr) == ha_addr_sin.sin_addr.s_addr) {
+ struct ast_sockaddr *sin = arg;
+ struct ast_sockaddr masked_sin = { {0,} };
+ ast_sockaddr_apply_mask(sin, &addr_range->ha.netmask, &masked_sin);
+
+ if (!ast_sockaddr_cmp_addr(&masked_sin, &addr_range->ha.addr)) {
return CMP_MATCH | CMP_STOP;
}
return 0;
@@ -2309,7 +2296,7 @@
*
* \brief compares sin to calltoken_ignores table to determine if validation is required.
*/
-static int calltoken_required(struct sockaddr_in *sin, const char *name, int subclass)
+static int calltoken_required(struct ast_sockaddr *sin, const char *name, int subclass)
{
struct addr_range *addr_range;
struct iax2_peer *peer = NULL;
@@ -2349,7 +2336,7 @@
user_unref(user);
}
- ast_debug(1, "Determining if address %s with username %s requires calltoken validation. Optional = %d calltoken_required = %d \n", ast_inet_ntoa(sin->sin_addr), name, optional, calltoken_required);
+ ast_debug(1, "Determining if address %s with username %s requires calltoken validation. Optional = %d calltoken_required = %d \n", ast_sockaddr_stringify_addr(sin), name, optional, calltoken_required);
if (((calltoken_required == CALLTOKEN_NO) || (calltoken_required == CALLTOKEN_AUTO)) ||
(optional && (calltoken_required == CALLTOKEN_DEFAULT))) {
res = 0;
@@ -2372,18 +2359,14 @@
{
uint16_t limit = global_maxcallno;
struct addr_range *addr_range;
- struct sockaddr_in sin = {
- .sin_addr.s_addr = peercnt->addr,
- };
-
if (peercnt->reg && peercnt->limit) {
return; /* this peercnt has a custom limit set by a registration */
}
- if ((addr_range = ao2_callback(callno_limits, 0, addr_range_match_address_cb, &sin))) {
+ if ((addr_range = ao2_callback(callno_limits, 0, addr_range_match_address_cb, &peercnt->addr))) {
limit = addr_range->limit;
- ast_debug(1, "custom addr_range %d found for %s\n", limit, ast_inet_ntoa(sin.sin_addr));
+ ast_debug(1, "custom addr_range %d found for %s\n", limit, ast_sockaddr_stringify_addr(&peercnt->addr));
ao2_ref(addr_range, -1);
}
@@ -2423,14 +2406,9 @@
{
/* this function turns off and on custom callno limits set by peer registration */
struct peercnt *peercnt;
- struct peercnt tmp = {
- .addr = 0,
- };
- struct sockaddr_in sin;
-
- ast_sockaddr_to_sin(sockaddr, &sin);
-
- tmp.addr = sin.sin_addr.s_addr;
+ struct peercnt tmp;
+
+ ast_sockaddr_copy(&tmp.addr, sockaddr);
if ((peercnt = ao2_find(peercnts, &tmp, OBJ_POINTER))) {
peercnt->reg = reg;
@@ -2439,7 +2417,7 @@
} else {
set_peercnt_limit(peercnt);
}
- ast_debug(1, "peercnt entry %s modified limit:%d registered:%d", ast_inet_ntoa(sin.sin_addr), peercnt->limit, peercnt->reg);
+ ast_debug(1, "peercnt entry %s modified limit:%d registered:%d", ast_sockaddr_stringify_addr(sockaddr), peercnt->limit, peercnt->reg);
ao2_ref(peercnt, -1); /* decrement ref from find */
}
}
@@ -2452,14 +2430,12 @@
* the current count is incremented. If not found a new peercnt is allocated
* and linked into the peercnts table with a call number count of 1.
*/
-static int peercnt_add(struct sockaddr_in *sin)
+static int peercnt_add(struct ast_sockaddr *sin)
{
struct peercnt *peercnt;
- unsigned long addr = sin->sin_addr.s_addr;
int res = 0;
- struct peercnt tmp = {
- .addr = addr,
- };
+ struct peercnt tmp;
+ ast_sockaddr_copy(&tmp.addr, sin);
/* Reasoning for peercnts container lock: Two identical ip addresses
* could be added by different threads at the "same time". Without the container
@@ -2473,7 +2449,7 @@
} else if ((peercnt = ao2_alloc(sizeof(*peercnt), NULL))) {
ao2_lock(peercnt);
/* create and set defaults */
- peercnt->addr = addr;
+ ast_sockaddr_copy(&peercnt->addr, sin);
set_peercnt_limit(peercnt);
/* guarantees it does not go away after unlocking table
* ao2_find automatically adds this */
@@ -2486,9 +2462,9 @@
/* check to see if the address has hit its callno limit. If not increment cur. */
if (peercnt->limit > peercnt->cur) {
peercnt->cur++;
- ast_debug(1, "ip callno count incremented to %d for %s\n", peercnt->cur, ast_inet_ntoa(sin->sin_addr));
+ ast_debug(1, "ip callno count incremented to %d for %s\n", peercnt->cur, ast_sockaddr_stringify_addr(sin));
} else { /* max num call numbers for this peer has been reached! */
- ast_log(LOG_ERROR, "maxcallnumber limit of %d for %s has been reached!\n", peercnt->limit, ast_inet_ntoa(sin->sin_addr));
+ ast_log(LOG_ERROR, "maxcallnumber limit of %d for %s has been reached!\n", peercnt->limit, ast_sockaddr_stringify_addr(sin));
res = -1;
}
@@ -2506,10 +2482,6 @@
*/
static void peercnt_remove(struct peercnt *peercnt)
{
- struct sockaddr_in sin = {
- .sin_addr.s_addr = peercnt->addr,
- };
-
/*
* Container locked here since peercnt may be unlinked from
* list. If left unlocked, peercnt_add could try and grab this
@@ -2518,7 +2490,7 @@
*/
ao2_lock(peercnts);
peercnt->cur--;
- ast_debug(1, "ip callno count decremented to %d for %s\n", peercnt->cur, ast_inet_ntoa(sin.sin_addr));
+ ast_debug(1, "ip callno count decremented to %d for %s\n", peercnt->cur, ast_sockaddr_stringify_addr(&peercnt->addr));
/* if this was the last connection from the peer remove it from table */
if (peercnt->cur == 0) {
ao2_unlink(peercnts, peercnt);/* decrements ref from table, last ref is left to scheduler */
@@ -2544,12 +2516,11 @@
* \internal
* \brief decrements peercnts connection count, finds by addr
*/
-static int peercnt_remove_by_addr(struct sockaddr_in *sin)
+static int peercnt_remove_by_addr(struct ast_sockaddr *sin)
{
struct peercnt *peercnt;
- struct peercnt tmp = {
- .addr = sin->sin_addr.s_addr,
- };
+ struct peercnt tmp;
+ ast_sockaddr_copy(&tmp.addr, sin);
if ((peercnt = ao2_find(peercnts, &tmp, OBJ_POINTER))) {
peercnt_remove(peercnt);
@@ -2662,7 +2633,7 @@
{
struct ao2_iterator i;
struct peercnt *peercnt;
- struct sockaddr_in sin;
+ struct ast_sockaddr sin = { {0,} };
int found = 0;
switch (cmd) {
@@ -2684,17 +2655,17 @@
i = ao2_iterator_init(peercnts, 0);
while ((peercnt = ao2_iterator_next(&i))) {
- sin.sin_addr.s_addr = peercnt->addr;
+ ast_sockaddr_copy(&sin, &peercnt->addr);
if (a->argc == 5) {
- if (!strcasecmp(a->argv[4], ast_inet_ntoa(sin.sin_addr))) {
+ if (!strcasecmp(a->argv[4], ast_sockaddr_stringify_addr(&sin))) {
ast_cli(a->fd, "%-15s %-12s %-12s\n", "Address", "Callno Usage", "Callno Limit");
- ast_cli(a->fd, "%-15s %-12d %-12d\n", ast_inet_ntoa(sin.sin_addr), peercnt->cur, peercnt->limit);
+ ast_cli(a->fd, "%-15s %-12d %-12d\n", ast_sockaddr_stringify_addr(&sin), peercnt->cur, peercnt->limit);
ao2_ref(peercnt, -1);
found = 1;
break;
}
} else {
- ast_cli(a->fd, "%-15s %-12d %-12d\n", ast_inet_ntoa(sin.sin_addr), peercnt->cur, peercnt->limit);
+ ast_cli(a->fd, "%-15s %-12d %-12d\n", ast_sockaddr_stringify_addr(&sin), peercnt->cur, peercnt->limit);
}
ao2_ref(peercnt, -1);
}
@@ -2875,17 +2846,16 @@
* avaliable again, and the address from the previous connection must be decremented
* from the peercnts table. This function schedules these operations to take place.
*/
-static void sched_delay_remove(struct sockaddr_in *sin, callno_entry entry)
+static void sched_delay_remove(struct ast_sockaddr *sin, callno_entry entry)
{
int i;
struct peercnt *peercnt;
- struct peercnt tmp = {
- .addr = sin->sin_addr.s_addr,
- };
+ struct peercnt tmp;
+ ast_sockaddr_copy(&tmp.addr, sin);
if ((peercnt = ao2_find(peercnts, &tmp, OBJ_POINTER))) {
/* refcount is incremented with ao2_find. keep that ref for the scheduler */
- ast_debug(1, "schedule decrement of callno used for %s in %d seconds\n", ast_inet_ntoa(sin->sin_addr), MIN_REUSE_TIME);
+ ast_debug(1, "schedule decrement of callno used for %s in %d seconds\n", ast_sockaddr_stringify_addr(sin), MIN_REUSE_TIME);
i = iax2_sched_add(sched, MIN_REUSE_TIME * 1000, peercnt_remove_cb, peercnt);
if (i == -1) {
ao2_ref(peercnt, -1);
@@ -2929,7 +2899,7 @@
/*
* \note Calling this function while holding another pvt lock can cause a deadlock.
*/
-static int __find_callno(unsigned short callno, unsigned short dcallno, struct sockaddr_in *sin, int new, int sockfd, int return_locked, int check_dcallno)
+static int __find_callno(unsigned short callno, unsigned short dcallno, struct ast_sockaddr *sin, int new, int sockfd, int return_locked, int check_dcallno)
{
int res = 0;
int x;
@@ -2949,7 +2919,7 @@
.frames_received = check_dcallno,
};
- memcpy(&tmp_pvt.addr, sin, sizeof(tmp_pvt.addr));
+ ast_sockaddr_copy(&tmp_pvt.addr, sin);
/* this works for finding normal call numbers not involving transfering */
if ((pvt = ao2_find(iax_peercallno_pvts, &tmp_pvt, OBJ_POINTER))) {
if (return_locked) {
@@ -2961,8 +2931,8 @@
return res;
}
/* this searches for transfer call numbers that might not get caught otherwise */
- memset(&tmp_pvt.addr, 0, sizeof(tmp_pvt.addr));
- memcpy(&tmp_pvt.transfer, sin, sizeof(tmp_pvt.transfer));
+ ast_sockaddr_setnull(&tmp_pvt.addr);
+ ast_sockaddr_copy(&tmp_pvt.transfer, sin);
if ((pvt = ao2_find(iax_transfercallno_pvts, &tmp_pvt, OBJ_POINTER))) {
if (return_locked) {
ast_mutex_lock(&iaxsl[pvt->callno]);
@@ -2999,8 +2969,8 @@
* this is just checking for a peer that has that IP/port and
* assuming that we have a user of the same name. This isn't always
* correct, but it will be changed if needed after authentication. */
- if (!iax2_getpeername(*sin, host, sizeof(host)))
- snprintf(host, sizeof(host), "%s:%d", ast_inet_ntoa(sin->sin_addr), ntohs(sin->sin_port));
+ if (!iax2_getpeername(sin, host, sizeof(host)))
+ snprintf(host, sizeof(host), "%s", ast_sockaddr_stringify(sin));
if (peercnt_add(sin)) {
/* This address has hit its callnumber limit. When the limit
@@ -3024,9 +2994,7 @@
ast_debug(1, "Creating new call structure %d\n", x);
iaxs[x]->callno_entry = entry;
iaxs[x]->sockfd = sockfd;
- iaxs[x]->addr.sin_port = sin->sin_port;
- iaxs[x]->addr.sin_family = sin->sin_family;
- iaxs[x]->addr.sin_addr.s_addr = sin->sin_addr.s_addr;
+ ast_sockaddr_copy(&iaxs[x]->addr, sin);
iaxs[x]->peercallno = callno;
iaxs[x]->callno = x;
iaxs[x]->pingtime = DEFAULT_RETRY_TIME;
@@ -3056,11 +3024,11 @@
return res;
}
-static int find_callno(unsigned short callno, unsigned short dcallno, struct sockaddr_in *sin, int new, int sockfd, int full_frame) {
+static int find_callno(unsigned short callno, unsigned short dcallno, struct ast_sockaddr *sin, int new, int sockfd, int full_frame) {
return __find_callno(callno, dcallno, sin, new, sockfd, 0, full_frame);
}
-static int find_callno_locked(unsigned short callno, unsigned short dcallno, struct sockaddr_in *sin, int new, int sockfd, int full_frame) {
+static int find_callno_locked(unsigned short callno, unsigned short dcallno, struct ast_sockaddr *sin, int new, int sockfd, int full_frame) {
return __find_callno(callno, dcallno, sin, new, sockfd, 1, full_frame);
}
@@ -3189,11 +3157,10 @@
return 0;
}
-static int transmit_trunk(struct iax_frame *f, struct sockaddr_in *sin, int sockfd)
+static int transmit_trunk(struct iax_frame *f, struct ast_sockaddr *sin, int sockfd)
{
int res;
- res = sendto(sockfd, f->data, f->datalen, 0,(struct sockaddr *)sin,
- sizeof(*sin));
+ res = ast_sendto(sockfd, f->data, f->datalen, 0, sin);
if (res < 0) {
ast_debug(1, "Received error: %s\n", strerror(errno));
handle_error();
@@ -3212,15 +3179,16 @@
return -1;
/* Called with iaxsl held */
- if (iaxdebug)
- ast_debug(3, "Sending %d on %d/%d to %s:%d\n", f->ts, callno, iaxs[callno]->peercallno, ast_inet_ntoa(iaxs[callno]->addr.sin_addr), ntohs(iaxs[callno]->addr.sin_port));
+ if (iaxdebug) {
+ ast_debug(3, "Sending %d on %d/%d to %s\n", f->ts, callno, iaxs[callno]->peercallno, ast_sockaddr_stringify(&iaxs[callno]->addr));
+ }
if (f->transfer) {
iax_outputframe(f, NULL, 0, &iaxs[callno]->transfer, f->datalen - sizeof(struct ast_iax2_full_hdr));
- res = sendto(iaxs[callno]->sockfd, f->data, f->datalen, 0,(struct sockaddr *)&iaxs[callno]->transfer, sizeof(iaxs[callno]->transfer));
+ res = ast_sendto(iaxs[callno]->sockfd, f->data, f->datalen, 0, &iaxs[callno]->transfer);
} else {
iax_outputframe(f, NULL, 0, &iaxs[callno]->addr, f->datalen - sizeof(struct ast_iax2_full_hdr));
- res = sendto(iaxs[callno]->sockfd, f->data, f->datalen, 0,(struct sockaddr *)&iaxs[callno]->addr, sizeof(iaxs[callno]->addr));
+ res = ast_sendto(iaxs[callno]->sockfd, f->data, f->datalen, 0, &iaxs[callno]->addr);
}
if (res < 0) {
if (iaxdebug)
@@ -3369,8 +3337,9 @@
} else if (f->final) {
iax2_destroy(callno);
} else {
- if (iaxs[callno]->owner)
- ast_log(LOG_WARNING, "Max retries exceeded to host %s on %s (type = %d, subclass = %u, ts=%d, seqno=%d)\n", ast_inet_ntoa(iaxs[f->callno]->addr.sin_addr),ast_channel_name(iaxs[f->callno]->owner), f->af.frametype, f->af.subclass.integer, f->ts, f->oseqno);
+ if (iaxs[callno]->owner) {
+ ast_log(LOG_WARNING, "Max retries exceeded to host %s on %s (type = %d, subclass = %u, ts=%d, seqno=%d)\n", ast_sockaddr_stringify_addr(&iaxs[f->callno]->addr), ast_channel_name(iaxs[f->callno]->owner), f->af.frametype, f->af.subclass.integer, f->ts, f->oseqno);
+ }
iaxs[callno]->error = ETIMEDOUT;
if (iaxs[callno]->owner) {
struct ast_frame fr = { AST_FRAME_CONTROL, { AST_CONTROL_HANGUP }, .data.uint32 = AST_CAUSE_DESTINATION_OUT_OF_ORDER };
@@ -3637,10 +3606,6 @@
peer = find_peer(a->argv[3], load_realtime);
if (peer) {
- struct sockaddr_in peer_addr;
-
- ast_sockaddr_to_sin(&peer->addr, &peer_addr);
-
encmethods_to_str(peer->encmethods, &encmethods);
ast_cli(a->fd, "\n\n");
ast_cli(a->fd, " * Name : %s\n", peer->name);
@@ -3657,8 +3622,8 @@
ast_cli(a->fd, " Callerid : %s\n", ast_callerid_merge(cbuf, sizeof(cbuf), peer->cid_name, peer->cid_num, "<unspecified>"));
ast_cli(a->fd, " Expire : %d\n", peer->expire);
ast_cli(a->fd, " ACL : %s\n", (ast_acl_list_is_empty(peer->acl) ? "No" : "Yes"));
- ast_cli(a->fd, " Addr->IP : %s Port %d\n", peer_addr.sin_addr.s_addr ? ast_inet_ntoa(peer_addr.sin_addr) : "(Unspecified)", ntohs(peer_addr.sin_port));
- ast_cli(a->fd, " Defaddr->IP : %s Port %d\n", ast_inet_ntoa(peer->defaddr.sin_addr), ntohs(peer->defaddr.sin_port));
+ ast_cli(a->fd, " Addr->IP : %s Port %d\n", ast_sockaddr_is_any(&peer->addr)? ast_sockaddr_stringify_addr(&peer->addr) : "(Unspecified)", ast_sockaddr_port(&peer->addr));
+ ast_cli(a->fd, " Defaddr->IP : %s Port %d\n", ast_sockaddr_stringify_addr(&peer->defaddr), ast_sockaddr_port(&peer->defaddr));
ast_cli(a->fd, " Username : %s\n", peer->username);
ast_cli(a->fd, " Codecs : ");
iax2_getformatname_multiple(codec_buf, sizeof(codec_buf) -1, peer->capability);
@@ -4200,7 +4165,7 @@
* \note This function calls reg_source_db -> iax2_poke_peer -> find_callno,
* so do not call this with a pvt lock held.
*/
-static struct iax2_peer *realtime_peer(const char *peername, struct sockaddr_in *sin)
+static struct iax2_peer *realtime_peer(const char *peername, struct ast_sockaddr *sin)
{
struct ast_variable *var = NULL;
struct ast_variable *tmp;
@@ -4210,12 +4175,13 @@
if (peername) {
var = ast_load_realtime("iaxpeers", "name", peername, "host", "dynamic", SENTINEL);
- if (!var && sin)
- var = ast_load_realtime("iaxpeers", "name", peername, "host", ast_inet_ntoa(sin->sin_addr), SENTINEL);
- } else if (sin) {
+ if (!var && !ast_sockaddr_isnull(sin)) {
+ var = ast_load_realtime("iaxpeers", "name", peername, "host", ast_sockaddr_stringify_addr(sin), SENTINEL);
+ }
+ } else if (!ast_sockaddr_isnull(sin)) {
char porta[25];
- sprintf(porta, "%d", ntohs(sin->sin_port));
- var = ast_load_realtime("iaxpeers", "ipaddr", ast_inet_ntoa(sin->sin_addr), "port", porta, SENTINEL);
+ sprintf(porta, "%d", ast_sockaddr_port(sin));
+ var = ast_load_realtime("iaxpeers", "ipaddr", ast_sockaddr_stringify_addr(sin), "port", porta, SENTINEL);
if (var) {
/* We'll need the peer name in order to build the structure! */
for (tmp = var; tmp; tmp = tmp->next) {
@@ -4235,13 +4201,20 @@
if (var && sin) {
for (tmp = var; tmp; tmp = tmp->next) {
if (!strcasecmp(tmp->name, "host")) {
- struct ast_hostent ahp;
- struct hostent *hp;
- if (!(hp = ast_gethostbyname(tmp->value, &ahp)) || memcmp(hp->h_addr, &sin->sin_addr, hp->h_length)) {
+ struct ast_sockaddr *sockaddrs;
+ if (!ast_sockaddr_resolve(&sockaddrs, tmp->value, 0, AST_AF_INET)) {
+ /* No match */
+ ast_variables_destroy(var);
+ var = NULL;
+ break;
+ }
+
+ if (ast_sockaddr_cmp_addr(sockaddrs, sin)) {
/* No match */
ast_variables_destroy(var);
var = NULL;
}
+ ast_free(sockaddrs);
break;
}
}
@@ -4322,21 +4295,23 @@
return peer;
}
-static struct iax2_user *realtime_user(const char *username, struct sockaddr_in *sin)
+static struct iax2_user *realtime_user(const char *username, struct ast_sockaddr *sin)
{
struct ast_variable *var;
struct ast_variable *tmp;
struct iax2_user *user=NULL;
var = ast_load_realtime("iaxusers", "name", username, "host", "dynamic", SENTINEL);
- if (!var)
- var = ast_load_realtime("iaxusers", "name", username, "host", ast_inet_ntoa(sin->sin_addr), SENTINEL);
- if (!var && sin) {
+ if (!var) {
+ var = ast_load_realtime("iaxusers", "name", username, "host", ast_sockaddr_stringify_addr(sin), SENTINEL);
+ }
+ if (!var && !ast_sockaddr_isnull(sin)) {
char porta[6];
- snprintf(porta, sizeof(porta), "%d", ntohs(sin->sin_port));
- var = ast_load_realtime("iaxusers", "name", username, "ipaddr", ast_inet_ntoa(sin->sin_addr), "port", porta, SENTINEL);
- if (!var)
- var = ast_load_realtime("iaxusers", "ipaddr", ast_inet_ntoa(sin->sin_addr), "port", porta, SENTINEL);
+ snprintf(porta, sizeof(porta), "%d", ast_sockaddr_port(sin));
+ var = ast_load_realtime("iaxusers", "name", username, "ipaddr", ast_sockaddr_stringify_addr(sin), "port", porta, SENTINEL);
+ if (!var) {
+ var = ast_load_realtime("iaxusers", "ipaddr", ast_sockaddr_stringify_addr(sin), "port", porta, SENTINEL);
+ }
}
if (!var) { /* Last ditch effort */
var = ast_load_realtime("iaxusers", "name", username, SENTINEL);
@@ -4349,13 +4324,20 @@
if (var) {
for (tmp = var; tmp; tmp = tmp->next) {
if (!strcasecmp(tmp->name, "host")) {
- struct ast_hostent ahp;
- struct hostent *hp;
- if (!(hp = ast_gethostbyname(tmp->value, &ahp)) || memcmp(hp->h_addr, &sin->sin_addr, hp->h_length)) {
+ struct ast_sockaddr *sockaddrs;
+ if (!ast_sockaddr_resolve(&sockaddrs, tmp->value, 0, AST_AF_INET)) {
+ /* No match */
+ ast_variables_destroy(var);
+ var = NULL;
+ break;
+ }
+
+ if (ast_sockaddr_cmp_addr(sockaddrs, sin)) {
/* No match */
ast_variables_destroy(var);
var = NULL;
}
+ ast_free(sockaddrs);
break;
}
}
@@ -4433,20 +4415,19 @@
char mohsuggest[MAX_MUSICCLASS];
};
-static int create_addr(const char *peername, struct ast_channel *c, struct sockaddr_in *sin, struct create_addr_info *cai)
+static int create_addr(const char *peername, struct ast_channel *c, struct ast_sockaddr *sin, struct create_addr_info *cai)
{
struct iax2_peer *peer;
int res = -1;
struct ast_codec_pref ourprefs;
- struct sockaddr_in peer_addr;
ast_clear_flag64(cai, IAX_SENDANI | IAX_TRUNK);
cai->sockfd = defaultsockfd;
cai->maxtime = 0;
- sin->sin_family = AF_INET;
+ sin->ss.ss_family = AF_INET;
if (!(peer = find_peer(peername, 1))) {
- struct ast_sockaddr sin_tmp;
+ struct ast_sockaddr sin_tmp = { {0,} };
cai->found = 0;
sin_tmp.ss.ss_family = AF_INET;
@@ -4454,9 +4435,9 @@
ast_log(LOG_WARNING, "No such host: %s\n", peername);
return -1;
}
- ast_sockaddr_to_sin(&sin_tmp, sin);
- if (sin->sin_port == 0) {
- sin->sin_port = htons(IAX_DEFAULT_PORTNO);
+ ast_sockaddr_copy(sin, &sin_tmp);
+ if (ast_sockaddr_port(sin) == 0) {
+ ast_sockaddr_set_port(sin, IAX_DEFAULT_PORTNO);
}
/* use global iax prefs for unknown peer/user */
/* But move the calling channel's native codec to the top of the preference list */
@@ -4475,10 +4456,8 @@
cai->found = 1;
- ast_sockaddr_to_sin(&peer->addr, &peer_addr);
-
/* if the peer has no address (current or default), return failure */
- if (!(peer_addr.sin_addr.s_addr || peer->defaddr.sin_addr.s_addr)) {
+ if (ast_sockaddr_is_any(&peer->addr) && ast_sockaddr_is_any(&peer->defaddr)) {
goto return_unref;
}
@@ -4529,12 +4508,10 @@
}
}
- if (peer_addr.sin_addr.s_addr) {
- sin->sin_addr = peer_addr.sin_addr;
- sin->sin_port = peer_addr.sin_port;
+ if (!ast_sockaddr_is_any(&peer->addr)) {
+ ast_sockaddr_copy(sin, &peer->addr);
} else {
- sin->sin_addr = peer->defaddr.sin_addr;
- sin->sin_port = peer->defaddr.sin_port;
+ ast_sockaddr_copy(sin, &peer->defaddr);
}
res = 0;
@@ -4594,7 +4571,7 @@
};
static int send_apathetic_reply(unsigned short callno, unsigned short dcallno,
- struct sockaddr_in *sin, int command, int ts, unsigned char seqno,
+ struct ast_sockaddr *sin, int command, int ts, unsigned char seqno,
int sockfd, struct iax_ie_data *ied)
{
struct {
@@ -4618,7 +4595,7 @@
iax_outputframe(NULL, &data.f, 0, sin, size - sizeof(struct ast_iax2_full_hdr));
- return sendto(sockfd, &data, size, 0, (struct sockaddr *)sin, sizeof(*sin));
+ return ast_sendto(sockfd, &data, size, 0, sin);
}
static void add_empty_calltoken_ie(struct chan_iax2_pvt *pvt, struct iax_ie_data *ied)
@@ -4754,7 +4731,7 @@
* to decide how this should be handled (reject or permit without calltoken)
*/
static int handle_call_token(struct ast_iax2_full_hdr *fh, struct iax_ies *ies,
- struct sockaddr_in *sin, int fd)
+ struct ast_sockaddr *sin, int fd)
{
#define CALLTOKEN_HASH_FORMAT "%s%d%u%d" /* address + port + ts + randomcalldata */
#define CALLTOKEN_IE_FORMAT "%u?%s" /* time + ? + (40 char hash) */
@@ -4771,7 +4748,7 @@
};
/* create the hash with their address data and our timestamp */
- ast_str_set(&buf, 0, CALLTOKEN_HASH_FORMAT, ast_inet_ntoa(sin->sin_addr), sin->sin_port, (unsigned int) t, randomcalltokendata);
+ ast_str_set(&buf, 0, CALLTOKEN_HASH_FORMAT, ast_sockaddr_stringify_addr(sin), ast_sockaddr_port(sin), (unsigned int) t, randomcalltokendata);
ast_sha1_hash(hash, ast_str_buffer(buf));
ast_str_set(&buf, 0, CALLTOKEN_IE_FORMAT, (unsigned int) t, hash);
@@ -4801,15 +4778,15 @@
}
/* create a hash with their address and the _TOKEN'S_ timestamp */
- ast_str_set(&buf, 0, CALLTOKEN_HASH_FORMAT, ast_inet_ntoa(sin->sin_addr), sin->sin_port, (unsigned int) rec_time, randomcalltokendata);
+ ast_str_set(&buf, 0, CALLTOKEN_HASH_FORMAT, ast_sockaddr_stringify_addr(sin), ast_sockaddr_port(sin), (unsigned int) rec_time, randomcalltokendata);
ast_sha1_hash(hash, ast_str_buffer(buf));
/* compare hashes and then check timestamp delay */
if (strcmp(hash, rec_hash)) {
- ast_log(LOG_WARNING, "Address %s failed CallToken hash inspection\n", ast_inet_ntoa(sin->sin_addr));
+ ast_log(LOG_WARNING, "Address %s failed CallToken hash inspection\n", ast_sockaddr_stringify_addr(sin));
goto reject; /* received hash does not match ours, reject */
} else if ((t < rec_time) || ((t - rec_time) >= MAX_CALLTOKEN_DELAY)) {
- ast_log(LOG_WARNING, "Too much delay in IAX2 calltoken timestamp from address %s\n", ast_inet_ntoa(sin->sin_addr));
+ ast_log(LOG_WARNING, "Too much delay in IAX2 calltoken timestamp from address %s\n", ast_sockaddr_stringify_addr(sin));
goto reject; /* too much delay, reject */
}
@@ -4821,7 +4798,7 @@
/* ----- Case 3 ----- */
} else { /* calltokens are not supported for this client, how do we respond? */
if (calltoken_required(sin, ies->username, subclass)) {
- ast_log(LOG_ERROR, "Call rejected, CallToken Support required. If unexpected, resolve by placing address %s in the calltokenoptional list or setting user %s requirecalltoken=no\n", ast_inet_ntoa(sin->sin_addr), S_OR(ies->username, "guest"));
+ ast_log(LOG_ERROR, "Call rejected, CallToken Support required. If unexpected, resolve by placing address %s in the calltokenoptional list or setting user %s requirecalltoken=no\n", ast_sockaddr_stringify_addr(sin), S_OR(ies->username, "guest"));
goto reject;
}
return 0; /* calltoken is not required for this addr, so permit it. */
@@ -4898,7 +4875,7 @@
static int iax2_call(struct ast_channel *c, const char *dest, int timeout)
{
- struct sockaddr_in sin;
+ struct ast_sockaddr sin = { {0,} };
char *l=NULL, *n=NULL, *tmpstr;
struct iax_ie_data ied;
char *defaultrdest = "s";
@@ -4958,8 +4935,9 @@
/* Keep track of the context for outgoing calls too */
ast_channel_context_set(c, cai.context);
- if (pds.port)
- sin.sin_port = htons(atoi(pds.port));
+ if (pds.port) {
+ ast_sockaddr_set_port(&sin, atoi(pds.port));
+ }
l = ast_channel_connected(c)->id.number.valid ? ast_channel_connected(c)->id.number.str : NULL;
n = ast_channel_connected(c)->id.name.valid ? ast_channel_connected(c)->id.name.str : NULL;
@@ -5593,7 +5571,7 @@
return send_command_locked(callno, AST_FRAME_IAX, IAX_COMMAND_TRANSFER, 0, ied.buf, ied.pos, -1);
}
-static int iax2_getpeertrunk(struct sockaddr_in sin)
+static int iax2_getpeertrunk(struct ast_sockaddr *sin)
{
struct iax2_peer *peer;
int res = 0;
@@ -5601,12 +5579,7 @@
i = ao2_iterator_init(peers, 0);
while ((peer = ao2_iterator_next(&i))) {
- struct sockaddr_in peer_addr;
-
- ast_sockaddr_to_sin(&peer->addr, &peer_addr);
-
- if ((peer_addr.sin_addr.s_addr == sin.sin_addr.s_addr) &&
- (peer_addr.sin_port == sin.sin_port)) {
+ if (!ast_sockaddr_cmp(&peer->addr, sin)) {
res = ast_test_flag64(peer, IAX_TRUNK);
peer_unref(peer);
break;
@@ -5976,7 +5949,7 @@
return ms;
}
-static struct iax2_trunk_peer *find_tpeer(struct sockaddr_in *sin, int fd)
+static struct iax2_trunk_peer *find_tpeer(struct ast_sockaddr *sin, int fd)
{
struct iax2_trunk_peer *tpeer = NULL;
@@ -5984,7 +5957,7 @@
AST_LIST_LOCK(&tpeers);
AST_LIST_TRAVERSE(&tpeers, tpeer, list) {
- if (!inaddrcmp(&tpeer->addr, sin)) {
+ if (!ast_sockaddr_cmp_addr(&tpeer->addr, sin)) {
ast_mutex_lock(&tpeer->lock);
break;
}
@@ -5994,14 +5967,14 @@
if ((tpeer = ast_calloc(1, sizeof(*tpeer)))) {
ast_mutex_init(&tpeer->lock);
tpeer->lastsent = 9999;
- memcpy(&tpeer->addr, sin, sizeof(tpeer->addr));
+ ast_sockaddr_copy(&tpeer->addr, sin);
tpeer->trunkact = ast_tvnow();
ast_mutex_lock(&tpeer->lock);
tpeer->sockfd = fd;
#ifdef SO_NO_CHECK
setsockopt(tpeer->sockfd, SOL_SOCKET, SO_NO_CHECK, &nochecksums, sizeof(nochecksums));
#endif
- ast_debug(1, "Created trunk peer for '%s:%d'\n", ast_inet_ntoa(tpeer->addr.sin_addr), ntohs(tpeer->addr.sin_port));
+ ast_debug(1, "Created trunk peer for '%s'\n", ast_sockaddr_stringify(&tpeer->addr));
AST_LIST_INSERT_TAIL(&tpeers, tpeer, list);
}
}
@@ -6033,9 +6006,9 @@
tpeer->trunkdataalloc += DEFAULT_TRUNKDATA;
tpeer->trunkdata = tmp;
- ast_debug(1, "Expanded trunk '%s:%d' to %d bytes\n", ast_inet_ntoa(tpeer->addr.sin_addr), ntohs(tpeer->addr.sin_port), tpeer->trunkdataalloc);
+ ast_debug(1, "Expanded trunk '%s' to %d bytes\n", ast_sockaddr_stringify(&tpeer->addr), tpeer->trunkdataalloc);
} else {
- ast_log(LOG_WARNING, "Maximum trunk data space exceeded to %s:%d\n", ast_inet_ntoa(tpeer->addr.sin_addr), ntohs(tpeer->addr.sin_port));
+ ast_log(LOG_WARNING, "Maximum trunk data space exceeded to %s\n", ast_sockaddr_stringify(&tpeer->addr));
ast_mutex_unlock(&tpeer->lock);
return -1;
}
@@ -6616,11 +6589,8 @@
char nm[20];
char status[20];
int retstatus;
- struct sockaddr_in peer_addr;
-
- ast_sockaddr_to_sin(&peer->addr, &peer_addr);
-
- if (registeredonly && !peer_addr.sin_addr.s_addr) {
+
+ if (registeredonly && ast_sockaddr_is_any(&peer->addr)) {
continue;
}
if (havepattern && regexec(®exbuf, peer->name, 0, NULL, 0)) {
@@ -6641,7 +6611,7 @@
else
unmonitored_peers++;
- ast_copy_string(nm, ast_inet_ntoa(peer->mask), sizeof(nm));
+ ast_copy_string(nm, ast_sockaddr_stringify_addr(&peer->mask), sizeof(nm));
if (s) {
astman_append(s,
@@ -6954,7 +6924,7 @@
}
astman_append(s, "ChanObjectType: peer\r\n");
astman_append(s, "IPaddress: %s\r\n", ast_sockaddr_stringify_addr(&peer->addr));
- ast_copy_string(nm, ast_inet_ntoa(peer->mask), sizeof(nm));
+ ast_copy_string(nm, ast_sockaddr_stringify_addr(&peer->mask), sizeof(nm));
astman_append(s, "Mask: %s\r\n", nm);
astman_append(s, "Port: %d\r\n", ast_sockaddr_port(&peer->addr));
astman_append(s, "Dynamic: %s\r\n", ast_test_flag64(peer, IAX_DYNAMIC) ? "Yes" : "No");
@@ -7018,8 +6988,8 @@
AST_LIST_LOCK(®istrations);
AST_LIST_TRAVERSE(®istrations, reg, entry) {
snprintf(host, sizeof(host), "%s", ast_sockaddr_stringify(®->addr));
- if (reg->us.sin_addr.s_addr)
- snprintf(perceived, sizeof(perceived), "%s:%d", ast_inet_ntoa(reg->us.sin_addr), ntohs(reg->us.sin_port));
+ if (!ast_sockaddr_is_any(®->us))
+ snprintf(perceived, sizeof(perceived), "%s", ast_sockaddr_stringify(®->us));
else
ast_copy_string(perceived, "<Unregistered>", sizeof(perceived));
ast_cli(a->fd, FORMAT, host,
@@ -7052,8 +7022,8 @@
AST_LIST_TRAVERSE(®istrations, reg, entry) {
snprintf(host, sizeof(host), "%s", ast_sockaddr_stringify(®->addr));
- if (reg->us.sin_addr.s_addr) {
- snprintf(perceived, sizeof(perceived), "%s:%d", ast_inet_ntoa(reg->us.sin_addr), ntohs(reg->us.sin_port));
+ if (!ast_sockaddr_is_any(®->us)) {
+ snprintf(perceived, sizeof(perceived), "%s", ast_sockaddr_stringify(®->us));
} else {
ast_copy_string(perceived, "<Unregistered>", sizeof(perceived));
}
@@ -7127,7 +7097,7 @@
lag = iaxs[x]->remote_rr.delay;
[... 1470 lines stripped ...]
More information about the asterisk-commits
mailing list