[asterisk-commits] oej: branch oej/pinequeue-1.8 r369920 - in /team/oej/pinequeue-1.8: ./ apps/ ...
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Wed Jul 11 07:05:17 CDT 2012
Author: oej
Date: Wed Jul 11 07:05:12 2012
New Revision: 369920
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=369920
Log:
Resolving conflicts
Added:
team/oej/pinequeue-1.8/main/adsi.c
- copied unchanged from r369869, branches/1.8/main/adsi.c
Removed:
team/oej/pinequeue-1.8/res/res_adsi.exports.in
Modified:
team/oej/pinequeue-1.8/ (props changed)
team/oej/pinequeue-1.8/apps/app_dial.c
team/oej/pinequeue-1.8/apps/app_queue.c
team/oej/pinequeue-1.8/apps/app_stack.c
team/oej/pinequeue-1.8/apps/app_voicemail.c
team/oej/pinequeue-1.8/channels/chan_sip.c
team/oej/pinequeue-1.8/channels/sip/include/sip.h
team/oej/pinequeue-1.8/configs/sip_notify.conf.sample
team/oej/pinequeue-1.8/include/asterisk/adsi.h
team/oej/pinequeue-1.8/main/Makefile
team/oej/pinequeue-1.8/main/bridging.c
team/oej/pinequeue-1.8/main/cdr.c
team/oej/pinequeue-1.8/main/features.c
team/oej/pinequeue-1.8/main/pbx.c
team/oej/pinequeue-1.8/main/tcptls.c
team/oej/pinequeue-1.8/res/res_adsi.c
Propchange: team/oej/pinequeue-1.8/
------------------------------------------------------------------------------
automerge = Is-there-life-off-net?
Propchange: team/oej/pinequeue-1.8/
------------------------------------------------------------------------------
--- svnmerge-integrated (original)
+++ svnmerge-integrated Wed Jul 11 07:05:12 2012
@@ -1,1 +1,1 @@
-/branches/1.8:1-369250
+/branches/1.8:1-369914
Modified: team/oej/pinequeue-1.8/apps/app_dial.c
URL: http://svnview.digium.com/svn/asterisk/team/oej/pinequeue-1.8/apps/app_dial.c?view=diff&rev=369920&r1=369919&r2=369920
==============================================================================
--- team/oej/pinequeue-1.8/apps/app_dial.c (original)
+++ team/oej/pinequeue-1.8/apps/app_dial.c Wed Jul 11 07:05:12 2012
@@ -2688,7 +2688,9 @@
ast_copy_string(peer->context, chan->context, sizeof(peer->context));
ast_copy_string(peer->exten, chan->exten, sizeof(peer->exten));
peer->priority = chan->priority + 2;
- ast_pbx_start(peer);
+ if (ast_pbx_start(peer)) {
+ ast_hangup(peer);
+ }
hanguptree(outgoing, NULL, ast_test_flag64(&opts, OPT_CANCEL_ELSEWHERE) ? 1 : 0);
if (continue_exec)
*continue_exec = 1;
@@ -2979,24 +2981,26 @@
}
ast_set2_flag(peer, autoloopflag, AST_FLAG_IN_AUTOLOOP); /* set it back the way it was */
}
- if (!ast_check_hangup(peer) && ast_test_flag64(&opts, OPT_CALLEE_GO_ON)) {
- if(!ast_strlen_zero(opt_args[OPT_ARG_CALLEE_GO_ON])) {
- replace_macro_delimiter(opt_args[OPT_ARG_CALLEE_GO_ON]);
- ast_parseable_goto(peer, opt_args[OPT_ARG_CALLEE_GO_ON]);
- } else { /* F() */
- int res;
- res = ast_goto_if_exists(peer, chan->context, chan->exten, (chan->priority) + 1);
- if (res == AST_PBX_GOTO_FAILED) {
- ast_hangup(peer);
+ if (!ast_check_hangup(peer)) {
+ if (ast_test_flag64(&opts, OPT_CALLEE_GO_ON)) {
+ int goto_res;
+
+ if (!ast_strlen_zero(opt_args[OPT_ARG_CALLEE_GO_ON])) {
+ replace_macro_delimiter(opt_args[OPT_ARG_CALLEE_GO_ON]);
+ goto_res = ast_parseable_goto(peer, opt_args[OPT_ARG_CALLEE_GO_ON]);
+ } else { /* F() */
+ goto_res = ast_goto_if_exists(peer, chan->context,
+ chan->exten, chan->priority + 1);
+ }
+ if (!goto_res && !ast_pbx_start(peer)) {
+ /* The peer is now running its own PBX. */
goto out;
}
- }
- ast_pbx_start(peer);
- } else {
- if (!ast_check_hangup(chan))
+ } else {
chan->hangupcause = peer->hangupcause;
- ast_hangup(peer);
- }
+ }
+ }
+ ast_hangup(peer);
}
out:
if (moh) {
Modified: team/oej/pinequeue-1.8/apps/app_queue.c
URL: http://svnview.digium.com/svn/asterisk/team/oej/pinequeue-1.8/apps/app_queue.c?view=diff&rev=369920&r1=369919&r2=369920
==============================================================================
--- team/oej/pinequeue-1.8/apps/app_queue.c (original)
+++ team/oej/pinequeue-1.8/apps/app_queue.c Wed Jul 11 07:05:12 2012
@@ -4680,11 +4680,6 @@
int res2;
res2 = ast_autoservice_start(qe->chan);
-
- /* instead of starting autoservice and jacking this thread to push sound to the
- peer channel, let's set up a background player to the peer channel and
- get on with life in this thread. */
-
if (qe->parent->memberdelay) {
ast_log(LOG_NOTICE, "Delaying member connect for %d seconds\n", qe->parent->memberdelay);
res2 |= ast_safe_sleep(peer, qe->parent->memberdelay * 1000);
@@ -4716,8 +4711,8 @@
}
}
}
- }
- res2 |= ast_autoservice_stop(qe->chan);
+ ast_autoservice_stop(qe->chan);
+ }
if (ast_check_hangup(peer)) {
@@ -4737,8 +4732,8 @@
ast_hangup(peer);
ao2_ref(member, -1);
goto out;
- } else if (res2) {
- /* Caller must have hung up just before being connected*/
+ } else if (ast_check_hangup(qe->chan)) {
+ /* Caller must have hung up just before being connected */
ast_log(LOG_NOTICE, "Caller was about to talk to agent on %s but the caller hungup.\n", peer->name);
ast_queue_log(queuename, qe->chan->uniqueid, member->membername, "ABANDON", "%d|%d|%ld", qe->pos, qe->opos, (long) time(NULL) - qe->start);
record_abandoned(qe);
Modified: team/oej/pinequeue-1.8/apps/app_stack.c
URL: http://svnview.digium.com/svn/asterisk/team/oej/pinequeue-1.8/apps/app_stack.c?view=diff&rev=369920&r1=369919&r2=369920
==============================================================================
--- team/oej/pinequeue-1.8/apps/app_stack.c (original)
+++ team/oej/pinequeue-1.8/apps/app_stack.c Wed Jul 11 07:05:12 2012
@@ -73,10 +73,14 @@
<parameter name="condition" required="true" />
<parameter name="destination" required="true" argsep=":">
<argument name="labeliftrue" hasparams="optional">
+ <para>Continue at <replaceable>labeliftrue</replaceable> if the condition is true.
+ Takes the form similar to Goto() of [[context,]extension,]priority.</para>
<argument name="arg1" required="true" multiple="true" />
<argument name="argN" />
</argument>
<argument name="labeliffalse" hasparams="optional">
+ <para>Continue at <replaceable>labeliffalse</replaceable> if the condition is false.
+ Takes the form similar to Goto() of [[context,]extension,]priority.</para>
<argument name="arg1" required="true" multiple="true" />
<argument name="argN" />
</argument>
@@ -93,6 +97,7 @@
<ref type="application">MacroIf</ref>
<ref type="function">IF</ref>
<ref type="application">GotoIf</ref>
+ <ref type="application">Goto</ref>
</see-also>
</application>
<application name="Return" language="en_US">
Modified: team/oej/pinequeue-1.8/apps/app_voicemail.c
URL: http://svnview.digium.com/svn/asterisk/team/oej/pinequeue-1.8/apps/app_voicemail.c?view=diff&rev=369920&r1=369919&r2=369920
==============================================================================
--- team/oej/pinequeue-1.8/apps/app_voicemail.c (original)
+++ team/oej/pinequeue-1.8/apps/app_voicemail.c Wed Jul 11 07:05:12 2012
@@ -1758,24 +1758,27 @@
static int vm_allocate_dh(struct vm_state *vms, struct ast_vm_user *vmu, int count_msg) {
int arraysize = (vmu->maxmsg > count_msg ? vmu->maxmsg : count_msg);
- if (!vms->dh_arraysize) {
- /* initial allocation */
+
+ /* remove old allocation */
+ if (vms->deleted) {
+ ast_free(vms->deleted);
+ vms->deleted = NULL;
+ }
+ if (vms->heard) {
+ ast_free(vms->heard);
+ vms->heard = NULL;
+ }
+ vms->dh_arraysize = 0;
+
+ if (arraysize > 0) {
if (!(vms->deleted = ast_calloc(arraysize, sizeof(int)))) {
return -1;
}
if (!(vms->heard = ast_calloc(arraysize, sizeof(int)))) {
+ ast_free(vms->deleted);
+ vms->deleted = NULL;
return -1;
}
- vms->dh_arraysize = arraysize;
- } else if (vms->dh_arraysize < arraysize) {
- if (!(vms->deleted = ast_realloc(vms->deleted, arraysize * sizeof(int)))) {
- return -1;
- }
- if (!(vms->heard = ast_realloc(vms->heard, arraysize * sizeof(int)))) {
- return -1;
- }
- memset(vms->deleted, 0, arraysize * sizeof(int));
- memset(vms->heard, 0, arraysize * sizeof(int));
vms->dh_arraysize = arraysize;
}
@@ -6567,9 +6570,15 @@
name = "Unknown Caller";
/* If deleted, show "undeleted" */
-
- if (vms->deleted[vms->curmsg])
- keys[1] = ADSI_KEY_SKT | (ADSI_KEY_APPS + 11);
+#ifdef IMAP_STORAGE
+ ast_mutex_lock(&vms->lock);
+#endif
+ if (vms->deleted[vms->curmsg]) {
+ keys[1] = ADSI_KEY_SKT | (ADSI_KEY_APPS + 11);
+ }
+#ifdef IMAP_STORAGE
+ ast_mutex_unlock(&vms->lock);
+#endif
/* Except "Exit" */
keys[5] = ADSI_KEY_SKT | (ADSI_KEY_APPS + 5);
@@ -6622,8 +6631,15 @@
}
/* If deleted, show "undeleted" */
- if (vms->deleted[vms->curmsg])
+#ifdef IMAP_STORAGE
+ ast_mutex_lock(&vms->lock);
+#endif
+ if (vms->deleted[vms->curmsg]) {
keys[1] = ADSI_KEY_SKT | (ADSI_KEY_APPS + 11);
+ }
+#ifdef IMAP_STORAGE
+ ast_mutex_unlock(&vms->lock);
+#endif
/* Except "Exit" */
keys[5] = ADSI_KEY_SKT | (ADSI_KEY_APPS + 5);
@@ -7805,8 +7821,12 @@
if (!res) {
make_file(vms->fn, sizeof(vms->fn), vms->curdir, vms->curmsg);
+#ifdef IMAP_STORAGE
+ ast_mutex_lock(&vms->lock);
+#endif
vms->heard[vms->curmsg] = 1;
#ifdef IMAP_STORAGE
+ ast_mutex_unlock(&vms->lock);
/*IMAP storage stores any prepended message from a forward
* as a separate file from the rest of the message
*/
@@ -8021,6 +8041,7 @@
}
ast_unlock_path(vms->curdir);
#else /* defined(IMAP_STORAGE) */
+ ast_mutex_lock(&vms->lock);
if (vms->deleted) {
/* Since we now expunge after each delete, deleting in reverse order
* ensures that no reordering occurs between each step. */
@@ -8035,12 +8056,18 @@
#endif
done:
- if (vms->deleted && last_msg_idx) {
+ if (vms->deleted) {
ast_free(vms->deleted);
- }
- if (vms->heard && last_msg_idx) {
+ vms->deleted = NULL;
+ }
+ if (vms->heard) {
ast_free(vms->heard);
- }
+ vms->heard = NULL;
+ }
+ vms->dh_arraysize = 0;
+#ifdef IMAP_STORAGE
+ ast_mutex_unlock(&vms->lock);
+#endif
return 0;
}
@@ -9135,14 +9162,25 @@
res = ast_play_and_wait(chan, "vm-next");
}
if (!res) {
- if (!vms->deleted[vms->curmsg])
+ int curmsg_deleted;
+#ifdef IMAP_STORAGE
+ ast_mutex_lock(&vms->lock);
+#endif
+ curmsg_deleted = vms->deleted[vms->curmsg];
+#ifdef IMAP_STORAGE
+ ast_mutex_unlock(&vms->lock);
+#endif
+ if (!curmsg_deleted) {
res = ast_play_and_wait(chan, "vm-delete");
- else
+ } else {
res = ast_play_and_wait(chan, "vm-undelete");
- if (!res)
+ }
+ if (!res) {
res = ast_play_and_wait(chan, "vm-toforward");
- if (!res)
+ }
+ if (!res) {
res = ast_play_and_wait(chan, "vm-savemessage");
+ }
}
}
if (!res) {
@@ -10179,6 +10217,7 @@
}
vms.starting = 1;
+ vms.curmsg = 0;
break;
case '3': /* Advanced options */
ast_test_suite_event_notify("ADVOPTIONS", "Message: entering advanced options menu");
Modified: team/oej/pinequeue-1.8/channels/chan_sip.c
URL: http://svnview.digium.com/svn/asterisk/team/oej/pinequeue-1.8/channels/chan_sip.c?view=diff&rev=369920&r1=369919&r2=369920
==============================================================================
--- team/oej/pinequeue-1.8/channels/chan_sip.c (original)
+++ team/oej/pinequeue-1.8/channels/chan_sip.c Wed Jul 11 07:05:12 2012
@@ -1232,7 +1232,7 @@
static int handle_request_do(struct sip_request *req, struct ast_sockaddr *addr);
static int sip_standard_port(enum sip_transport type, int port);
static int sip_prepare_socket(struct sip_pvt *p);
-static int get_address_family_filter(const struct ast_sockaddr *addr);
+static int get_address_family_filter(unsigned int transport);
/*--- Transmitting responses and requests */
static int sipsock_read(int *id, int fd, short events, void *ignore);
@@ -1415,6 +1415,8 @@
const char *name, int flag, int family);
static int ast_sockaddr_resolve_first(struct ast_sockaddr *addr,
const char *name, int flag);
+static int ast_sockaddr_resolve_first_transport(struct ast_sockaddr *addr,
+ const char *name, int flag, unsigned int transport);
/*--- Debugging
Functions for enabling debug per IP or fully, or enabling history logging for
@@ -1516,7 +1518,7 @@
static void build_callid_pvt(struct sip_pvt *pvt);
static void change_callid_pvt(struct sip_pvt *pvt, const char *callid);
static void build_callid_registry(struct sip_registry *reg, const struct ast_sockaddr *ourip, const char *fromdomain);
-static void make_our_tag(char *tagbuf, size_t len);
+static void make_our_tag(struct sip_pvt *pvt);
static int add_header(struct sip_request *req, const char *var, const char *value);
static int add_header_max_forwards(struct sip_pvt *dialog, struct sip_request *req);
static int add_content(struct sip_request *req, const char *line);
@@ -3095,7 +3097,7 @@
if (!ast_sockaddr_parse(&proxy->ip, proxy->name, 0)) {
/* Ok, not an IP address, then let's check if it's a domain or host */
/* XXX Todo - if we have proxy port, don't do SRV */
- proxy->ip.ss.ss_family = get_address_family_filter(&bindaddr); /* Filter address family */
+ proxy->ip.ss.ss_family = get_address_family_filter(SIP_TRANSPORT_UDP); /* Filter address family */
if (ast_get_ip_or_srv(&proxy->ip, proxy->name, sip_cfg.srvlookup ? "_sip._udp" : NULL) < 0) {
ast_log(LOG_WARNING, "Unable to locate host '%s'\n", proxy->name);
return FALSE;
@@ -3848,7 +3850,7 @@
ast_debug(3, "Re-scheduled destruction of SIP call %s\n", p->callid ? p->callid : "<unknown>");
append_history(p, "ReliableXmit", "timeout");
if (sscanf(p->lastmsg, "Tx: %30s", method_str) == 1 || sscanf(p->lastmsg, "Rx: %30s", method_str) == 1) {
- if (method_match(SIP_CANCEL, method_str) || method_match(SIP_BYE, method_str)) {
+ if (p->ongoing_reinvite || method_match(SIP_CANCEL, method_str) || method_match(SIP_BYE, method_str)) {
pvt_set_needdestroy(p, "autodestruct");
}
}
@@ -4810,7 +4812,7 @@
if (ast_sockaddr_resolve(&addrs,
tmp->value,
PARSE_PORT_FORBID,
- get_address_family_filter(&bindaddr)) <= 0 ||
+ get_address_family_filter(SIP_TRANSPORT_UDP)) <= 0 ||
ast_sockaddr_cmp(&addrs[0], addr)) {
/* No match */
ast_variables_destroy(*var);
@@ -5478,7 +5480,7 @@
}
}
- if (ast_sockaddr_resolve_first(&dialog->sa, hostn, 0)) {
+ if (ast_sockaddr_resolve_first_transport(&dialog->sa, hostn, 0, dialog->socket.type ? dialog->socket.type : SIP_TRANSPORT_UDP)) {
ast_log(LOG_WARNING, "No such host: %s\n", peername);
return -1;
}
@@ -6223,6 +6225,21 @@
return 0;
}
+static int reinvite_timeout(const void *data)
+{
+ struct sip_pvt *dialog = (struct sip_pvt *) data;
+ struct ast_channel *owner = sip_pvt_lock_full(dialog);
+ dialog->reinviteid = -1;
+ check_pendings(dialog);
+ if (owner) {
+ ast_channel_unlock(owner);
+ ast_channel_unref(owner);
+ }
+ ao2_unlock(dialog);
+ dialog_unref(dialog, "unref for reinvite timeout");
+ return 0;
+}
+
/*! \brief sip_hangup: Hangup SIP call
* Part of PBX interface, called from ast_hangup */
static int sip_hangup(struct ast_channel *ast)
@@ -6412,8 +6429,16 @@
ast_set_flag(&p->flags[0], SIP_PENDINGBYE);
ast_clear_flag(&p->flags[0], SIP_NEEDREINVITE);
AST_SCHED_DEL_UNREF(sched, p->waitid, dialog_unref(p, "when you delete the waitid sched, you should dec the refcount for the stored dialog ptr"));
- if (sip_cancel_destroy(p))
+ if (sip_cancel_destroy(p)) {
ast_log(LOG_WARNING, "Unable to cancel SIP destruction. Expect bad things.\n");
+ }
+ /* If we have an ongoing reinvite, there is a chance that we have gotten a provisional
+ * response, but something weird has happened and we will never receive a final response.
+ * So, just in case, check for pending actions after a bit of time to trigger the pending
+ * bye that we are setting above */
+ if (p->ongoing_reinvite && p->reinviteid < 0) {
+ p->reinviteid = ast_sched_add(sched, 32 * p->timer_t1, reinvite_timeout, dialog_ref(p, "ref for reinvite_timeout"));
+ }
}
}
}
@@ -6980,6 +7005,9 @@
}
break;
case AST_CONTROL_UPDATE_RTP_PEER: /* Absorb this since it is handled by the bridge */
+ break;
+ case AST_CONTROL_FLASH: /* We don't currently handle AST_CONTROL_FLASH here, but it is expected, so we don't need to warn either. */
+ res = -1;
break;
case -1:
res = -1;
@@ -7605,9 +7633,9 @@
}
/*! \brief Make our SIP dialog tag */
-static void make_our_tag(char *tagbuf, size_t len)
-{
- snprintf(tagbuf, len, "as%08lx", ast_random());
+static void make_our_tag(struct sip_pvt *pvt)
+{
+ ast_string_field_build(pvt, tag, "as%08lx", ast_random());
}
/*! \brief Allocate Session-Timers struct w/in dialog */
@@ -7686,6 +7714,7 @@
p->method = intended_method;
p->initid = -1;
p->waitid = -1;
+ p->reinviteid = -1;
p->autokillid = -1;
p->request_queue_sched_id = -1;
p->provisional_keepalive_sched_id = -1;
@@ -7718,7 +7747,7 @@
p->do_history = recordhistory;
p->branch = ast_random();
- make_our_tag(p->tag, sizeof(p->tag));
+ make_our_tag(p);
p->ocseq = INITIAL_CSEQ;
p->allowed_methods = UINT_MAX;
@@ -7804,7 +7833,7 @@
}
if (via->maddr) {
- if (ast_sockaddr_resolve_first(&p->sa, via->maddr, PARSE_PORT_FORBID)) {
+ if (ast_sockaddr_resolve_first_transport(&p->sa, via->maddr, PARSE_PORT_FORBID, p->socket.type)) {
ast_log(LOG_WARNING, "Can't find address for maddr '%s'\n", via->maddr);
ast_log(LOG_ERROR, "error processing via header\n");
free_via(via);
@@ -10092,7 +10121,7 @@
/*! \todo XXX If we have sip_cfg.srvlookup on, then look for NAPTR/SRV,
* otherwise, just look for A records */
- if (ast_sockaddr_resolve_first(&p->sa, hostname, 0)) {
+ if (ast_sockaddr_resolve_first_transport(&p->sa, hostname, 0, p->socket.type)) {
ast_log(LOG_WARNING, "Can't find address for host '%s'\n", hostname);
return;
}
@@ -10113,7 +10142,7 @@
/*! \todo XXX If we have sip_cfg.srvlookup on, then look for
* NAPTR/SRV, otherwise, just look for A records */
- if (ast_sockaddr_resolve_first(&p->sa, hostname, PARSE_PORT_FORBID)) {
+ if (ast_sockaddr_resolve_first_transport(&p->sa, hostname, PARSE_PORT_FORBID, p->socket.type)) {
ast_log(LOG_WARNING, "Can't find address for host '%s'\n", hostname);
return;
}
@@ -10584,7 +10613,7 @@
}
p->branch = ast_random();
- make_our_tag(p->tag, sizeof(p->tag));
+ make_our_tag(p);
p->ocseq = INITIAL_CSEQ;
if (useglobal_nat && addr) {
@@ -11889,7 +11918,7 @@
initialize_initreq(p, &req);
p->lastinvite = p->ocseq;
ast_set_flag(&p->flags[0], SIP_OUTGOING); /* Change direction of this dialog */
-
+ p->ongoing_reinvite = 1;
return send_request(p, &req, XMIT_CRITICAL, p->ocseq);
}
@@ -12451,7 +12480,7 @@
struct sip_subscription_mwi *saved;
snprintf(transport, sizeof(transport), "_%s._%s", get_srv_service(mwi->transport), get_srv_protocol(mwi->transport));
- mwi->us.ss.ss_family = get_address_family_filter(&bindaddr); /* Filter address family */
+ mwi->us.ss.ss_family = get_address_family_filter(mwi->transport); /* Filter address family */
saved = ASTOBJ_REF(mwi);
ast_dnsmgr_lookup_cb(mwi->hostname, &mwi->us, &mwi->dnsmgr, sip_cfg.srvlookup ? transport : NULL, on_dns_update_mwi, saved);
if (!mwi->dnsmgr) {
@@ -13242,7 +13271,7 @@
char transport[MAXHOSTNAMELEN];
peer = find_peer(r->hostname, NULL, TRUE, FINDPEERS, FALSE, 0);
snprintf(transport, sizeof(transport), "_%s._%s",get_srv_service(r->transport), get_srv_protocol(r->transport)); /* have to use static get_transport function */
- r->us.ss.ss_family = get_address_family_filter(&bindaddr); /* Filter address family */
+ r->us.ss.ss_family = get_address_family_filter(r->transport); /* Filter address family */
/* No point in doing a DNS lookup of the register hostname if we're just going to
* end up using an outbound proxy. obproxy_get is safe to call with either of r->call
@@ -13267,7 +13296,7 @@
return 0;
} else {
p = dialog_ref(r->call, "getting a copy of the r->call dialog in transmit_register");
- make_our_tag(p->tag, sizeof(p->tag)); /* create a new local tag for every register attempt */
+ make_our_tag(p); /* create a new local tag for every register attempt */
ast_string_field_set(p, theirtag, NULL); /* forget their old tag, so we don't match tags when getting response */
}
} else {
@@ -13958,7 +13987,7 @@
return -1;
}
- if (ast_sockaddr_resolve_first(addr, hostport, 0)) {
+ if (ast_sockaddr_resolve_first_transport(addr, hostport, 0, get_transport_str2enum(transport))) {
ast_log(LOG_WARNING, "Invalid host name in Contact: (can't "
"resolve in DNS) : '%s'\n", hostport);
return -1;
@@ -14103,7 +14132,7 @@
ast_debug(1, "Store REGISTER's Contact header for call routing.\n");
/* XXX This could block for a long time XXX */
/*! \todo Check NAPTR/SRV if we have not got a port in the URI */
- if (ast_sockaddr_resolve_first(&testsa, hostport, 0)) {
+ if (ast_sockaddr_resolve_first_transport(&testsa, hostport, 0, peer->socket.type)) {
ast_log(LOG_WARNING, "Invalid hostport '%s'\n", hostport);
ast_string_field_set(peer, fullcontact, "");
ast_string_field_set(pvt, our_contact, "");
@@ -18988,7 +19017,7 @@
/*! \brief Enable SIP Debugging for a single IP */
static char *sip_do_debug_ip(int fd, const char *arg)
{
- if (ast_sockaddr_resolve_first(&debugaddr, arg, 0)) {
+ if (ast_sockaddr_resolve_first_af(&debugaddr, arg, 0, 0)) {
return CLI_SHOWUSAGE;
}
@@ -19838,8 +19867,11 @@
static void check_pendings(struct sip_pvt *p)
{
if (ast_test_flag(&p->flags[0], SIP_PENDINGBYE)) {
- /* if we can't BYE, then this is really a pending CANCEL */
- if (p->invitestate == INV_PROCEEDING || p->invitestate == INV_EARLY_MEDIA) {
+ if (p->reinviteid > -1) {
+ /* Outstanding p->reinviteid timeout, so wait... */
+ return;
+ } else if (p->invitestate == INV_PROCEEDING || p->invitestate == INV_EARLY_MEDIA) {
+ /* if we can't BYE, then this is really a pending CANCEL */
p->invitestate = INV_CANCELLED;
transmit_request(p, SIP_CANCEL, p->lastinvite, XMIT_RELIABLE, FALSE);
/* If the cancel occurred on an initial invite, cancel the pending BYE */
@@ -19850,8 +19882,9 @@
INVITE, but do set an autodestruct just in case we never get it. */
} else {
/* We have a pending outbound invite, don't send something
- new in-transaction */
- if (p->pendinginvite)
+ * new in-transaction, unless it is a pending reinvite, then
+ * by the time we are called here, we should probably just hang up. */
+ if (p->pendinginvite && !p->ongoing_reinvite)
return;
if (p->owner) {
@@ -20091,9 +20124,17 @@
if (resp >= 300 && (p->invitestate == INV_CALLING || p->invitestate == INV_PROCEEDING || p->invitestate == INV_EARLY_MEDIA ))
p->invitestate = INV_COMPLETED;
+ if ((resp >= 200 && reinvite)) {
+ p->ongoing_reinvite = 0;
+ if (p->reinviteid > -1) {
+ AST_SCHED_DEL_UNREF(sched, p->reinviteid, dialog_unref(p, "unref dialog for reinvite timeout because of a final response"));
+ }
+ }
+
/* Final response, clear out pending invite */
- if ((resp == 200 || resp >= 300) && p->pendinginvite && seqno == p->pendinginvite)
+ if ((resp == 200 || resp >= 300) && p->pendinginvite && seqno == p->pendinginvite) {
p->pendinginvite = 0;
+ }
/* If this is a response to our initial INVITE, we need to set what we can use
* for this peer.
@@ -22777,8 +22818,6 @@
*/
/* Fall through */
case SIP_GET_DEST_EXTEN_NOT_FOUND:
- case SIP_GET_DEST_REFUSED:
- default:
{
char *decoded_exten = ast_strdupa(p->exten);
transmit_response_reliable(p, "404 Not Found", req);
@@ -22787,6 +22826,10 @@
" '%s' rejected because extension not found in context '%s'.\n",
S_OR(p->username, p->peername), ast_sockaddr_stringify(&p->recv), decoded_exten, p->context);
}
+ break;
+ case SIP_GET_DEST_REFUSED:
+ default:
+ transmit_response_reliable(p, "403 Forbidden", req);
} /* end switch */
p->invitestate = INV_COMPLETED;
@@ -22802,7 +22845,7 @@
ast_string_field_set(p, exten, "s");
/* Initialize our tag */
- make_our_tag(p->tag, sizeof(p->tag));
+ make_our_tag(p);
/* First invitation - create the channel. Allocation
* failures are handled below. */
c = sip_new(p, AST_STATE_DOWN, S_OR(p->peername, NULL), NULL);
@@ -24774,7 +24817,7 @@
/* Initialize tag for new subscriptions */
if (ast_strlen_zero(p->tag))
- make_our_tag(p->tag, sizeof(p->tag));
+ make_our_tag(p);
if (!strncmp(eventheader, "presence", MAX(event_len, 8)) || !strncmp(eventheader, "dialog", MAX(event_len, 6))) { /* Presence, RFC 3842 */
unsigned int pidf_xml;
@@ -25266,14 +25309,15 @@
if (!p->initreq.headers && req->has_to_tag) {
/* If this is a first request and it got a to-tag, it is not for us */
if (!req->ignore && req->method == SIP_INVITE) {
- /* We will be subversive here. By blanking out the to-tag of the request,
- * it will cause us to attach our own generated to-tag instead. This way,
- * when we receive an ACK, the ACK will contain the to-tag we generated,
- * resulting in a proper to-tag match.
+ /* Just because we think this is a dialog-starting INVITE with a to-tag
+ * doesn't mean it actually is. It could be a reinvite for an established, but
+ * unknown dialog. In such a case, we need to change our tag to the
+ * incoming INVITE's to-tag so that they will recognize the 481 we send and
+ * so that we will properly match their incoming ACK.
*/
- char *to_header = (char *) get_header(req, "To");
- char *tag = strstr(to_header, ";tag=");
- *tag = '\0';
+ char totag[128];
+ gettag(req, "To", totag, sizeof(totag));
+ ast_string_field_set(p, tag, totag);
p->pendinginvite = p->icseq;
transmit_response_reliable(p, "481 Call/Transaction Does Not Exist", req);
/* Will cease to exist after ACK */
@@ -25551,8 +25595,20 @@
*
* \note return 0 if addr is [::] else it returns addr's family.
*/
-int get_address_family_filter(const struct ast_sockaddr *addr)
-{
+int get_address_family_filter(unsigned int transport)
+{
+ const struct ast_sockaddr *addr = NULL;
+
+ if ((transport == SIP_TRANSPORT_UDP) || !transport) {
+ addr = &bindaddr;
+ }
+ else if (transport == SIP_TRANSPORT_TCP) {
+ addr = &sip_tcp_desc.local_address;
+ }
+ else if (transport == SIP_TRANSPORT_TLS) {
+ addr = &sip_tls_desc.local_address;
+ }
+
if (ast_sockaddr_is_ipv6(addr) && ast_sockaddr_is_any(addr)) {
return 0;
}
@@ -26687,7 +26743,7 @@
}
if (!ast_strlen_zero(remote_address)) {
- if (ast_sockaddr_resolve_first(&remote_address_sa, remote_address, 0)) {
+ if (ast_sockaddr_resolve_first_transport(&remote_address_sa, remote_address, 0, transport)) {
ast_log(LOG_WARNING, "Unable to find IP address for host %s. We will not use this remote IP address\n", remote_address);
} else {
if (!ast_sockaddr_port(&remote_address_sa)) {
@@ -27909,7 +27965,7 @@
snprintf(transport, sizeof(transport), "_%s._%s", get_srv_service(peer->socket.type), get_srv_protocol(peer->socket.type));
- peer->addr.ss.ss_family = get_address_family_filter(&bindaddr); /* Filter address family */
+ peer->addr.ss.ss_family = get_address_family_filter(peer->socket.type); /* Filter address family */
if (ast_dnsmgr_lookup_cb(_srvlookup, &peer->addr, &peer->dnsmgr, sip_cfg.srvlookup && !peer->portinuri ? transport : NULL,
on_dns_update_peer, ref_peer(peer, "Store peer on dnsmgr"))) {
ast_log(LOG_ERROR, "srvlookup failed for host: %s, on peer %s, removing peer\n", _srvlookup, peer->name);
@@ -29948,7 +30004,17 @@
static int ast_sockaddr_resolve_first(struct ast_sockaddr *addr,
const char* name, int flag)
{
- return ast_sockaddr_resolve_first_af(addr, name, flag, get_address_family_filter(&bindaddr));
+ return ast_sockaddr_resolve_first_af(addr, name, flag, get_address_family_filter(SIP_TRANSPORT_UDP));
+}
+
+/*! \brief Return the first entry from ast_sockaddr_resolve filtered by family of binddaddr
+ *
+ * \warn Using this function probably means you have a faulty design.
+ */
+static int ast_sockaddr_resolve_first_transport(struct ast_sockaddr *addr,
+ const char* name, int flag, unsigned int transport)
+{
+ return ast_sockaddr_resolve_first_af(addr, name, flag, get_address_family_filter(transport));
}
/*! \brief
Modified: team/oej/pinequeue-1.8/channels/sip/include/sip.h
URL: http://svnview.digium.com/svn/asterisk/team/oej/pinequeue-1.8/channels/sip/include/sip.h?view=diff&rev=369920&r1=369919&r2=369920
==============================================================================
--- team/oej/pinequeue-1.8/channels/sip/include/sip.h (original)
+++ team/oej/pinequeue-1.8/channels/sip/include/sip.h Wed Jul 11 07:05:12 2012
@@ -959,6 +959,7 @@
AST_STRING_FIELD(rdnis); /*!< Referring DNIS */
AST_STRING_FIELD(redircause); /*!< Referring cause */
AST_STRING_FIELD(theirtag); /*!< Their tag */
+ AST_STRING_FIELD(tag); /*!< Our tag for this session */
AST_STRING_FIELD(username); /*!< [user] name */
AST_STRING_FIELD(peername); /*!< [peer] name, not set if [user] */
AST_STRING_FIELD(authname); /*!< Who we use for authentication */
@@ -1006,7 +1007,6 @@
* for incoming calls
*/
unsigned short req_secure_signaling:1;/*!< Whether we are required to have secure signaling or not */
- char tag[11]; /*!< Our tag for this session */
int timer_t1; /*!< SIP timer T1, ms rtt */
int timer_b; /*!< SIP timer B, ms */
unsigned int sipoptions; /*!< Supported SIP options on the other end */
@@ -1056,6 +1056,7 @@
struct sip_auth_container *peerauth;/*!< Realm authentication credentials */
int noncecount; /*!< Nonce-count */
unsigned int stalenonce:1; /*!< Marks the current nonce as responded too */
+ unsigned int ongoing_reinvite:1; /*!< There is a reinvite in progress that might need to be cleaned up */
char lastmsg[256]; /*!< Last Message sent/received */
int amaflags; /*!< AMA Flags */
uint32_t pendinginvite; /*!< Any pending INVITE or state NOTIFY (in subscribe pvt's) ? (seqno of this) */
@@ -1068,6 +1069,7 @@
int initid; /*!< Auto-congest ID if appropriate (scheduler) */
int waitid; /*!< Wait ID for scheduler after 491 or other delays */
+ int reinviteid; /*!< Reinvite in case of provisional, but no final response */
int autokillid; /*!< Auto-kill ID (scheduler) */
int t38id; /*!< T.38 Response ID */
struct sip_refer *refer; /*!< REFER: SIP transfer data structure */
Modified: team/oej/pinequeue-1.8/configs/sip_notify.conf.sample
URL: http://svnview.digium.com/svn/asterisk/team/oej/pinequeue-1.8/configs/sip_notify.conf.sample?view=diff&rev=369920&r1=369919&r2=369920
==============================================================================
--- team/oej/pinequeue-1.8/configs/sip_notify.conf.sample (original)
+++ team/oej/pinequeue-1.8/configs/sip_notify.conf.sample Wed Jul 11 07:05:12 2012
@@ -16,6 +16,11 @@
[aastra-xml]
Event=>aastra-xml
+
+; Digium
+
+[digium-check-cfg]
+Event=>check-sync
; Linksys
Modified: team/oej/pinequeue-1.8/include/asterisk/adsi.h
URL: http://svnview.digium.com/svn/asterisk/team/oej/pinequeue-1.8/include/asterisk/adsi.h?view=diff&rev=369920&r1=369919&r2=369920
==============================================================================
--- team/oej/pinequeue-1.8/include/asterisk/adsi.h (original)
+++ team/oej/pinequeue-1.8/include/asterisk/adsi.h Wed Jul 11 07:05:12 2012
@@ -24,7 +24,6 @@
#define _ASTERISK_ADSI_H
#include "asterisk/callerid.h"
-#include "asterisk/optional_api.h"
/*! \name ADSI parameters */
/*@{ */
@@ -121,11 +120,13 @@
#define ADSI_DIR_FROM_LEFT (0)
#define ADSI_DIR_FROM_RIGHT (1)
+#define AST_ADSI_VERSION 1
+
/*@} */
-AST_OPTIONAL_API(int, ast_adsi_begin_download, (struct ast_channel *chan, char *service, unsigned char *fdn, unsigned char *sec, int version), { return 0; });
-
-AST_OPTIONAL_API(int, ast_adsi_end_download, (struct ast_channel *chan), { return 0; });
+int ast_adsi_begin_download(struct ast_channel *chan, char *service, unsigned char *fdn, unsigned char *sec, int version);
+
+int ast_adsi_end_download(struct ast_channel *chan);
/*! Restore ADSI initialization (for applications that play with ADSI
* and want to restore it to normal. If you touch "INFO" then you
@@ -135,7 +136,7 @@
* \retval 0 on success (or adsi unavailable)
* \retval -1 on hangup
*/
-AST_OPTIONAL_API(int, ast_adsi_channel_restore, (struct ast_channel *chan), { return 0; });
+int ast_adsi_channel_restore(struct ast_channel *chan);
/*!
* \brief Display some stuff on the screen
@@ -147,7 +148,7 @@
* \retval 0 on success (or adsi unavailable)
* \retval -1 on hangup
*/
-AST_OPTIONAL_API(int, ast_adsi_print, (struct ast_channel *chan, char **lines, int *align, int voice), { return 0; });
+int ast_adsi_print(struct ast_channel *chan, char **lines, int *align, int voice);
/*!
* \brief Check if scripts for a given app are already loaded.
@@ -161,16 +162,16 @@
* \retval -1 on hangup
* \retval 1 if script already loaded.
*/
-AST_OPTIONAL_API(int, ast_adsi_load_session, (struct ast_channel *chan, unsigned char *app, int ver, int data), { return 0; });
-AST_OPTIONAL_API(int, ast_adsi_unload_session, (struct ast_channel *chan), { return 0; });
+int ast_adsi_load_session(struct ast_channel *chan, unsigned char *app, int ver, int data);
+int ast_adsi_unload_session(struct ast_channel *chan);
/* ADSI Layer 2 transmission functions */
-AST_OPTIONAL_API(int, ast_adsi_transmit_message, (struct ast_channel *chan, unsigned char *msg, int msglen, int msgtype), { return 0; });
-AST_OPTIONAL_API(int, ast_adsi_transmit_message_full, (struct ast_channel *chan, unsigned char *msg, int msglen, int msgtype, int dowait), { return 0; });
+int ast_adsi_transmit_message(struct ast_channel *chan, unsigned char *msg, int msglen, int msgtype);
+int ast_adsi_transmit_message_full(struct ast_channel *chan, unsigned char *msg, int msglen, int msgtype, int dowait);
/*! Read some encoded DTMF data.
* Returns number of bytes received
*/
-AST_OPTIONAL_API(int, ast_adsi_read_encoded_dtmf, (struct ast_channel *chan, unsigned char *buf, int maxlen), { return 0; });
+int ast_adsi_read_encoded_dtmf(struct ast_channel *chan, unsigned char *buf, int maxlen);
/* ADSI Layer 3 creation functions */
@@ -184,22 +185,22 @@
* \retval -1 on error.
*/
-AST_OPTIONAL_API(int, ast_adsi_connect_session, (unsigned char *buf, unsigned char *fdn, int ver), { return 0; });
+int ast_adsi_connect_session(unsigned char *buf, unsigned char *fdn, int ver);
/*! Build Query CPE ID of equipment.
* Returns number of bytes added to message
*/
-AST_OPTIONAL_API(int, ast_adsi_query_cpeid, (unsigned char *buf), { return 0; });
-AST_OPTIONAL_API(int, ast_adsi_query_cpeinfo, (unsigned char *buf), { return 0; });
+int ast_adsi_query_cpeid(unsigned char *buf);
+int ast_adsi_query_cpeinfo(unsigned char *buf);
/*! Get CPE ID from an attached ADSI compatible CPE.
* Returns 1 on success, storing 4 bytes of CPE ID at buf
* or -1 on hangup, or 0 if there was no hangup but it failed to find the
* device ID. Returns to voice mode if "voice" is non-zero.
*/
-AST_OPTIONAL_API(int, ast_adsi_get_cpeid, (struct ast_channel *chan, unsigned char *cpeid, int voice), { return 0; });
-
-AST_OPTIONAL_API(int, ast_adsi_get_cpeinfo, (struct ast_channel *chan, int *width, int *height, int *buttons, int voice), { return 0; });
+int ast_adsi_get_cpeid(struct ast_channel *chan, unsigned char *cpeid, int voice);
+
+int ast_adsi_get_cpeinfo(struct ast_channel *chan, int *width, int *height, int *buttons, int voice);
/*!
* \brief Begin an ADSI script download
@@ -213,7 +214,7 @@
* \retval -1 on error.
*/
-AST_OPTIONAL_API(int, ast_adsi_download_connect, (unsigned char *buf, char *service, unsigned char *fdn, unsigned char *sec, int ver), { return 0; });
+int ast_adsi_download_connect(unsigned char *buf, char *service, unsigned char *fdn, unsigned char *sec, int ver);
/*!
* \brief Disconnects a running session.
@@ -222,7 +223,7 @@
* \retval number of bytes added to buffer
* \retval -1 on error.
*/
-AST_OPTIONAL_API(int, ast_adsi_disconnect_session, (unsigned char *buf), { return 0; });
+int ast_adsi_disconnect_session(unsigned char *buf);
/*!
* \brief Disconnects (and hopefully saves) a downloaded script
@@ -231,7 +232,7 @@
* \retval number of bytes added to buffer
* \retval -1 on error.
*/
-AST_OPTIONAL_API(int, ast_adsi_download_disconnect, (unsigned char *buf), { return 0; });
+int ast_adsi_download_disconnect(unsigned char *buf);
/*!
* \brief Puts CPE in data mode.
@@ -240,9 +241,9 @@
* \retval number of bytes added to buffer
* \retval -1 on error.
*/
-AST_OPTIONAL_API(int, ast_adsi_data_mode, (unsigned char *buf), { return 0; });
-AST_OPTIONAL_API(int, ast_adsi_clear_soft_keys, (unsigned char *buf), { return 0; });
-AST_OPTIONAL_API(int, ast_adsi_clear_screen, (unsigned char *buf), { return 0; });
+int ast_adsi_data_mode(unsigned char *buf);
+int ast_adsi_clear_soft_keys(unsigned char *buf);
+int ast_adsi_clear_screen(unsigned char *buf);
/*!
* \brief Puts CPE in voice mode.
@@ -252,13 +253,13 @@
* \retval number of bytes added to buffer
* \retval -1 on error.
*/
-AST_OPTIONAL_API(int, ast_adsi_voice_mode, (unsigned char *buf, int when), { return 0; });
+int ast_adsi_voice_mode(unsigned char *buf, int when);
/*!
* \brief Returns non-zero if Channel does or might support ADSI
* \param chan Channel to check
*/
-AST_OPTIONAL_API(int, ast_adsi_available, (struct ast_channel *chan), { return 0; });
+int ast_adsi_available(struct ast_channel *chan);
/*!
* \brief Loads a line of info into the display.
@@ -274,7 +275,7 @@
* \retval -1 on error.
*/
-AST_OPTIONAL_API(int, ast_adsi_display, (unsigned char *buf, int page, int line, int just, int wrap, char *col1, char *col2), { return 0; });
+int ast_adsi_display(unsigned char *buf, int page, int line, int just, int wrap, char *col1, char *col2);
/*!
* \brief Sets the current line and page.
@@ -286,7 +287,7 @@
* \retval -1 on error.
*/
-AST_OPTIONAL_API(int, ast_adsi_set_line, (unsigned char *buf, int page, int line), { return 0; });
+int ast_adsi_set_line(unsigned char *buf, int page, int line);
/*!
* \brief Creates "load soft key" parameters
@@ -300,7 +301,7 @@
* \retval number of bytes added to buffer
* \retval -1 on error.
*/
-AST_OPTIONAL_API(int, ast_adsi_load_soft_key, (unsigned char *buf, int key, const char *llabel, const char *slabel, char *ret, int data), { return 0; });
+int ast_adsi_load_soft_key(unsigned char *buf, int key, const char *llabel, const char *slabel, char *ret, int data);
/*!
* \brief Set which soft keys should be displayed
@@ -311,7 +312,7 @@
* \retval number of bytes added to buffer
* \retval -1 on error.
*/
-AST_OPTIONAL_API(int, ast_adsi_set_keys, (unsigned char *buf, unsigned char *keys), { return 0; });
+int ast_adsi_set_keys(unsigned char *buf, unsigned char *keys);
/*!
* \brief Set input information
@@ -325,7 +326,7 @@
* \retval number of bytes added to buffer
* \retval -1 on error.
*/
-AST_OPTIONAL_API(int, ast_adsi_input_control, (unsigned char *buf, int page, int line, int display, int format, int just), { return 0; });
+int ast_adsi_input_control(unsigned char *buf, int page, int line, int display, int format, int just);
[... 1161 lines stripped ...]
More information about the asterisk-commits
mailing list