More RSW merges. This should do it for the channels/ dir.

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@136917 65c4cc65-6c06-0410-ace0-fbb531ad65f3
1.6.1
Sean Bright 17 years ago
parent 5275342c5e
commit db1ed285c4

@ -135,8 +135,8 @@ static const char tdesc[] = "Inter Asterisk eXchange Driver (Ver 2)";
static int global_max_trunk_mtu; /*!< Maximum MTU, 0 if not used */ static int global_max_trunk_mtu; /*!< Maximum MTU, 0 if not used */
static int trunk_timed, trunk_untimed, trunk_maxmtu, trunk_nmaxmtu ; /*!< Trunk MTU statistics */ static int trunk_timed, trunk_untimed, trunk_maxmtu, trunk_nmaxmtu ; /*!< Trunk MTU statistics */
#define DEFAULT_CONTEXT "default"
static char context[80] = "default";
static char default_parkinglot[AST_MAX_CONTEXT]; static char default_parkinglot[AST_MAX_CONTEXT];
static char language[MAX_LANGUAGE] = ""; static char language[MAX_LANGUAGE] = "";
@ -164,9 +164,10 @@ static int iaxdefaultdpcache=10 * 60; /* Cache dialplan entries for 10 minutes b
static int iaxdefaulttimeout = 5; /* Default to wait no more than 5 seconds for a reply to come back */ static int iaxdefaulttimeout = 5; /* Default to wait no more than 5 seconds for a reply to come back */
static unsigned int tos = 0; static struct {
unsigned int tos;
static unsigned int cos = 0; unsigned int cos;
} qos = { 0, 0 };
static int min_reg_expire; static int min_reg_expire;
static int max_reg_expire; static int max_reg_expire;
@ -2793,7 +2794,7 @@ static char *handle_cli_iax2_show_cache(struct ast_cli_entry *e, int cmd, struct
struct iax2_dpcache *dp = NULL; struct iax2_dpcache *dp = NULL;
char tmp[1024], *pc = NULL; char tmp[1024], *pc = NULL;
int s, x, y; int s, x, y;
struct timeval tv = ast_tvnow(); struct timeval now = ast_tvnow();
switch (cmd) { switch (cmd) {
case CLI_INIT: case CLI_INIT:
@ -2811,7 +2812,7 @@ static char *handle_cli_iax2_show_cache(struct ast_cli_entry *e, int cmd, struct
ast_cli(a->fd, "%-20.20s %-12.12s %-9.9s %-8.8s %s\n", "Peer/Context", "Exten", "Exp.", "Wait.", "Flags"); ast_cli(a->fd, "%-20.20s %-12.12s %-9.9s %-8.8s %s\n", "Peer/Context", "Exten", "Exp.", "Wait.", "Flags");
AST_LIST_TRAVERSE(&dpcache, dp, cache_list) { AST_LIST_TRAVERSE(&dpcache, dp, cache_list) {
s = dp->expiry.tv_sec - tv.tv_sec; s = dp->expiry.tv_sec - now.tv_sec;
tmp[0] = '\0'; tmp[0] = '\0';
if (dp->flags & CACHE_FLAG_EXISTS) if (dp->flags & CACHE_FLAG_EXISTS)
strncat(tmp, "EXISTS|", sizeof(tmp) - strlen(tmp) - 1); strncat(tmp, "EXISTS|", sizeof(tmp) - strlen(tmp) - 1);
@ -2919,9 +2920,9 @@ static void __get_from_jb(const void *p)
struct iax_frame *fr; struct iax_frame *fr;
jb_frame frame; jb_frame frame;
int ret; int ret;
long now; long ms;
long next; long next;
struct timeval tv = ast_tvnow(); struct timeval now = ast_tvnow();
/* Make sure we have a valid private structure before going on */ /* Make sure we have a valid private structure before going on */
ast_mutex_lock(&iaxsl[callno]); ast_mutex_lock(&iaxsl[callno]);
@ -2937,12 +2938,12 @@ static void __get_from_jb(const void *p)
/* round up a millisecond since ast_sched_runq does; */ /* round up a millisecond since ast_sched_runq does; */
/* prevents us from spinning while waiting for our now */ /* prevents us from spinning while waiting for our now */
/* to catch up with runq's now */ /* to catch up with runq's now */
tv.tv_usec += 1000; now.tv_usec += 1000;
now = ast_tvdiff_ms(tv, pvt->rxcore); ms = ast_tvdiff_ms(now, pvt->rxcore);
if(now >= (next = jb_next(pvt->jb))) { if(ms >= (next = jb_next(pvt->jb))) {
ret = jb_get(pvt->jb,&frame,now,ast_codec_interp_len(pvt->voiceformat)); ret = jb_get(pvt->jb,&frame,ms,ast_codec_interp_len(pvt->voiceformat));
switch(ret) { switch(ret) {
case JB_OK: case JB_OK:
fr = frame.data; fr = frame.data;
@ -3938,7 +3939,7 @@ static enum ast_bridge_result iax2_bridge(struct ast_channel *c0, struct ast_cha
struct ast_frame *f; struct ast_frame *f;
unsigned short callno0 = PTR_TO_CALLNO(c0->tech_pvt); unsigned short callno0 = PTR_TO_CALLNO(c0->tech_pvt);
unsigned short callno1 = PTR_TO_CALLNO(c1->tech_pvt); unsigned short callno1 = PTR_TO_CALLNO(c1->tech_pvt);
struct timeval waittimer = {0, 0}, tv; struct timeval waittimer = {0, 0};
/* We currently do not support native bridging if a timeoutms value has been provided */ /* We currently do not support native bridging if a timeoutms value has been provided */
if (timeoutms > 0) { if (timeoutms > 0) {
@ -4008,10 +4009,10 @@ static enum ast_bridge_result iax2_bridge(struct ast_channel *c0, struct ast_cha
} }
if ((iaxs[callno0]->transferring == TRANSFER_RELEASED) && (iaxs[callno1]->transferring == TRANSFER_RELEASED)) { if ((iaxs[callno0]->transferring == TRANSFER_RELEASED) && (iaxs[callno1]->transferring == TRANSFER_RELEASED)) {
/* Call has been transferred. We're no longer involved */ /* Call has been transferred. We're no longer involved */
tv = ast_tvnow(); struct timeval now = ast_tvnow();
if (ast_tvzero(waittimer)) { if (ast_tvzero(waittimer)) {
waittimer = tv; waittimer = now;
} else if (tv.tv_sec - waittimer.tv_sec > IAX_LINGER_TIMEOUT) { } else if (now.tv_sec - waittimer.tv_sec > IAX_LINGER_TIMEOUT) {
c0->_softhangup |= AST_SOFTHANGUP_DEV; c0->_softhangup |= AST_SOFTHANGUP_DEV;
c1->_softhangup |= AST_SOFTHANGUP_DEV; c1->_softhangup |= AST_SOFTHANGUP_DEV;
*fo = NULL; *fo = NULL;
@ -4264,23 +4265,23 @@ static struct ast_channel *ast_iax2_new(int callno, int state, int capability)
return tmp; return tmp;
} }
static unsigned int calc_txpeerstamp(struct iax2_trunk_peer *tpeer, int sampms, struct timeval *tv) static unsigned int calc_txpeerstamp(struct iax2_trunk_peer *tpeer, int sampms, struct timeval *now)
{ {
unsigned long int mssincetx; /* unsigned to handle overflows */ unsigned long int mssincetx; /* unsigned to handle overflows */
long int ms, pred; long int ms, pred;
tpeer->trunkact = *tv; tpeer->trunkact = *now;
mssincetx = ast_tvdiff_ms(*tv, tpeer->lasttxtime); mssincetx = ast_tvdiff_ms(*now, tpeer->lasttxtime);
if (mssincetx > 5000 || ast_tvzero(tpeer->txtrunktime)) { if (mssincetx > 5000 || ast_tvzero(tpeer->txtrunktime)) {
/* If it's been at least 5 seconds since the last time we transmitted on this trunk, reset our timers */ /* If it's been at least 5 seconds since the last time we transmitted on this trunk, reset our timers */
tpeer->txtrunktime = *tv; tpeer->txtrunktime = *now;
tpeer->lastsent = 999999; tpeer->lastsent = 999999;
} }
/* Update last transmit time now */ /* Update last transmit time now */
tpeer->lasttxtime = *tv; tpeer->lasttxtime = *now;
/* Calculate ms offset */ /* Calculate ms offset */
ms = ast_tvdiff_ms(*tv, tpeer->txtrunktime); ms = ast_tvdiff_ms(*now, tpeer->txtrunktime);
/* Predict from last value */ /* Predict from last value */
pred = tpeer->lastsent + sampms; pred = tpeer->lastsent + sampms;
if (abs(ms - pred) < MAX_TIMESTAMP_SKEW) if (abs(ms - pred) < MAX_TIMESTAMP_SKEW)
@ -4293,7 +4294,7 @@ static unsigned int calc_txpeerstamp(struct iax2_trunk_peer *tpeer, int sampms,
return ms; return ms;
} }
static unsigned int fix_peerts(struct timeval *tv, int callno, unsigned int ts) static unsigned int fix_peerts(struct timeval *rxtrunktime, int callno, unsigned int ts)
{ {
long ms; /* NOT unsigned */ long ms; /* NOT unsigned */
if (ast_tvzero(iaxs[callno]->rxcore)) { if (ast_tvzero(iaxs[callno]->rxcore)) {
@ -4303,7 +4304,7 @@ static unsigned int fix_peerts(struct timeval *tv, int callno, unsigned int ts)
iaxs[callno]->rxcore.tv_usec -= iaxs[callno]->rxcore.tv_usec % 20000; iaxs[callno]->rxcore.tv_usec -= iaxs[callno]->rxcore.tv_usec % 20000;
} }
/* Calculate difference between trunk and channel */ /* Calculate difference between trunk and channel */
ms = ast_tvdiff_ms(*tv, iaxs[callno]->rxcore); ms = ast_tvdiff_ms(*rxtrunktime, iaxs[callno]->rxcore);
/* Return as the sum of trunk time and the difference between trunk and real time */ /* Return as the sum of trunk time and the difference between trunk and real time */
return ms + ts; return ms + ts;
} }
@ -5017,7 +5018,7 @@ static char *handle_cli_iax2_show_users(struct ast_cli_entry *e, int cmd, struct
pstr = ast_test_flag(user,IAX_CODEC_USER_FIRST) ? "Caller" : "Host"; pstr = ast_test_flag(user,IAX_CODEC_USER_FIRST) ? "Caller" : "Host";
ast_cli(a->fd, FORMAT2, user->name, auth, user->authmethods, ast_cli(a->fd, FORMAT2, user->name, auth, user->authmethods,
user->contexts ? user->contexts->context : context, user->contexts ? user->contexts->context : DEFAULT_CONTEXT,
user->ha ? "Yes" : "No", pstr); user->ha ? "Yes" : "No", pstr);
} }
@ -5989,7 +5990,7 @@ static int check_access(int callno, struct sockaddr_in *sin, struct iax_ies *ies
if (user->contexts) if (user->contexts)
ast_string_field_set(iaxs[callno], context, user->contexts->context); ast_string_field_set(iaxs[callno], context, user->contexts->context);
else else
ast_string_field_set(iaxs[callno], context, context); ast_string_field_set(iaxs[callno], context, DEFAULT_CONTEXT);
} }
/* And any input keys */ /* And any input keys */
ast_string_field_set(iaxs[callno], inkeys, user->inkeys); ast_string_field_set(iaxs[callno], inkeys, user->inkeys);
@ -8466,10 +8467,10 @@ retryowner:
ast_set_flag(iaxs[fr->callno], IAX_QUELCH); ast_set_flag(iaxs[fr->callno], IAX_QUELCH);
if (ies.musiconhold) { if (ies.musiconhold) {
if (iaxs[fr->callno]->owner && ast_bridged_channel(iaxs[fr->callno]->owner)) { if (iaxs[fr->callno]->owner && ast_bridged_channel(iaxs[fr->callno]->owner)) {
const char *mohsuggest = iaxs[fr->callno]->mohsuggest; const char *moh_suggest = iaxs[fr->callno]->mohsuggest;
iax2_queue_control_data(fr->callno, AST_CONTROL_HOLD, iax2_queue_control_data(fr->callno, AST_CONTROL_HOLD,
S_OR(mohsuggest, NULL), S_OR(moh_suggest, NULL),
!ast_strlen_zero(mohsuggest) ? strlen(mohsuggest) + 1 : 0); !ast_strlen_zero(moh_suggest) ? strlen(moh_suggest) + 1 : 0);
if (!iaxs[fr->callno]) { if (!iaxs[fr->callno]) {
ast_mutex_unlock(&iaxsl[fr->callno]); ast_mutex_unlock(&iaxsl[fr->callno]);
return 1; return 1;
@ -9647,7 +9648,7 @@ static void iax2_process_thread_cleanup(void *data)
static void *iax2_process_thread(void *data) static void *iax2_process_thread(void *data)
{ {
struct iax2_thread *thread = data; struct iax2_thread *thread = data;
struct timeval tv; struct timeval wait;
struct timespec ts; struct timespec ts;
int put_into_idle = 0; int put_into_idle = 0;
@ -9667,9 +9668,9 @@ static void *iax2_process_thread(void *data)
if (thread->type == IAX_THREAD_TYPE_DYNAMIC) { if (thread->type == IAX_THREAD_TYPE_DYNAMIC) {
struct iax2_thread *t = NULL; struct iax2_thread *t = NULL;
/* Wait to be signalled or time out */ /* Wait to be signalled or time out */
tv = ast_tvadd(ast_tvnow(), ast_samp2tv(30000, 1000)); wait = ast_tvadd(ast_tvnow(), ast_samp2tv(30000, 1000));
ts.tv_sec = tv.tv_sec; ts.tv_sec = wait.tv_sec;
ts.tv_nsec = tv.tv_usec * 1000; ts.tv_nsec = wait.tv_usec * 1000;
if (ast_cond_timedwait(&thread->cond, &thread->lock, &ts) == ETIMEDOUT) { if (ast_cond_timedwait(&thread->cond, &thread->lock, &ts) == ETIMEDOUT) {
/* This thread was never put back into the available dynamic /* This thread was never put back into the available dynamic
* thread list, so just go away. */ * thread list, so just go away. */
@ -9692,9 +9693,9 @@ static void *iax2_process_thread(void *data)
/* Someone grabbed our thread *right* after we timed out. /* Someone grabbed our thread *right* after we timed out.
* Wait for them to set us up with something to do and signal * Wait for them to set us up with something to do and signal
* us to continue. */ * us to continue. */
tv = ast_tvadd(ast_tvnow(), ast_samp2tv(30000, 1000)); wait = ast_tvadd(ast_tvnow(), ast_samp2tv(30000, 1000));
ts.tv_sec = tv.tv_sec; ts.tv_sec = wait.tv_sec;
ts.tv_nsec = tv.tv_usec * 1000; ts.tv_nsec = wait.tv_usec * 1000;
if (ast_cond_timedwait(&thread->cond, &thread->lock, &ts) == ETIMEDOUT) if (ast_cond_timedwait(&thread->cond, &thread->lock, &ts) == ETIMEDOUT)
{ {
ast_mutex_unlock(&thread->lock); ast_mutex_unlock(&thread->lock);
@ -10147,16 +10148,16 @@ static void *sched_thread(void *ignore)
{ {
int count; int count;
int res; int res;
struct timeval tv; struct timeval wait;
struct timespec ts; struct timespec ts;
for (;;) { for (;;) {
res = ast_sched_wait(sched); res = ast_sched_wait(sched);
if ((res > 1000) || (res < 0)) if ((res > 1000) || (res < 0))
res = 1000; res = 1000;
tv = ast_tvadd(ast_tvnow(), ast_samp2tv(res, 1000)); wait = ast_tvadd(ast_tvnow(), ast_samp2tv(res, 1000));
ts.tv_sec = tv.tv_sec; ts.tv_sec = wait.tv_sec;
ts.tv_nsec = tv.tv_usec * 1000; ts.tv_nsec = wait.tv_usec * 1000;
pthread_testcancel(); pthread_testcancel();
ast_mutex_lock(&sched_lock); ast_mutex_lock(&sched_lock);
@ -10359,7 +10360,7 @@ static int peer_set_srcaddr(struct iax2_peer *peer, const char *srcaddr)
sin.sin_addr.s_addr = INADDR_ANY; sin.sin_addr.s_addr = INADDR_ANY;
if (ast_netsock_find(netsock, &sin)) { if (ast_netsock_find(netsock, &sin)) {
sin.sin_addr.s_addr = orig_saddr; sin.sin_addr.s_addr = orig_saddr;
sock = ast_netsock_bind(outsock, io, srcaddr, port, tos, cos, socket_read, NULL); sock = ast_netsock_bind(outsock, io, srcaddr, port, qos.tos, qos.cos, socket_read, NULL);
if (sock) { if (sock) {
sockfd = ast_netsock_sockfd(sock); sockfd = ast_netsock_sockfd(sock);
ast_netsock_unref(sock); ast_netsock_unref(sock);
@ -11035,13 +11036,13 @@ static int set_config(char *config_file, int reload)
/* Seed initial tos value */ /* Seed initial tos value */
tosval = ast_variable_retrieve(cfg, "general", "tos"); tosval = ast_variable_retrieve(cfg, "general", "tos");
if (tosval) { if (tosval) {
if (ast_str2tos(tosval, &tos)) if (ast_str2tos(tosval, &qos.tos))
ast_log(LOG_WARNING, "Invalid tos value, refer to QoS documentation\n"); ast_log(LOG_WARNING, "Invalid tos value, refer to QoS documentation\n");
} }
/* Seed initial cos value */ /* Seed initial cos value */
tosval = ast_variable_retrieve(cfg, "general", "cos"); tosval = ast_variable_retrieve(cfg, "general", "cos");
if (tosval) { if (tosval) {
if (ast_str2cos(tosval, &cos)) if (ast_str2cos(tosval, &qos.cos))
ast_log(LOG_WARNING, "Invalid cos value, refer to QoS documentation\n"); ast_log(LOG_WARNING, "Invalid cos value, refer to QoS documentation\n");
} }
while(v) { while(v) {
@ -11110,7 +11111,7 @@ static int set_config(char *config_file, int reload)
if (reload) { if (reload) {
ast_log(LOG_NOTICE, "Ignoring bindaddr on reload\n"); ast_log(LOG_NOTICE, "Ignoring bindaddr on reload\n");
} else { } else {
if (!(ns = ast_netsock_bind(netsock, io, v->value, portno, tos, cos, socket_read, NULL))) { if (!(ns = ast_netsock_bind(netsock, io, v->value, portno, qos.tos, qos.cos, socket_read, NULL))) {
ast_log(LOG_WARNING, "Unable apply binding to '%s' at line %d\n", v->value, v->lineno); ast_log(LOG_WARNING, "Unable apply binding to '%s' at line %d\n", v->value, v->lineno);
} else { } else {
if (strchr(v->value, ':')) if (strchr(v->value, ':'))
@ -11220,10 +11221,10 @@ static int set_config(char *config_file, int reload)
/* Create context if it doesn't exist already */ /* Create context if it doesn't exist already */
ast_context_find_or_create(NULL, NULL, regcontext, "IAX2"); ast_context_find_or_create(NULL, NULL, regcontext, "IAX2");
} else if (!strcasecmp(v->name, "tos")) { } else if (!strcasecmp(v->name, "tos")) {
if (ast_str2tos(v->value, &tos)) if (ast_str2tos(v->value, &qos.tos))
ast_log(LOG_WARNING, "Invalid tos value at line %d, refer to QoS documentation\n", v->lineno); ast_log(LOG_WARNING, "Invalid tos value at line %d, refer to QoS documentation\n", v->lineno);
} else if (!strcasecmp(v->name, "cos")) { } else if (!strcasecmp(v->name, "cos")) {
if (ast_str2cos(v->value, &cos)) if (ast_str2cos(v->value, &qos.cos))
ast_log(LOG_WARNING, "Invalid cos value at line %d, refer to QoS documentation\n", v->lineno); ast_log(LOG_WARNING, "Invalid cos value at line %d, refer to QoS documentation\n", v->lineno);
} else if (!strcasecmp(v->name, "parkinglot")) { } else if (!strcasecmp(v->name, "parkinglot")) {
ast_copy_string(default_parkinglot, v->value, sizeof(default_parkinglot)); ast_copy_string(default_parkinglot, v->value, sizeof(default_parkinglot));
@ -11256,7 +11257,7 @@ static int set_config(char *config_file, int reload)
} }
if (defaultsockfd < 0) { if (defaultsockfd < 0) {
if (!(ns = ast_netsock_bind(netsock, io, "0.0.0.0", portno, tos, cos, socket_read, NULL))) { if (!(ns = ast_netsock_bind(netsock, io, "0.0.0.0", portno, qos.tos, qos.cos, socket_read, NULL))) {
ast_log(LOG_ERROR, "Unable to create network socket: %s\n", strerror(errno)); ast_log(LOG_ERROR, "Unable to create network socket: %s\n", strerror(errno));
} else { } else {
ast_verb(2, "Binding IAX2 to default address 0.0.0.0:%d\n", portno); ast_verb(2, "Binding IAX2 to default address 0.0.0.0:%d\n", portno);
@ -11504,13 +11505,13 @@ static int cache_get_callno_locked(const char *data)
static struct iax2_dpcache *find_cache(struct ast_channel *chan, const char *data, const char *context, const char *exten, int priority) static struct iax2_dpcache *find_cache(struct ast_channel *chan, const char *data, const char *context, const char *exten, int priority)
{ {
struct iax2_dpcache *dp = NULL; struct iax2_dpcache *dp = NULL;
struct timeval tv = ast_tvnow(); struct timeval now = ast_tvnow();
int x, com[2], timeout, old = 0, outfd, abort, callno; int x, com[2], timeout, old = 0, outfd, doabort, callno;
struct ast_channel *c = NULL; struct ast_channel *c = NULL;
struct ast_frame *f = NULL; struct ast_frame *f = NULL;
AST_LIST_TRAVERSE_SAFE_BEGIN(&dpcache, dp, cache_list) { AST_LIST_TRAVERSE_SAFE_BEGIN(&dpcache, dp, cache_list) {
if (ast_tvcmp(tv, dp->expiry) > 0) { if (ast_tvcmp(now, dp->expiry) > 0) {
AST_LIST_REMOVE_CURRENT(cache_list); AST_LIST_REMOVE_CURRENT(cache_list);
if ((dp->flags & CACHE_FLAG_PENDING) || dp->callno) if ((dp->flags & CACHE_FLAG_PENDING) || dp->callno)
ast_log(LOG_WARNING, "DP still has peer field or pending or callno (flags = %d, peer = blah, callno = %d)\n", dp->flags, dp->callno); ast_log(LOG_WARNING, "DP still has peer field or pending or callno (flags = %d, peer = blah, callno = %d)\n", dp->flags, dp->callno);
@ -11577,7 +11578,7 @@ static struct iax2_dpcache *find_cache(struct ast_channel *chan, const char *dat
/* Defer any dtmf */ /* Defer any dtmf */
if (chan) if (chan)
old = ast_channel_defer_dtmf(chan); old = ast_channel_defer_dtmf(chan);
abort = 0; doabort = 0;
while(timeout) { while(timeout) {
c = ast_waitfor_nandfds(&chan, chan ? 1 : 0, &com[0], 1, NULL, &outfd, &timeout); c = ast_waitfor_nandfds(&chan, chan ? 1 : 0, &com[0], 1, NULL, &outfd, &timeout);
if (outfd > -1) if (outfd > -1)
@ -11585,7 +11586,7 @@ static struct iax2_dpcache *find_cache(struct ast_channel *chan, const char *dat
if (!c) if (!c)
continue; continue;
if (!(f = ast_read(c))) { if (!(f = ast_read(c))) {
abort = 1; doabort = 1;
break; break;
} }
ast_frfree(f); ast_frfree(f);
@ -11597,7 +11598,7 @@ static struct iax2_dpcache *find_cache(struct ast_channel *chan, const char *dat
dp->waiters[x] = -1; dp->waiters[x] = -1;
close(com[1]); close(com[1]);
close(com[0]); close(com[0]);
if (abort) { if (doabort) {
/* Don't interpret anything, just abort. Not sure what th epoint /* Don't interpret anything, just abort. Not sure what th epoint
of undeferring dtmf on a hung up channel is but hey whatever */ of undeferring dtmf on a hung up channel is but hey whatever */
if (!old && chan) if (!old && chan)
@ -11793,7 +11794,7 @@ static int function_iaxpeer(struct ast_channel *chan, const char *cmd, char *dat
ast_getformatname_multiple(buf, len -1, peer->capability); ast_getformatname_multiple(buf, len -1, peer->capability);
} else if (!strncasecmp(colname, "codec[", 6)) { } else if (!strncasecmp(colname, "codec[", 6)) {
char *codecnum, *ptr; char *codecnum, *ptr;
int index = 0, codec = 0; int codec = 0;
codecnum = strchr(colname, '['); codecnum = strchr(colname, '[');
*codecnum = '\0'; *codecnum = '\0';
@ -11801,8 +11802,7 @@ static int function_iaxpeer(struct ast_channel *chan, const char *cmd, char *dat
if ((ptr = strchr(codecnum, ']'))) { if ((ptr = strchr(codecnum, ']'))) {
*ptr = '\0'; *ptr = '\0';
} }
index = atoi(codecnum); if((codec = ast_codec_pref_index(&peer->prefs, atoi(codecnum)))) {
if((codec = ast_codec_pref_index(&peer->prefs, index))) {
ast_copy_string(buf, ast_getformatname(codec), len); ast_copy_string(buf, ast_getformatname(codec), len);
} }
} }

@ -153,10 +153,12 @@ static int nat = 0;
static ast_group_t cur_callergroup = 0; static ast_group_t cur_callergroup = 0;
static ast_group_t cur_pickupgroup = 0; static ast_group_t cur_pickupgroup = 0;
static unsigned int tos = 0; static struct {
static unsigned int tos_audio = 0; unsigned int tos;
static unsigned int cos = 0; unsigned int tos_audio;
static unsigned int cos_audio = 0; unsigned int cos;
unsigned int cos_audio;
} qos = { 0, 0, 0, 0 };
static int immediate = 0; static int immediate = 0;
@ -460,16 +462,16 @@ static int has_voicemail(struct mgcp_endpoint *p)
{ {
int new_msgs; int new_msgs;
struct ast_event *event; struct ast_event *event;
char *mailbox, *context; char *mbox, *cntx;
context = mailbox = ast_strdupa(p->mailbox); cntx = mbox = ast_strdupa(p->mailbox);
strsep(&context, "@"); strsep(&cntx, "@");
if (ast_strlen_zero(context)) if (ast_strlen_zero(cntx))
context = "default"; cntx = "default";
event = ast_event_get_cached(AST_EVENT_MWI, event = ast_event_get_cached(AST_EVENT_MWI,
AST_EVENT_IE_MAILBOX, AST_EVENT_IE_PLTYPE_STR, mailbox, AST_EVENT_IE_MAILBOX, AST_EVENT_IE_PLTYPE_STR, mbox,
AST_EVENT_IE_CONTEXT, AST_EVENT_IE_PLTYPE_STR, context, AST_EVENT_IE_CONTEXT, AST_EVENT_IE_PLTYPE_STR, cntx,
AST_EVENT_IE_NEWMSGS, AST_EVENT_IE_PLTYPE_EXISTS, AST_EVENT_IE_NEWMSGS, AST_EVENT_IE_PLTYPE_EXISTS,
AST_EVENT_IE_END); AST_EVENT_IE_END);
@ -694,7 +696,7 @@ static int mgcp_postrequest(struct mgcp_endpoint *p, struct mgcp_subchannel *sub
struct mgcp_message *msg; struct mgcp_message *msg;
struct mgcp_message *cur; struct mgcp_message *cur;
struct mgcp_gateway *gw; struct mgcp_gateway *gw;
struct timeval tv; struct timeval now;
msg = ast_malloc(sizeof(*msg) + len); msg = ast_malloc(sizeof(*msg) + len);
if (!msg) { if (!msg) {
@ -731,8 +733,8 @@ static int mgcp_postrequest(struct mgcp_endpoint *p, struct mgcp_subchannel *sub
gw->msgs = msg; gw->msgs = msg;
} }
tv = ast_tvnow(); now = ast_tvnow();
msg->expire = tv.tv_sec * 1000 + tv.tv_usec / 1000 + DEFAULT_RETRANS; msg->expire = now.tv_sec * 1000 + now.tv_usec / 1000 + DEFAULT_RETRANS;
if (gw->retransid == -1) if (gw->retransid == -1)
gw->retransid = ast_sched_add(sched, DEFAULT_RETRANS, retrans_pkt, (void *)gw); gw->retransid = ast_sched_add(sched, DEFAULT_RETRANS, retrans_pkt, (void *)gw);
@ -2644,7 +2646,7 @@ static void start_rtp(struct mgcp_subchannel *sub)
if (sub->rtp && sub->owner) if (sub->rtp && sub->owner)
ast_channel_set_fd(sub->owner, 0, ast_rtp_fd(sub->rtp)); ast_channel_set_fd(sub->owner, 0, ast_rtp_fd(sub->rtp));
if (sub->rtp) { if (sub->rtp) {
ast_rtp_setqos(sub->rtp, tos_audio, cos_audio, "MGCP RTP"); ast_rtp_setqos(sub->rtp, qos.tos_audio, qos.cos_audio, "MGCP RTP");
ast_rtp_setnat(sub->rtp, sub->nat); ast_rtp_setnat(sub->rtp, sub->nat);
} }
#if 0 #if 0
@ -3750,14 +3752,14 @@ static struct mgcp_gateway *build_gateway(char *cat, struct ast_variable *v)
ast_copy_string(e->mailbox, mailbox, sizeof(e->mailbox)); ast_copy_string(e->mailbox, mailbox, sizeof(e->mailbox));
ast_copy_string(e->parkinglot, parkinglot, sizeof(e->parkinglot)); ast_copy_string(e->parkinglot, parkinglot, sizeof(e->parkinglot));
if (!ast_strlen_zero(e->mailbox)) { if (!ast_strlen_zero(e->mailbox)) {
char *mailbox, *context; char *mbox, *cntx;
context = mailbox = ast_strdupa(e->mailbox); cntx = mbox = ast_strdupa(e->mailbox);
strsep(&context, "@"); strsep(&cntx, "@");
if (ast_strlen_zero(context)) if (ast_strlen_zero(cntx))
context = "default"; cntx = "default";
e->mwi_event_sub = ast_event_subscribe(AST_EVENT_MWI, mwi_event_cb, NULL, e->mwi_event_sub = ast_event_subscribe(AST_EVENT_MWI, mwi_event_cb, NULL,
AST_EVENT_IE_MAILBOX, AST_EVENT_IE_PLTYPE_STR, mailbox, AST_EVENT_IE_MAILBOX, AST_EVENT_IE_PLTYPE_STR, mbox,
AST_EVENT_IE_CONTEXT, AST_EVENT_IE_PLTYPE_STR, context, AST_EVENT_IE_CONTEXT, AST_EVENT_IE_PLTYPE_STR, cntx,
AST_EVENT_IE_NEWMSGS, AST_EVENT_IE_PLTYPE_EXISTS, AST_EVENT_IE_NEWMSGS, AST_EVENT_IE_PLTYPE_EXISTS,
AST_EVENT_IE_END); AST_EVENT_IE_END);
} }
@ -4155,16 +4157,16 @@ static int reload_config(int reload)
else else
capability &= ~format; capability &= ~format;
} else if (!strcasecmp(v->name, "tos")) { } else if (!strcasecmp(v->name, "tos")) {
if (ast_str2tos(v->value, &tos)) if (ast_str2tos(v->value, &qos.tos))
ast_log(LOG_WARNING, "Invalid tos value at line %d, refer to QoS documentation\n", v->lineno); ast_log(LOG_WARNING, "Invalid tos value at line %d, refer to QoS documentation\n", v->lineno);
} else if (!strcasecmp(v->name, "tos_audio")) { } else if (!strcasecmp(v->name, "tos_audio")) {
if (ast_str2tos(v->value, &tos_audio)) if (ast_str2tos(v->value, &qos.tos_audio))
ast_log(LOG_WARNING, "Invalid tos_audio value at line %d, refer to QoS documentation\n", v->lineno); ast_log(LOG_WARNING, "Invalid tos_audio value at line %d, refer to QoS documentation\n", v->lineno);
} else if (!strcasecmp(v->name, "cos")) { } else if (!strcasecmp(v->name, "cos")) {
if (ast_str2cos(v->value, &cos)) if (ast_str2cos(v->value, &qos.cos))
ast_log(LOG_WARNING, "Invalid cos value at line %d, refer to QoS documentation\n", v->lineno); ast_log(LOG_WARNING, "Invalid cos value at line %d, refer to QoS documentation\n", v->lineno);
} else if (!strcasecmp(v->name, "cos_audio")) { } else if (!strcasecmp(v->name, "cos_audio")) {
if (ast_str2cos(v->value, &cos_audio)) if (ast_str2cos(v->value, &qos.cos_audio))
ast_log(LOG_WARNING, "Invalid cos_audio value at line %d, refer to QoS documentation\n", v->lineno); ast_log(LOG_WARNING, "Invalid cos_audio value at line %d, refer to QoS documentation\n", v->lineno);
} else if (!strcasecmp(v->name, "port")) { } else if (!strcasecmp(v->name, "port")) {
if (sscanf(v->value, "%d", &ourport) == 1) { if (sscanf(v->value, "%d", &ourport) == 1) {
@ -4249,7 +4251,7 @@ static int reload_config(int reload)
} else { } else {
ast_verb(2, "MGCP Listening on %s:%d\n", ast_verb(2, "MGCP Listening on %s:%d\n",
ast_inet_ntoa(bindaddr.sin_addr), ntohs(bindaddr.sin_port)); ast_inet_ntoa(bindaddr.sin_addr), ntohs(bindaddr.sin_port));
ast_netsock_set_qos(mgcpsock, tos, cos, "MGCP"); ast_netsock_set_qos(mgcpsock, qos.tos, qos.cos, "MGCP");
} }
} }
ast_mutex_unlock(&netlock); ast_mutex_unlock(&netlock);

@ -2073,7 +2073,7 @@ static int handle_common_options(struct ast_flags *flags, struct ast_flags *mask
/* Realtime device support */ /* Realtime device support */
static void realtime_update_peer(const char *peername, struct sockaddr_in *sin, const char *username, const char *fullcontact, const char *useragent, int expirey, int deprecated_username); static void realtime_update_peer(const char *peername, struct sockaddr_in *sin, const char *username, const char *fullcontact, const char *useragent, int expirey, int deprecated_username);
static void update_peer(struct sip_peer *p, int expiry); static void update_peer(struct sip_peer *p, int expire);
static struct ast_variable *get_insecure_variable_from_config(struct ast_config *config); static struct ast_variable *get_insecure_variable_from_config(struct ast_config *config);
static const char *get_name_from_variable(struct ast_variable *var, const char *newpeername); static const char *get_name_from_variable(struct ast_variable *var, const char *newpeername);
static struct sip_peer *realtime_peer(const char *peername, struct sockaddr_in *sin); static struct sip_peer *realtime_peer(const char *peername, struct sockaddr_in *sin);
@ -3814,26 +3814,26 @@ static void sip_destroy_peer(struct sip_peer *peer)
} }
/*! \brief Update peer data in database (if used) */ /*! \brief Update peer data in database (if used) */
static void update_peer(struct sip_peer *p, int expiry) static void update_peer(struct sip_peer *p, int expire)
{ {
int rtcachefriends = ast_test_flag(&p->flags[1], SIP_PAGE2_RTCACHEFRIENDS); int rtcachefriends = ast_test_flag(&p->flags[1], SIP_PAGE2_RTCACHEFRIENDS);
if (sip_cfg.peer_rtupdate && if (sip_cfg.peer_rtupdate &&
(p->is_realtime || rtcachefriends)) { (p->is_realtime || rtcachefriends)) {
realtime_update_peer(p->name, &p->addr, p->username, rtcachefriends ? p->fullcontact : NULL, p->useragent, expiry, p->deprecated_username); realtime_update_peer(p->name, &p->addr, p->username, rtcachefriends ? p->fullcontact : NULL, p->useragent, expire, p->deprecated_username);
} }
} }
static struct ast_variable *get_insecure_variable_from_config(struct ast_config *config) static struct ast_variable *get_insecure_variable_from_config(struct ast_config *cfg)
{ {
struct ast_variable *var = NULL; struct ast_variable *var = NULL;
struct ast_flags flags = {0}; struct ast_flags flags = {0};
char *cat = NULL; char *cat = NULL;
const char *insecure; const char *insecure;
while ((cat = ast_category_browse(config, cat))) { while ((cat = ast_category_browse(cfg, cat))) {
insecure = ast_variable_retrieve(config, cat, "insecure"); insecure = ast_variable_retrieve(cfg, cat, "insecure");
set_insecure_flags(&flags, insecure, -1); set_insecure_flags(&flags, insecure, -1);
if (ast_test_flag(&flags, SIP_INSECURE_PORT)) { if (ast_test_flag(&flags, SIP_INSECURE_PORT)) {
var = ast_category_root(config, cat); var = ast_category_root(cfg, cat);
break; break;
} }
} }
@ -6132,9 +6132,9 @@ struct find_call_cb_arg {
* code to determine whether this is the pvt that we are looking for. * code to determine whether this is the pvt that we are looking for.
* Return FALSE if not found, true otherwise. p is unlocked. * Return FALSE if not found, true otherwise. p is unlocked.
*/ */
static int find_call_cb(void *__p, void *__arg, int flags) static int find_call_cb(void *__pvt, void *__arg, int flags)
{ {
struct sip_pvt *p = __p; struct sip_pvt *p = __pvt;
struct find_call_cb_arg *arg = __arg; struct find_call_cb_arg *arg = __arg;
/* In pedantic, we do not want packets with bad syntax to be connected to a PVT */ /* In pedantic, we do not want packets with bad syntax to be connected to a PVT */
int found = FALSE; int found = FALSE;
@ -6302,7 +6302,7 @@ static int sip_register(const char *value, int lineno)
enum sip_transport transport = SIP_TRANSPORT_UDP; enum sip_transport transport = SIP_TRANSPORT_UDP;
char buf[256] = ""; char buf[256] = "";
char *username = NULL; char *username = NULL;
char *hostname=NULL, *secret=NULL, *authuser=NULL, *expiry=NULL; char *hostname=NULL, *secret=NULL, *authuser=NULL, *expire=NULL;
char *callback=NULL; char *callback=NULL;
if (!value) if (!value)
@ -6329,9 +6329,9 @@ static int sip_register(const char *value, int lineno)
*authuser++ = '\0'; *authuser++ = '\0';
} }
/* split host[:port][/contact] */ /* split host[:port][/contact] */
expiry = strchr(hostname, '~'); expire = strchr(hostname, '~');
if (expiry) if (expire)
*expiry++ = '\0'; *expire++ = '\0';
callback = strchr(hostname, '/'); callback = strchr(hostname, '/');
if (callback) if (callback)
*callback++ = '\0'; *callback++ = '\0';
@ -6361,7 +6361,7 @@ static int sip_register(const char *value, int lineno)
ast_string_field_set(reg, secret, secret); ast_string_field_set(reg, secret, secret);
reg->transport = transport; reg->transport = transport;
reg->expire = -1; reg->expire = -1;
reg->expiry = (expiry ? atoi(expiry) : default_expiry); reg->expiry = (expire ? atoi(expire) : default_expiry);
reg->timeout = -1; reg->timeout = -1;
reg->refresh = reg->expiry; reg->refresh = reg->expiry;
reg->portno = portnum; reg->portno = portnum;
@ -8355,7 +8355,7 @@ static enum sip_result add_sdp(struct sip_request *resp, struct sip_pvt *p, int
char subject[256]; /* Subject of the session */ char subject[256]; /* Subject of the session */
char owner[256]; /* Session owner/creator */ char owner[256]; /* Session owner/creator */
char connection[256]; /* Connection data */ char connection[256]; /* Connection data */
char *stime = "t=0 0\r\n"; /* Time the session is active */ char *session_time = "t=0 0\r\n"; /* Time the session is active */
char bandwidth[256] = ""; /* Max bitrate */ char bandwidth[256] = ""; /* Max bitrate */
char *hold; char *hold;
struct ast_str *m_audio = ast_str_alloca(256); /* Media declaration line for audio */ struct ast_str *m_audio = ast_str_alloca(256); /* Media declaration line for audio */
@ -8584,7 +8584,7 @@ static enum sip_result add_sdp(struct sip_request *resp, struct sip_pvt *p, int
ast_str_append(&m_text, 0, "\r\n"); ast_str_append(&m_text, 0, "\r\n");
len = strlen(version) + strlen(subject) + strlen(owner) + len = strlen(version) + strlen(subject) + strlen(owner) +
strlen(connection) + strlen(stime); strlen(connection) + strlen(session_time);
if (needaudio) if (needaudio)
len += m_audio->used + a_audio->used + strlen(hold); len += m_audio->used + a_audio->used + strlen(hold);
if (needvideo) /* only if video response is appropriate */ if (needvideo) /* only if video response is appropriate */
@ -8600,7 +8600,7 @@ static enum sip_result add_sdp(struct sip_request *resp, struct sip_pvt *p, int
add_line(resp, connection); add_line(resp, connection);
if (needvideo) /* only if video response is appropriate */ if (needvideo) /* only if video response is appropriate */
add_line(resp, bandwidth); add_line(resp, bandwidth);
add_line(resp, stime); add_line(resp, session_time);
if (needaudio) { if (needaudio) {
add_line(resp, m_audio->str); add_line(resp, m_audio->str);
add_line(resp, a_audio->str); add_line(resp, a_audio->str);
@ -8651,11 +8651,11 @@ static void copy_request(struct sip_request *dst, const struct sip_request *src)
{ {
long offset; long offset;
int x; int x;
struct ast_str *dup = dst->data; struct ast_str *duplicate = dst->data;
/* First copy stuff */ /* First copy stuff */
memcpy(dst, src, sizeof(*dst)); memcpy(dst, src, sizeof(*dst));
dst->data = dup; dst->data = duplicate;
/* All these + 1's are to account for the need to include the NULL terminator /* All these + 1's are to account for the need to include the NULL terminator
* Using typical string functions like ast_copy_string or ast_str_set will not * Using typical string functions like ast_copy_string or ast_str_set will not
@ -10110,7 +10110,7 @@ static void reg_source_db(struct sip_peer *peer)
{ {
char data[256]; char data[256];
struct in_addr in; struct in_addr in;
int expiry; int expire;
int port; int port;
char *scan, *addr, *port_str, *expiry_str, *username, *contact; char *scan, *addr, *port_str, *expiry_str, *username, *contact;
@ -10135,7 +10135,7 @@ static void reg_source_db(struct sip_peer *peer)
return; return;
if (expiry_str) if (expiry_str)
expiry = atoi(expiry_str); expire = atoi(expiry_str);
else else
return; return;
@ -10145,7 +10145,7 @@ static void reg_source_db(struct sip_peer *peer)
ast_copy_string(peer->fullcontact, contact, sizeof(peer->fullcontact)); ast_copy_string(peer->fullcontact, contact, sizeof(peer->fullcontact));
ast_debug(2, "SIP Seeding peer from astdb: '%s' at %s@%s:%d for %d\n", ast_debug(2, "SIP Seeding peer from astdb: '%s' at %s@%s:%d for %d\n",
peer->name, peer->username, ast_inet_ntoa(in), port, expiry); peer->name, peer->username, ast_inet_ntoa(in), port, expire);
memset(&peer->addr, 0, sizeof(peer->addr)); memset(&peer->addr, 0, sizeof(peer->addr));
peer->addr.sin_family = AF_INET; peer->addr.sin_family = AF_INET;
@ -10157,7 +10157,7 @@ static void reg_source_db(struct sip_peer *peer)
} else { } else {
sip_poke_peer(peer, 0); sip_poke_peer(peer, 0);
} }
AST_SCHED_REPLACE(peer->expire, sched, (expiry + 10) * 1000, expire_register, peer); AST_SCHED_REPLACE(peer->expire, sched, (expire + 10) * 1000, expire_register, peer);
register_peer_exten(peer, TRUE); register_peer_exten(peer, TRUE);
} }
@ -10245,7 +10245,7 @@ static enum parse_register_result parse_register_contact(struct sip_pvt *pvt, st
char contact[SIPBUFSIZE]; char contact[SIPBUFSIZE];
char data[SIPBUFSIZE]; char data[SIPBUFSIZE];
const char *expires = get_header(req, "Expires"); const char *expires = get_header(req, "Expires");
int expiry = atoi(expires); int expire = atoi(expires);
char *curi, *host, *pt, *curi2; char *curi, *host, *pt, *curi2;
int port; int port;
const char *useragent; const char *useragent;
@ -10259,11 +10259,11 @@ static enum parse_register_result parse_register_contact(struct sip_pvt *pvt, st
char *s = strcasestr(contact, ";expires="); char *s = strcasestr(contact, ";expires=");
if (s) { if (s) {
expires = strsep(&s, ";"); /* trim ; and beyond */ expires = strsep(&s, ";"); /* trim ; and beyond */
if (sscanf(expires + 9, "%d", &expiry) != 1) if (sscanf(expires + 9, "%d", &expire) != 1)
expiry = default_expiry; expire = default_expiry;
} else { } else {
/* Nothing has been specified */ /* Nothing has been specified */
expiry = default_expiry; expire = default_expiry;
} }
} }
@ -10287,7 +10287,7 @@ static enum parse_register_result parse_register_contact(struct sip_pvt *pvt, st
if (peer->expire > -1 && !ast_strlen_zero(peer->fullcontact)) if (peer->expire > -1 && !ast_strlen_zero(peer->fullcontact))
pvt->expiry = ast_sched_when(sched, peer->expire); pvt->expiry = ast_sched_when(sched, peer->expire);
return PARSE_REGISTER_QUERY; return PARSE_REGISTER_QUERY;
} else if (!strcasecmp(curi, "*") || !expiry) { /* Unregister this peer */ } else if (!strcasecmp(curi, "*") || !expire) { /* Unregister this peer */
/* This means remove all registrations and return OK */ /* This means remove all registrations and return OK */
memset(&peer->addr, 0, sizeof(peer->addr)); memset(&peer->addr, 0, sizeof(peer->addr));
AST_SCHED_DEL(sched, peer->expire); AST_SCHED_DEL(sched, peer->expire);
@ -10348,14 +10348,14 @@ static enum parse_register_result parse_register_contact(struct sip_pvt *pvt, st
ast_copy_string(peer->username, curi, sizeof(peer->username)); ast_copy_string(peer->username, curi, sizeof(peer->username));
AST_SCHED_DEL(sched, peer->expire); AST_SCHED_DEL(sched, peer->expire);
if (expiry > max_expiry) if (expire > max_expiry)
expiry = max_expiry; expire = max_expiry;
if (expiry < min_expiry) if (expire < min_expiry)
expiry = min_expiry; expire = min_expiry;
peer->expire = peer->is_realtime && !ast_test_flag(&peer->flags[1], SIP_PAGE2_RTCACHEFRIENDS) ? -1 : peer->expire = peer->is_realtime && !ast_test_flag(&peer->flags[1], SIP_PAGE2_RTCACHEFRIENDS) ? -1 :
ast_sched_add(sched, (expiry + 10) * 1000, expire_register, peer); ast_sched_add(sched, (expire + 10) * 1000, expire_register, peer);
pvt->expiry = expiry; pvt->expiry = expire;
snprintf(data, sizeof(data), "%s:%d:%d:%s:%s", ast_inet_ntoa(peer->addr.sin_addr), ntohs(peer->addr.sin_port), expiry, peer->username, peer->fullcontact); snprintf(data, sizeof(data), "%s:%d:%d:%s:%s", ast_inet_ntoa(peer->addr.sin_addr), ntohs(peer->addr.sin_port), expire, peer->username, peer->fullcontact);
/* Saving TCP connections is useless, we won't be able to reconnect /* Saving TCP connections is useless, we won't be able to reconnect
XXX WHY???? XXX XXX WHY???? XXX
\todo check this \todo check this
@ -10367,7 +10367,7 @@ static enum parse_register_result parse_register_contact(struct sip_pvt *pvt, st
/* Is this a new IP address for us? */ /* Is this a new IP address for us? */
if (inaddrcmp(&peer->addr, &oldsin)) { if (inaddrcmp(&peer->addr, &oldsin)) {
sip_poke_peer(peer, 0); sip_poke_peer(peer, 0);
ast_verb(3, "Registered SIP '%s' at %s port %d expires %d\n", peer->name, ast_inet_ntoa(peer->addr.sin_addr), ntohs(peer->addr.sin_port), expiry); ast_verb(3, "Registered SIP '%s' at %s port %d expires %d\n", peer->name, ast_inet_ntoa(peer->addr.sin_addr), ntohs(peer->addr.sin_port), expire);
register_peer_exten(peer, TRUE); register_peer_exten(peer, TRUE);
} }
@ -13178,7 +13178,7 @@ static char *_sip_show_peer(int type, int fd, struct mansession *s, const struct
ast_cli(fd, "\n"); ast_cli(fd, "\n");
peer = unref_peer(peer, "sip_show_peer: unref_peer: done with peer ptr"); peer = unref_peer(peer, "sip_show_peer: unref_peer: done with peer ptr");
} else if (peer && type == 1) { /* manager listing */ } else if (peer && type == 1) { /* manager listing */
char buf[256]; char buffer[256];
struct ast_str *mailbox_str = ast_str_alloca(512); struct ast_str *mailbox_str = ast_str_alloca(512);
astman_append(s, "Channeltype: SIP\r\n"); astman_append(s, "Channeltype: SIP\r\n");
astman_append(s, "ObjectName: %s\r\n", peer->name); astman_append(s, "ObjectName: %s\r\n", peer->name);
@ -13196,9 +13196,9 @@ static char *_sip_show_peer(int type, int fd, struct mansession *s, const struct
if (!ast_strlen_zero(peer->fromdomain)) if (!ast_strlen_zero(peer->fromdomain))
astman_append(s, "SIP-FromDomain: %s\r\n", peer->fromdomain); astman_append(s, "SIP-FromDomain: %s\r\n", peer->fromdomain);
astman_append(s, "Callgroup: "); astman_append(s, "Callgroup: ");
astman_append(s, "%s\r\n", ast_print_group(buf, sizeof(buf), peer->callgroup)); astman_append(s, "%s\r\n", ast_print_group(buffer, sizeof(buffer), peer->callgroup));
astman_append(s, "Pickupgroup: "); astman_append(s, "Pickupgroup: ");
astman_append(s, "%s\r\n", ast_print_group(buf, sizeof(buf), peer->pickupgroup)); astman_append(s, "%s\r\n", ast_print_group(buffer, sizeof(buffer), peer->pickupgroup));
peer_mailboxes_to_str(&mailbox_str, peer); peer_mailboxes_to_str(&mailbox_str, peer);
astman_append(s, "VoiceMailbox: %s\r\n", mailbox_str->str); astman_append(s, "VoiceMailbox: %s\r\n", mailbox_str->str);
astman_append(s, "TransferMode: %s\r\n", transfermode2str(peer->allowtransfer)); astman_append(s, "TransferMode: %s\r\n", transfermode2str(peer->allowtransfer));
@ -14893,12 +14893,11 @@ static int function_sippeer(struct ast_channel *chan, const char *cmd, char *dat
ast_copy_string(buf, v->value, len); ast_copy_string(buf, v->value, len);
} else if (!strncasecmp(colname, "codec[", 6)) { } else if (!strncasecmp(colname, "codec[", 6)) {
char *codecnum; char *codecnum;
int index = 0, codec = 0; int codec = 0;
codecnum = colname + 6; /* move past the '[' */ codecnum = colname + 6; /* move past the '[' */
codecnum = strsep(&codecnum, "]"); /* trim trailing ']' if any */ codecnum = strsep(&codecnum, "]"); /* trim trailing ']' if any */
index = atoi(codecnum); if((codec = ast_codec_pref_index(&peer->prefs, atoi(codecnum)))) {
if((codec = ast_codec_pref_index(&peer->prefs, index))) {
ast_copy_string(buf, ast_getformatname(codec), len); ast_copy_string(buf, ast_getformatname(codec), len);
} }
} }
@ -17579,11 +17578,11 @@ static int handle_request_invite(struct sip_pvt *p, struct sip_request *req, int
p->invitestate = INV_PROCEEDING; p->invitestate = INV_PROCEEDING;
ast_setstate(c, AST_STATE_RING); ast_setstate(c, AST_STATE_RING);
if (strcmp(p->exten, ast_pickup_ext())) { /* Call to extension -start pbx on this call */ if (strcmp(p->exten, ast_pickup_ext())) { /* Call to extension -start pbx on this call */
enum ast_pbx_result res; enum ast_pbx_result result;
res = ast_pbx_start(c); result = ast_pbx_start(c);
switch(res) { switch(result) {
case AST_PBX_FAILED: case AST_PBX_FAILED:
ast_log(LOG_WARNING, "Failed to start PBX :(\n"); ast_log(LOG_WARNING, "Failed to start PBX :(\n");
p->invitestate = INV_COMPLETED; p->invitestate = INV_COMPLETED;
@ -17599,7 +17598,7 @@ static int handle_request_invite(struct sip_pvt *p, struct sip_request *req, int
break; break;
} }
if (res) { if (result) {
/* Unlock locks so ast_hangup can do its magic */ /* Unlock locks so ast_hangup can do its magic */
ast_channel_unlock(c); ast_channel_unlock(c);
@ -18471,7 +18470,7 @@ static int handle_request_subscribe(struct sip_pvt *p, struct sip_request *req,
int firststate = AST_EXTENSION_REMOVED; int firststate = AST_EXTENSION_REMOVED;
struct sip_peer *authpeer = NULL; struct sip_peer *authpeer = NULL;
const char *eventheader = get_header(req, "Event"); /* Get Event package name */ const char *eventheader = get_header(req, "Event"); /* Get Event package name */
const char *accept = get_header(req, "Accept"); const char *acceptheader = get_header(req, "Accept");
int resubscribe = (p->subscribed != NONE); int resubscribe = (p->subscribed != NONE);
char *temp, *event; char *temp, *event;
struct ao2_iterator i; struct ao2_iterator i;
@ -18602,16 +18601,16 @@ static int handle_request_subscribe(struct sip_pvt *p, struct sip_request *req,
*/ */
if (strstr(p->useragent, "Polycom")) { if (strstr(p->useragent, "Polycom")) {
p->subscribed = XPIDF_XML; p->subscribed = XPIDF_XML;
} else if (strstr(accept, "application/pidf+xml")) { } else if (strstr(acceptheader, "application/pidf+xml")) {
p->subscribed = PIDF_XML; /* RFC 3863 format */ p->subscribed = PIDF_XML; /* RFC 3863 format */
} else if (strstr(accept, "application/dialog-info+xml")) { } else if (strstr(acceptheader, "application/dialog-info+xml")) {
p->subscribed = DIALOG_INFO_XML; p->subscribed = DIALOG_INFO_XML;
/* IETF draft: draft-ietf-sipping-dialog-package-05.txt */ /* IETF draft: draft-ietf-sipping-dialog-package-05.txt */
} else if (strstr(accept, "application/cpim-pidf+xml")) { } else if (strstr(acceptheader, "application/cpim-pidf+xml")) {
p->subscribed = CPIM_PIDF_XML; /* RFC 3863 format */ p->subscribed = CPIM_PIDF_XML; /* RFC 3863 format */
} else if (strstr(accept, "application/xpidf+xml")) { } else if (strstr(acceptheader, "application/xpidf+xml")) {
p->subscribed = XPIDF_XML; /* Early pre-RFC 3863 format with MSN additions (Microsoft Messenger) */ p->subscribed = XPIDF_XML; /* Early pre-RFC 3863 format with MSN additions (Microsoft Messenger) */
} else if (ast_strlen_zero(accept)) { } else if (ast_strlen_zero(acceptheader)) {
if (p->subscribed == NONE) { /* if the subscribed field is not already set, and there is no accept header... */ if (p->subscribed == NONE) { /* if the subscribed field is not already set, and there is no accept header... */
transmit_response(p, "489 Bad Event", req); transmit_response(p, "489 Bad Event", req);
@ -18625,19 +18624,19 @@ static int handle_request_subscribe(struct sip_pvt *p, struct sip_request *req,
} else { } else {
/* Can't find a format for events that we know about */ /* Can't find a format for events that we know about */
char mybuf[200]; char mybuf[200];
snprintf(mybuf, sizeof(mybuf), "489 Bad Event (format %s)", accept); snprintf(mybuf, sizeof(mybuf), "489 Bad Event (format %s)", acceptheader);
transmit_response(p, mybuf, req); transmit_response(p, mybuf, req);
ast_log(LOG_WARNING, "SUBSCRIBE failure: unrecognized format: '%s' pvt: subscribed: %d, stateid: %d, laststate: %d, dialogver: %d, subscribecont: '%s', subscribeuri: '%s'\n", ast_log(LOG_WARNING, "SUBSCRIBE failure: unrecognized format: '%s' pvt: subscribed: %d, stateid: %d, laststate: %d, dialogver: %d, subscribecont: '%s', subscribeuri: '%s'\n",
accept, (int)p->subscribed, p->stateid, p->laststate, p->dialogver, p->subscribecontext, p->subscribeuri); acceptheader, (int)p->subscribed, p->stateid, p->laststate, p->dialogver, p->subscribecontext, p->subscribeuri);
p->needdestroy = 1; p->needdestroy = 1;
return 0; return 0;
} }
} else if (!strcmp(event, "message-summary")) { } else if (!strcmp(event, "message-summary")) {
if (!ast_strlen_zero(accept) && strcmp(accept, "application/simple-message-summary")) { if (!ast_strlen_zero(acceptheader) && strcmp(acceptheader, "application/simple-message-summary")) {
/* Format requested that we do not support */ /* Format requested that we do not support */
transmit_response(p, "406 Not Acceptable", req); transmit_response(p, "406 Not Acceptable", req);
ast_debug(2, "Received SIP mailbox subscription for unknown format: %s\n", accept); ast_debug(2, "Received SIP mailbox subscription for unknown format: %s\n", acceptheader);
p->needdestroy = 1; p->needdestroy = 1;
if (authpeer) if (authpeer)
unref_peer(authpeer, "unref_peer, from handle_request_subscribe (authpeer 3)"); unref_peer(authpeer, "unref_peer, from handle_request_subscribe (authpeer 3)");
@ -21569,17 +21568,17 @@ static int reload_config(enum channelreloadreason reason)
auto_sip_domains = ast_true(v->value); auto_sip_domains = ast_true(v->value);
} else if (!strcasecmp(v->name, "domain")) { } else if (!strcasecmp(v->name, "domain")) {
char *domain = ast_strdupa(v->value); char *domain = ast_strdupa(v->value);
char *context = strchr(domain, ','); char *cntx = strchr(domain, ',');
if (context) if (cntx)
*context++ = '\0'; *cntx++ = '\0';
if (ast_strlen_zero(context)) if (ast_strlen_zero(cntx))
ast_debug(1, "No context specified at line %d for domain '%s'\n", v->lineno, domain); ast_debug(1, "No context specified at line %d for domain '%s'\n", v->lineno, domain);
if (ast_strlen_zero(domain)) if (ast_strlen_zero(domain))
ast_log(LOG_WARNING, "Empty domain specified at line %d\n", v->lineno); ast_log(LOG_WARNING, "Empty domain specified at line %d\n", v->lineno);
else else
add_sip_domain(ast_strip(domain), SIP_DOMAIN_CONFIG, context ? ast_strip(context) : ""); add_sip_domain(ast_strip(domain), SIP_DOMAIN_CONFIG, cntx ? ast_strip(cntx) : "");
} else if (!strcasecmp(v->name, "register")) { } else if (!strcasecmp(v->name, "register")) {
if (sip_register(v->value, v->lineno) == 0) if (sip_register(v->value, v->lineno) == 0)
registry_count++; registry_count++;

@ -93,12 +93,14 @@ enum skinny_codecs {
#define DEFAULT_SKINNY_BACKLOG 2 #define DEFAULT_SKINNY_BACKLOG 2
#define SKINNY_MAX_PACKET 1000 #define SKINNY_MAX_PACKET 1000
static unsigned int tos = 0; static struct {
static unsigned int tos_audio = 0; unsigned int tos;
static unsigned int tos_video = 0; unsigned int tos_audio;
static unsigned int cos = 0; unsigned int tos_video;
static unsigned int cos_audio = 0; unsigned int cos;
static unsigned int cos_video = 0; unsigned int cos_audio;
unsigned int cos_video;
} qos = { 0, 0, 0, 0, 0, 0 };
static int keep_alive = 120; static int keep_alive = 120;
static char vmexten[AST_MAX_EXTENSION]; /* Voicemail pilot number */ static char vmexten[AST_MAX_EXTENSION]; /* Voicemail pilot number */
@ -965,7 +967,7 @@ struct ast_hostent ahp;
struct hostent *hp; struct hostent *hp;
static int skinnysock = -1; static int skinnysock = -1;
static pthread_t accept_t; static pthread_t accept_t;
static char context[AST_MAX_CONTEXT] = "default"; static char global_context[AST_MAX_CONTEXT] = "default";
static char language[MAX_LANGUAGE] = ""; static char language[MAX_LANGUAGE] = "";
static char mohinterpret[MAX_MUSICCLASS] = "default"; static char mohinterpret[MAX_MUSICCLASS] = "default";
static char mohsuggest[MAX_MUSICCLASS] = ""; static char mohsuggest[MAX_MUSICCLASS] = "";
@ -2305,15 +2307,15 @@ static int has_voicemail(struct skinny_line *l)
{ {
int new_msgs; int new_msgs;
struct ast_event *event; struct ast_event *event;
char *mailbox, *context; char *mbox, *context;
context = mailbox = ast_strdupa(l->mailbox); context = mbox = ast_strdupa(l->mailbox);
strsep(&context, "@"); strsep(&context, "@");
if (ast_strlen_zero(context)) if (ast_strlen_zero(context))
context = "default"; context = "default";
event = ast_event_get_cached(AST_EVENT_MWI, event = ast_event_get_cached(AST_EVENT_MWI,
AST_EVENT_IE_MAILBOX, AST_EVENT_IE_PLTYPE_STR, mailbox, AST_EVENT_IE_MAILBOX, AST_EVENT_IE_PLTYPE_STR, mbox,
AST_EVENT_IE_CONTEXT, AST_EVENT_IE_PLTYPE_STR, context, AST_EVENT_IE_CONTEXT, AST_EVENT_IE_PLTYPE_STR, context,
AST_EVENT_IE_NEWMSGS, AST_EVENT_IE_PLTYPE_EXISTS, AST_EVENT_IE_NEWMSGS, AST_EVENT_IE_PLTYPE_EXISTS,
AST_EVENT_IE_END); AST_EVENT_IE_END);
@ -3040,7 +3042,7 @@ static struct skinny_device *build_device(const char *cat, struct ast_variable *
} else if (!strcasecmp(v->name, "vmexten")) { } else if (!strcasecmp(v->name, "vmexten")) {
ast_copy_string(device_vmexten, v->value, sizeof(device_vmexten)); ast_copy_string(device_vmexten, v->value, sizeof(device_vmexten));
} else if (!strcasecmp(v->name, "context")) { } else if (!strcasecmp(v->name, "context")) {
ast_copy_string(context, v->value, sizeof(context)); ast_copy_string(global_context, v->value, sizeof(global_context));
} else if (!strcasecmp(v->name, "regexten")) { } else if (!strcasecmp(v->name, "regexten")) {
ast_copy_string(regexten, v->value, sizeof(regexten)); ast_copy_string(regexten, v->value, sizeof(regexten));
} else if (!strcasecmp(v->name, "allow")) { } else if (!strcasecmp(v->name, "allow")) {
@ -3154,7 +3156,7 @@ static struct skinny_device *build_device(const char *cat, struct ast_variable *
ast_copy_string(l->name, v->value, sizeof(l->name)); ast_copy_string(l->name, v->value, sizeof(l->name));
/* XXX Should we check for uniqueness?? XXX */ /* XXX Should we check for uniqueness?? XXX */
ast_copy_string(l->context, context, sizeof(l->context)); ast_copy_string(l->context, global_context, sizeof(l->context));
ast_copy_string(l->cid_num, cid_num, sizeof(l->cid_num)); ast_copy_string(l->cid_num, cid_num, sizeof(l->cid_num));
ast_copy_string(l->cid_name, cid_name, sizeof(l->cid_name)); ast_copy_string(l->cid_name, cid_name, sizeof(l->cid_name));
ast_copy_string(l->label, linelabel, sizeof(l->label)); ast_copy_string(l->label, linelabel, sizeof(l->label));
@ -3249,11 +3251,11 @@ static void start_rtp(struct skinny_subchannel *sub)
ast_channel_set_fd(sub->owner, 3, ast_rtcp_fd(sub->vrtp)); ast_channel_set_fd(sub->owner, 3, ast_rtcp_fd(sub->vrtp));
} }
if (sub->rtp) { if (sub->rtp) {
ast_rtp_setqos(sub->rtp, tos_audio, cos_audio, "Skinny RTP"); ast_rtp_setqos(sub->rtp, qos.tos_audio, qos.cos_audio, "Skinny RTP");
ast_rtp_setnat(sub->rtp, l->nat); ast_rtp_setnat(sub->rtp, l->nat);
} }
if (sub->vrtp) { if (sub->vrtp) {
ast_rtp_setqos(sub->vrtp, tos_video, cos_video, "Skinny VRTP"); ast_rtp_setqos(sub->vrtp, qos.tos_video, qos.cos_video, "Skinny VRTP");
ast_rtp_setnat(sub->vrtp, l->nat); ast_rtp_setnat(sub->vrtp, l->nat);
} }
/* Set Frame packetization */ /* Set Frame packetization */
@ -4940,13 +4942,13 @@ static int handle_line_state_req_message(struct skinny_req *req, struct skinnyse
static int handle_time_date_req_message(struct skinny_req *req, struct skinnysession *s) static int handle_time_date_req_message(struct skinny_req *req, struct skinnysession *s)
{ {
struct timeval tv = ast_tvnow(); struct timeval now = ast_tvnow();
struct ast_tm cmtime; struct ast_tm cmtime;
if (!(req = req_alloc(sizeof(struct definetimedate_message), DEFINETIMEDATE_MESSAGE))) if (!(req = req_alloc(sizeof(struct definetimedate_message), DEFINETIMEDATE_MESSAGE)))
return -1; return -1;
ast_localtime(&tv, &cmtime, NULL); ast_localtime(&now, &cmtime, NULL);
req->data.definetimedate.year = htolel(cmtime.tm_year+1900); req->data.definetimedate.year = htolel(cmtime.tm_year+1900);
req->data.definetimedate.month = htolel(cmtime.tm_mon+1); req->data.definetimedate.month = htolel(cmtime.tm_mon+1);
req->data.definetimedate.dayofweek = htolel(cmtime.tm_wday); req->data.definetimedate.dayofweek = htolel(cmtime.tm_wday);
@ -4955,7 +4957,7 @@ static int handle_time_date_req_message(struct skinny_req *req, struct skinnyses
req->data.definetimedate.minute = htolel(cmtime.tm_min); req->data.definetimedate.minute = htolel(cmtime.tm_min);
req->data.definetimedate.seconds = htolel(cmtime.tm_sec); req->data.definetimedate.seconds = htolel(cmtime.tm_sec);
req->data.definetimedate.milliseconds = htolel(cmtime.tm_usec / 1000); req->data.definetimedate.milliseconds = htolel(cmtime.tm_usec / 1000);
req->data.definetimedate.timestamp = htolel(tv.tv_sec); req->data.definetimedate.timestamp = htolel(now.tv_sec);
transmit_response(s->device, req); transmit_response(s->device, req);
return 1; return 1;
} }
@ -6211,22 +6213,22 @@ static int reload_config(void)
} else if (!strcasecmp(v->name, "dateformat")) { } else if (!strcasecmp(v->name, "dateformat")) {
memcpy(date_format, v->value, sizeof(date_format)); memcpy(date_format, v->value, sizeof(date_format));
} else if (!strcasecmp(v->name, "tos")) { } else if (!strcasecmp(v->name, "tos")) {
if (ast_str2tos(v->value, &tos)) if (ast_str2tos(v->value, &qos.tos))
ast_log(LOG_WARNING, "Invalid tos value at line %d, refer to QoS documentation\n", v->lineno); ast_log(LOG_WARNING, "Invalid tos value at line %d, refer to QoS documentation\n", v->lineno);
} else if (!strcasecmp(v->name, "tos_audio")) { } else if (!strcasecmp(v->name, "tos_audio")) {
if (ast_str2tos(v->value, &tos_audio)) if (ast_str2tos(v->value, &qos.tos_audio))
ast_log(LOG_WARNING, "Invalid tos_audio value at line %d, refer to QoS documentation\n", v->lineno); ast_log(LOG_WARNING, "Invalid tos_audio value at line %d, refer to QoS documentation\n", v->lineno);
} else if (!strcasecmp(v->name, "tos_video")) { } else if (!strcasecmp(v->name, "tos_video")) {
if (ast_str2tos(v->value, &tos_video)) if (ast_str2tos(v->value, &qos.tos_video))
ast_log(LOG_WARNING, "Invalid tos_video value at line %d, refer to QoS documentation\n", v->lineno); ast_log(LOG_WARNING, "Invalid tos_video value at line %d, refer to QoS documentation\n", v->lineno);
} else if (!strcasecmp(v->name, "cos")) { } else if (!strcasecmp(v->name, "cos")) {
if (ast_str2cos(v->value, &cos)) if (ast_str2cos(v->value, &qos.cos))
ast_log(LOG_WARNING, "Invalid cos value at line %d, refer to QoS documentation\n", v->lineno); ast_log(LOG_WARNING, "Invalid cos value at line %d, refer to QoS documentation\n", v->lineno);
} else if (!strcasecmp(v->name, "cos_audio")) { } else if (!strcasecmp(v->name, "cos_audio")) {
if (ast_str2cos(v->value, &cos_audio)) if (ast_str2cos(v->value, &qos.cos_audio))
ast_log(LOG_WARNING, "Invalid cos_audio value at line %d, refer to QoS documentation\n", v->lineno); ast_log(LOG_WARNING, "Invalid cos_audio value at line %d, refer to QoS documentation\n", v->lineno);
} else if (!strcasecmp(v->name, "cos_video")) { } else if (!strcasecmp(v->name, "cos_video")) {
if (ast_str2cos(v->value, &cos_video)) if (ast_str2cos(v->value, &qos.cos_video))
ast_log(LOG_WARNING, "Invalid cos_video value at line %d, refer to QoS documentation\n", v->lineno); ast_log(LOG_WARNING, "Invalid cos_video value at line %d, refer to QoS documentation\n", v->lineno);
} else if (!strcasecmp(v->name, "allow")) { } else if (!strcasecmp(v->name, "allow")) {
ast_parse_allow_disallow(&default_prefs, &default_capability, v->value, 1); ast_parse_allow_disallow(&default_prefs, &default_capability, v->value, 1);
@ -6312,7 +6314,7 @@ static int reload_config(void)
} }
ast_verb(2, "Skinny listening on %s:%d\n", ast_verb(2, "Skinny listening on %s:%d\n",
ast_inet_ntoa(bindaddr.sin_addr), ntohs(bindaddr.sin_port)); ast_inet_ntoa(bindaddr.sin_addr), ntohs(bindaddr.sin_port));
ast_netsock_set_qos(skinnysock, tos, cos, "Skinny"); ast_netsock_set_qos(skinnysock, qos.tos, qos.cos, "Skinny");
ast_pthread_create_background(&accept_t, NULL, accept_thread, NULL); ast_pthread_create_background(&accept_t, NULL, accept_thread, NULL);
} }
} }

@ -180,7 +180,7 @@ enum autoprov_extn {
#define FAV_MAX_LENGTH 0x0A #define FAV_MAX_LENGTH 0x0A
static void dummy(char *dummy, ...) static void dummy(char *unused, ...)
{ {
return; return;
} }
@ -206,17 +206,21 @@ static int unistim_port;
static enum autoprovision autoprovisioning = AUTOPROVISIONING_NO; static enum autoprovision autoprovisioning = AUTOPROVISIONING_NO;
static int unistim_keepalive; static int unistim_keepalive;
static int unistimsock = -1; static int unistimsock = -1;
static unsigned int tos = 0;
static unsigned int tos_audio = 0; static struct {
static unsigned int cos = 0; unsigned int tos;
static unsigned int cos_audio = 0; unsigned int tos_audio;
unsigned int cos;
unsigned int cos_audio;
} qos = { 0, 0, 0, 0 };
static struct io_context *io; static struct io_context *io;
static struct sched_context *sched; static struct sched_context *sched;
static struct sockaddr_in public_ip = { 0, }; static struct sockaddr_in public_ip = { 0, };
/*! give the IP address for the last packet received */ /*! give the IP address for the last packet received */
static struct sockaddr_in addr_from; static struct sockaddr_in address_from;
/*! size of the sockaddr_in (in WSARecvFrom) */ /*! size of the sockaddr_in (in WSARecvFrom) */
static unsigned int size_addr_from = sizeof(addr_from); static unsigned int size_addr_from = sizeof(address_from);
/*! Receive buffer address */ /*! Receive buffer address */
static unsigned char *buff; static unsigned char *buff;
static int unistim_reloading = 0; static int unistim_reloading = 0;
@ -663,7 +667,7 @@ static unsigned char packet_send_ping[] =
#define BUFFSEND unsigned char buffsend[64] = { 0x00, 0x00, 0xaa, 0xbb, 0x02, 0x01 } #define BUFFSEND unsigned char buffsend[64] = { 0x00, 0x00, 0xaa, 0xbb, 0x02, 0x01 }
static const char tdesc[] = "UNISTIM Channel Driver"; static const char tdesc[] = "UNISTIM Channel Driver";
static const char type[] = "USTM"; static const char channel_type[] = "USTM";
/*! Protos */ /*! Protos */
static struct ast_channel *unistim_new(struct unistim_subchannel *sub, int state); static struct ast_channel *unistim_new(struct unistim_subchannel *sub, int state);
@ -692,7 +696,7 @@ static int write_entry_history(struct unistimsession *pte, FILE * f, char c,
static void change_callerid(struct unistimsession *pte, int type, char *callerid); static void change_callerid(struct unistimsession *pte, int type, char *callerid);
static const struct ast_channel_tech unistim_tech = { static const struct ast_channel_tech unistim_tech = {
.type = type, .type = channel_type,
.description = tdesc, .description = tdesc,
.capabilities = CAPABILITY, .capabilities = CAPABILITY,
.properties = AST_CHAN_TP_WANTSJITTER | AST_CHAN_TP_CREATESJITTER, .properties = AST_CHAN_TP_WANTSJITTER | AST_CHAN_TP_CREATESJITTER,
@ -723,9 +727,9 @@ static void display_last_error(const char *sz_msg)
static unsigned int get_tick_count(void) static unsigned int get_tick_count(void)
{ {
struct timeval tv = ast_tvnow(); struct timeval now = ast_tvnow();
return (tv.tv_sec * 1000) + (tv.tv_usec / 1000); return (now.tv_sec * 1000) + (now.tv_usec / 1000);
} }
/* Send data to a phone without retransmit nor buffering */ /* Send data to a phone without retransmit nor buffering */
@ -1356,13 +1360,13 @@ static void send_texttitle(struct unistimsession *pte, const char *text)
static void send_date_time(struct unistimsession *pte) static void send_date_time(struct unistimsession *pte)
{ {
BUFFSEND; BUFFSEND;
struct timeval tv = ast_tvnow(); struct timeval now = ast_tvnow();
struct ast_tm atm = { 0, }; struct ast_tm atm = { 0, };
if (unistimdebug) if (unistimdebug)
ast_verb(0, "Sending Time & Date\n"); ast_verb(0, "Sending Time & Date\n");
memcpy(buffsend + SIZE_HEADER, packet_send_date_time, sizeof(packet_send_date_time)); memcpy(buffsend + SIZE_HEADER, packet_send_date_time, sizeof(packet_send_date_time));
ast_localtime(&tv, &atm, NULL); ast_localtime(&now, &atm, NULL);
buffsend[10] = (unsigned char) atm.tm_mon + 1; buffsend[10] = (unsigned char) atm.tm_mon + 1;
buffsend[11] = (unsigned char) atm.tm_mday; buffsend[11] = (unsigned char) atm.tm_mday;
buffsend[12] = (unsigned char) atm.tm_hour; buffsend[12] = (unsigned char) atm.tm_hour;
@ -1373,13 +1377,13 @@ static void send_date_time(struct unistimsession *pte)
static void send_date_time2(struct unistimsession *pte) static void send_date_time2(struct unistimsession *pte)
{ {
BUFFSEND; BUFFSEND;
struct timeval tv = ast_tvnow(); struct timeval now = ast_tvnow();
struct ast_tm atm = { 0, }; struct ast_tm atm = { 0, };
if (unistimdebug) if (unistimdebug)
ast_verb(0, "Sending Time & Date #2\n"); ast_verb(0, "Sending Time & Date #2\n");
memcpy(buffsend + SIZE_HEADER, packet_send_date_time2, sizeof(packet_send_date_time2)); memcpy(buffsend + SIZE_HEADER, packet_send_date_time2, sizeof(packet_send_date_time2));
ast_localtime(&tv, &atm, NULL); ast_localtime(&now, &atm, NULL);
if (pte->device) if (pte->device)
buffsend[9] = pte->device->datetimeformat; buffsend[9] = pte->device->datetimeformat;
else else
@ -1394,13 +1398,13 @@ static void send_date_time2(struct unistimsession *pte)
static void send_date_time3(struct unistimsession *pte) static void send_date_time3(struct unistimsession *pte)
{ {
BUFFSEND; BUFFSEND;
struct timeval tv = ast_tvnow(); struct timeval now = ast_tvnow();
struct ast_tm atm = { 0, }; struct ast_tm atm = { 0, };
if (unistimdebug) if (unistimdebug)
ast_verb(0, "Sending Time & Date #3\n"); ast_verb(0, "Sending Time & Date #3\n");
memcpy(buffsend + SIZE_HEADER, packet_send_date_time3, sizeof(packet_send_date_time3)); memcpy(buffsend + SIZE_HEADER, packet_send_date_time3, sizeof(packet_send_date_time3));
ast_localtime(&tv, &atm, NULL); ast_localtime(&now, &atm, NULL);
buffsend[10] = (unsigned char) atm.tm_mon + 1; buffsend[10] = (unsigned char) atm.tm_mon + 1;
buffsend[11] = (unsigned char) atm.tm_mday; buffsend[11] = (unsigned char) atm.tm_mday;
buffsend[12] = (unsigned char) atm.tm_hour; buffsend[12] = (unsigned char) atm.tm_hour;
@ -1692,7 +1696,7 @@ static int write_history(struct unistimsession *pte, char way, char ismissed)
char count = 0, *histbuf; char count = 0, *histbuf;
int size; int size;
FILE *f, *f2; FILE *f, *f2;
struct timeval tv = ast_tvnow(); struct timeval now = ast_tvnow();
struct ast_tm atm = { 0, }; struct ast_tm atm = { 0, };
if (!pte->device) if (!pte->device)
@ -1713,7 +1717,7 @@ static int write_history(struct unistimsession *pte, char way, char ismissed)
} }
} }
ast_localtime(&tv, &atm, NULL); ast_localtime(&now, &atm, NULL);
if (ismissed) { if (ismissed) {
if (way == 'i') if (way == 'i')
strcpy(tmp2, "Miss"); strcpy(tmp2, "Miss");
@ -2064,7 +2068,7 @@ static void start_rtp(struct unistim_subchannel *sub)
sub->owner->fds[1] = ast_rtcp_fd(sub->rtp); sub->owner->fds[1] = ast_rtcp_fd(sub->rtp);
} }
if (sub->rtp) { if (sub->rtp) {
ast_rtp_setqos(sub->rtp, tos_audio, cos_audio, "UNISTIM RTP"); ast_rtp_setqos(sub->rtp, qos.tos_audio, qos.cos_audio, "UNISTIM RTP");
ast_rtp_setnat(sub->rtp, sub->parent->parent->nat); ast_rtp_setnat(sub->rtp, sub->parent->parent->nat);
} }
@ -2376,11 +2380,11 @@ static void HandleCallOutgoing(struct unistimsession *s)
} else { /* We already have a call, so we switch in a threeway call */ } else { /* We already have a call, so we switch in a threeway call */
if (s->device->moh) { if (s->device->moh) {
struct unistim_subchannel *sub; struct unistim_subchannel *subchannel;
struct unistim_line *p = s->device->lines; struct unistim_line *p = s->device->lines;
sub = p->subs[SUB_REAL]; subchannel = p->subs[SUB_REAL];
if (!sub->owner) { if (!subchannel->owner) {
ast_log(LOG_WARNING, "Unable to find subchannel for music on hold\n"); ast_log(LOG_WARNING, "Unable to find subchannel for music on hold\n");
return; return;
} }
@ -2397,7 +2401,7 @@ static void HandleCallOutgoing(struct unistimsession *s)
if (s->device->silence_generator) { if (s->device->silence_generator) {
if (unistimdebug) if (unistimdebug)
ast_verb(0, "Stopping silence generator\n"); ast_verb(0, "Stopping silence generator\n");
ast_channel_stop_silence_generator(sub->owner, ast_channel_stop_silence_generator(subchannel->owner,
s->device->silence_generator); s->device->silence_generator);
s->device->silence_generator = NULL; s->device->silence_generator = NULL;
} }
@ -5318,16 +5322,16 @@ static int reload_config(void)
else if (!strcasecmp(v->name, "port")) else if (!strcasecmp(v->name, "port"))
unistim_port = atoi(v->value); unistim_port = atoi(v->value);
else if (!strcasecmp(v->name, "tos")) { else if (!strcasecmp(v->name, "tos")) {
if (ast_str2tos(v->value, &tos)) if (ast_str2tos(v->value, &qos.tos))
ast_log(LOG_WARNING, "Invalid tos value at line %d, refer to QoS documentation\n", v->lineno); ast_log(LOG_WARNING, "Invalid tos value at line %d, refer to QoS documentation\n", v->lineno);
} else if (!strcasecmp(v->name, "tos_audio")) { } else if (!strcasecmp(v->name, "tos_audio")) {
if (ast_str2tos(v->value, &tos_audio)) if (ast_str2tos(v->value, &qos.tos_audio))
ast_log(LOG_WARNING, "Invalid tos_audio value at line %d, refer to QoS documentation\n", v->lineno); ast_log(LOG_WARNING, "Invalid tos_audio value at line %d, refer to QoS documentation\n", v->lineno);
} else if (!strcasecmp(v->name, "cos")) { } else if (!strcasecmp(v->name, "cos")) {
if (ast_str2cos(v->value, &cos)) if (ast_str2cos(v->value, &qos.cos))
ast_log(LOG_WARNING, "Invalid cos value at line %d, refer to QoS documentation\n", v->lineno); ast_log(LOG_WARNING, "Invalid cos value at line %d, refer to QoS documentation\n", v->lineno);
} else if (!strcasecmp(v->name, "cos_audio")) { } else if (!strcasecmp(v->name, "cos_audio")) {
if (ast_str2cos(v->value, &cos_audio)) if (ast_str2cos(v->value, &qos.cos_audio))
ast_log(LOG_WARNING, "Invalid cos_audio value at line %d, refer to QoS documentation\n", v->lineno); ast_log(LOG_WARNING, "Invalid cos_audio value at line %d, refer to QoS documentation\n", v->lineno);
} else if (!strcasecmp(v->name, "autoprovisioning")) { } else if (!strcasecmp(v->name, "autoprovisioning")) {
if (!strcasecmp(v->value, "no")) if (!strcasecmp(v->value, "no"))
@ -5506,7 +5510,7 @@ static int reload_config(void)
unistimsock = -1; unistimsock = -1;
} else { } else {
ast_verb(2, "UNISTIM Listening on %s:%d\n", ast_inet_ntoa(bindaddr.sin_addr), htons(bindaddr.sin_port)); ast_verb(2, "UNISTIM Listening on %s:%d\n", ast_inet_ntoa(bindaddr.sin_addr), htons(bindaddr.sin_port));
ast_netsock_set_qos(unistimsock, tos, cos, "UNISTIM"); ast_netsock_set_qos(unistimsock, qos.tos, qos.cos, "UNISTIM");
} }
return 0; return 0;
} }
@ -5552,7 +5556,7 @@ static int unistim_set_rtp_peer(struct ast_channel *chan, struct ast_rtp *rtp,
} }
static struct ast_rtp_protocol unistim_rtp = { static struct ast_rtp_protocol unistim_rtp = {
.type = type, .type = channel_type,
.get_rtp_info = unistim_get_rtp_peer, .get_rtp_info = unistim_get_rtp_peer,
.get_vrtp_info = unistim_get_vrtp_peer, .get_vrtp_info = unistim_get_vrtp_peer,
.set_rtp_peer = unistim_set_rtp_peer, .set_rtp_peer = unistim_set_rtp_peer,
@ -5584,7 +5588,7 @@ int load_module(void)
/* Make sure we can register our unistim channel type */ /* Make sure we can register our unistim channel type */
if (ast_channel_register(&unistim_tech)) { if (ast_channel_register(&unistim_tech)) {
ast_log(LOG_ERROR, "Unable to register channel type '%s'\n", type); ast_log(LOG_ERROR, "Unable to register channel type '%s'\n", channel_type);
goto chanreg_failed; goto chanreg_failed;
} }

@ -224,7 +224,7 @@ static struct iax2_ie {
int ie; int ie;
char *name; char *name;
void (*dump)(char *output, int maxlen, void *value, int len); void (*dump)(char *output, int maxlen, void *value, int len);
} ies[] = { } infoelts[] = {
{ IAX_IE_CALLED_NUMBER, "CALLED NUMBER", dump_string }, { IAX_IE_CALLED_NUMBER, "CALLED NUMBER", dump_string },
{ IAX_IE_CALLING_NUMBER, "CALLING NUMBER", dump_string }, { IAX_IE_CALLING_NUMBER, "CALLING NUMBER", dump_string },
{ IAX_IE_CALLING_ANI, "ANI", dump_string }, { IAX_IE_CALLING_ANI, "ANI", dump_string },
@ -302,9 +302,9 @@ static struct iax2_ie prov_ies[] = {
const char *iax_ie2str(int ie) const char *iax_ie2str(int ie)
{ {
int x; int x;
for (x=0;x<(int)sizeof(ies) / (int)sizeof(ies[0]); x++) { for (x = 0; x < ARRAY_LEN(infoelts); x++) {
if (ies[x].ie == ie) if (infoelts[x].ie == ie)
return ies[x].name; return infoelts[x].name;
} }
return "Unknown IE"; return "Unknown IE";
} }
@ -381,18 +381,18 @@ static void dump_ies(unsigned char *iedata, int len)
return; return;
} }
found = 0; found = 0;
for (x=0;x<(int)sizeof(ies) / (int)sizeof(ies[0]); x++) { for (x = 0; x < ARRAY_LEN(infoelts); x++) {
if (ies[x].ie == ie) { if (infoelts[x].ie == ie) {
if (ies[x].dump) { if (infoelts[x].dump) {
ies[x].dump(interp, (int)sizeof(interp), iedata + 2, ielen); infoelts[x].dump(interp, (int)sizeof(interp), iedata + 2, ielen);
snprintf(tmp, (int)sizeof(tmp), " %-15.15s : %s\n", ies[x].name, interp); snprintf(tmp, (int)sizeof(tmp), " %-15.15s : %s\n", infoelts[x].name, interp);
outputf(tmp); outputf(tmp);
} else { } else {
if (ielen) if (ielen)
snprintf(interp, (int)sizeof(interp), "%d bytes", ielen); snprintf(interp, (int)sizeof(interp), "%d bytes", ielen);
else else
strcpy(interp, "Present"); strcpy(interp, "Present");
snprintf(tmp, (int)sizeof(tmp), " %-15.15s : %s\n", ies[x].name, interp); snprintf(tmp, (int)sizeof(tmp), " %-15.15s : %s\n", infoelts[x].name, interp);
outputf(tmp); outputf(tmp);
} }
found++; found++;
@ -410,7 +410,7 @@ static void dump_ies(unsigned char *iedata, int len)
void iax_showframe(struct iax_frame *f, struct ast_iax2_full_hdr *fhi, int rx, struct sockaddr_in *sin, int datalen) void iax_showframe(struct iax_frame *f, struct ast_iax2_full_hdr *fhi, int rx, struct sockaddr_in *sin, int datalen)
{ {
const char *frames[] = { const char *framelist[] = {
"(0?)", "(0?)",
"DTMF_E ", "DTMF_E ",
"VOICE ", "VOICE ",
@ -523,11 +523,11 @@ void iax_showframe(struct iax_frame *f, struct ast_iax2_full_hdr *fhi, int rx, s
/* Don't mess with mini-frames */ /* Don't mess with mini-frames */
return; return;
} }
if (fh->type >= (int)sizeof(frames)/(int)sizeof(frames[0])) { if (fh->type >= ARRAY_LEN(framelist)) {
snprintf(class2, sizeof(class2), "(%d?)", fh->type); snprintf(class2, sizeof(class2), "(%d?)", fh->type);
class = class2; class = class2;
} else { } else {
class = frames[(int)fh->type]; class = framelist[(int)fh->type];
} }
if (fh->type == AST_FRAME_DTMF_BEGIN || fh->type == AST_FRAME_DTMF_END) { if (fh->type == AST_FRAME_DTMF_BEGIN || fh->type == AST_FRAME_DTMF_END) {
sprintf(subclass2, "%c", fh->csub); sprintf(subclass2, "%c", fh->csub);
@ -926,9 +926,9 @@ int iax_parse_ies(struct iax_ies *ies, unsigned char *data, int datalen)
/* Existing variable or new variable? */ /* Existing variable or new variable? */
for (var2 = ies->vars, prev = NULL; var2; prev = var2, var2 = var2->next) { for (var2 = ies->vars, prev = NULL; var2; prev = var2, var2 = var2->next) {
if (strcmp(tmp, var2->name) == 0) { if (strcmp(tmp, var2->name) == 0) {
int len = strlen(var2->value) + strlen(tmp2) + 1; int length = strlen(var2->value) + strlen(tmp2) + 1;
char *tmp3 = alloca(len); char *tmp3 = alloca(length);
snprintf(tmp3, len, "%s%s", var2->value, tmp2); snprintf(tmp3, length, "%s%s", var2->value, tmp2);
var = ast_variable_new(tmp, tmp3, var2->file); var = ast_variable_new(tmp, tmp3, var2->file);
var->next = var2->next; var->next = var2->next;
if (prev) if (prev)
@ -1103,13 +1103,13 @@ void iax_frame_free(struct iax_frame *fr)
#if !defined(LOW_MEMORY) #if !defined(LOW_MEMORY)
static void frame_cache_cleanup(void *data) static void frame_cache_cleanup(void *data)
{ {
struct iax_frames *frames = data; struct iax_frames *framelist = data;
struct iax_frame *cur; struct iax_frame *current;
while ((cur = AST_LIST_REMOVE_HEAD(&frames->list, list))) while ((current = AST_LIST_REMOVE_HEAD(&framelist->list, list)))
ast_free(cur); ast_free(current);
ast_free(frames); ast_free(framelist);
} }
#endif #endif

@ -76,13 +76,13 @@ static int ppdrvdev=0;
/* /*
Trace Routines Trace Routines
*/ */
void strace(i16 point, t_sdbg *sdbg, i16 index, i16 value) void strace(i16 point, t_sdbg *sdbg, i16 idx, i16 value)
{ {
// make dbg_trace buffer in structure // make dbg_trace buffer in structure
if(!sdbg->mode || sdbg->point[point]<0){ if(!sdbg->mode || sdbg->point[point]<0){
return; return;
} else { } else {
sdbg->buffer[(index*XPMR_DEBUG_CHANS) + sdbg->point[point]] = value; sdbg->buffer[(idx*XPMR_DEBUG_CHANS) + sdbg->point[point]] = value;
} }
} }
/* /*
@ -268,8 +268,8 @@ i16 code_string_parse(t_pmr_chan *pChan)
// Do Receive Codes String // Do Receive Codes String
for(i=0;i<pChan->numrxcodes;i++) for(i=0;i<pChan->numrxcodes;i++)
{ {
i16 ii,ri,ti; i16 ri,_ti;
float f; float _f;
p=pChan->pStr=pChan->pRxCode[i]; p=pChan->pStr=pChan->pRxCode[i];
@ -277,32 +277,33 @@ i16 code_string_parse(t_pmr_chan *pChan)
if(!xpmrx(pChan,XXO_LSDCODEPARSE_1)) if(!xpmrx(pChan,XXO_LSDCODEPARSE_1))
#endif #endif
{ {
sscanf(p,"%f",&f); sscanf(p,"%f",&_f);
ri=CtcssFreqIndex(f); ri=CtcssFreqIndex(_f);
if(ri>maxctcssindex)maxctcssindex=ri; if(ri>maxctcssindex)maxctcssindex=ri;
sscanf(pChan->pTxCode[i],"%f",&f); sscanf(pChan->pTxCode[i],"%f",&_f);
ti=CtcssFreqIndex(f); _ti=CtcssFreqIndex(_f);
if(f>maxctcsstxfreq)maxctcsstxfreq=f; if(_f>maxctcsstxfreq)maxctcsstxfreq=_f;
if(ri>CTCSS_NULL && ti>CTCSS_NULL) if(ri>CTCSS_NULL && _ti>CTCSS_NULL)
{ {
pChan->b.ctcssRxEnable=pChan->b.ctcssTxEnable=1; pChan->b.ctcssRxEnable=pChan->b.ctcssTxEnable=1;
pChan->rxCtcssMap[ri]=ti; pChan->rxCtcssMap[ri]=_ti;
pChan->numrxctcssfreqs++; pChan->numrxctcssfreqs++;
TRACEF(1,("pChan->rxctcss[%i]=%s pChan->rxCtcssMap[%i]=%i\n",i,pChan->rxctcss[i],ri,ti)); TRACEF(1,("pChan->rxctcss[%i]=%s pChan->rxCtcssMap[%i]=%i\n",i,pChan->rxctcss[i],ri,_ti));
} }
else if(ri>CTCSS_NULL && f==0) else if(ri>CTCSS_NULL && _f==0)
{ {
pChan->b.ctcssRxEnable=1; pChan->b.ctcssRxEnable=1;
pChan->rxCtcssMap[ri]=CTCSS_RXONLY; pChan->rxCtcssMap[ri]=CTCSS_RXONLY;
pChan->numrxctcssfreqs++; pChan->numrxctcssfreqs++;
TRACEF(1,("pChan->rxctcss[%i]=%s pChan->rxCtcssMap[%i]=%i RXONLY\n",i,pChan->rxctcss[i],ri,ti)); TRACEF(1,("pChan->rxctcss[%i]=%s pChan->rxCtcssMap[%i]=%i RXONLY\n",i,pChan->rxctcss[i],ri,_ti));
} }
else else
{ {
i16 _ii;
pChan->numrxctcssfreqs=0; pChan->numrxctcssfreqs=0;
for(ii=0;ii<CTCSS_NUM_CODES;ii++) pChan->rxCtcssMap[ii]=CTCSS_NULL; for(_ii=0;_ii<CTCSS_NUM_CODES;_ii++) pChan->rxCtcssMap[_ii]=CTCSS_NULL;
TRACEF(1,("WARNING: Invalid Channel code detected and ignored. %i %s %s \n",i,pChan->pRxCode[i],pChan->pTxCode[i])); TRACEF(1,("WARNING: Invalid Channel code detected and ignored. %i %s %s \n",i,pChan->pRxCode[i],pChan->pTxCode[i]));
} }
} }
@ -825,7 +826,7 @@ i16 gp_diff(t_pmr_sps *mySps)
i32 i; i32 i;
i32 temp0,temp1; i32 temp0,temp1;
i16 x0; i16 x0;
i32 y0; i32 _y0;
i16 a0,a1; i16 a0,a1;
i16 b0; i16 b0;
i16 *coef; i16 *coef;
@ -855,12 +856,12 @@ i16 gp_diff(t_pmr_sps *mySps)
temp0 = x0 * a1; temp0 = x0 * a1;
x0 = input[i]; x0 = input[i];
temp1 = input[i] * a0; temp1 = input[i] * a0;
y0 = (temp0 + temp1)/calcAdjust; _y0 = (temp0 + temp1)/calcAdjust;
y0 =(y0*outputGain)/M_Q8; _y0 = (_y0*outputGain)/M_Q8;
if(y0>32766)y0=32766; if(_y0>32766)_y0=32766;
else if(y0<-32766)y0=-32766; else if(_y0<-32766)_y0=-32766;
output[i]=y0; output[i]=_y0;
} }
x[0]=x0; x[0]=x0;

@ -334,12 +334,12 @@ static void drop_translator(int dst, int src)
static void unregister_translators(void) static void unregister_translators(void)
{ {
struct translator *cur; struct translator *current;
AST_LIST_LOCK(&translators); AST_LIST_LOCK(&translators);
while ((cur = AST_LIST_REMOVE_HEAD(&translators, entry))) { while ((current = AST_LIST_REMOVE_HEAD(&translators, entry))) {
ast_unregister_translator(&cur->t); ast_unregister_translator(&current->t);
ast_free(cur); ast_free(current);
} }
AST_LIST_UNLOCK(&translators); AST_LIST_UNLOCK(&translators);
} }

Loading…
Cancel
Save