[asterisk-commits] russell: branch russell/sched_thread r148822 - in /team/russell/sched_thread:...
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Tue Oct 14 08:54:37 CDT 2008
Author: russell
Date: Tue Oct 14 08:54:36 2008
New Revision: 148822
URL: http://svn.digium.com/view/asterisk?view=rev&rev=148822
Log:
resolve, reset
Modified:
team/russell/sched_thread/ (props changed)
team/russell/sched_thread/Makefile
team/russell/sched_thread/apps/app_voicemail.c
team/russell/sched_thread/channels/chan_sip.c
team/russell/sched_thread/include/asterisk/config.h
team/russell/sched_thread/include/asterisk/strings.h
team/russell/sched_thread/main/config.c
team/russell/sched_thread/main/pbx.c
team/russell/sched_thread/main/tcptls.c
team/russell/sched_thread/main/translate.c
team/russell/sched_thread/res/res_config_curl.c
team/russell/sched_thread/res/res_config_ldap.c
team/russell/sched_thread/res/res_config_odbc.c
team/russell/sched_thread/res/res_config_pgsql.c
team/russell/sched_thread/res/res_config_sqlite.c
team/russell/sched_thread/res/res_realtime.c
Propchange: team/russell/sched_thread/
------------------------------------------------------------------------------
automerge = *
Propchange: team/russell/sched_thread/
------------------------------------------------------------------------------
Binary property 'branch-1.4-merged' - no diff available.
Propchange: team/russell/sched_thread/
------------------------------------------------------------------------------
--- svnmerge-integrated (original)
+++ svnmerge-integrated Tue Oct 14 08:54:36 2008
@@ -1,1 +1,1 @@
-/trunk:1-148455
+/trunk:1-148821
Modified: team/russell/sched_thread/Makefile
URL: http://svn.digium.com/view/asterisk/team/russell/sched_thread/Makefile?view=diff&rev=148822&r1=148821&r2=148822
==============================================================================
--- team/russell/sched_thread/Makefile (original)
+++ team/russell/sched_thread/Makefile Tue Oct 14 08:54:36 2008
@@ -300,7 +300,7 @@
SOLINK=-dynamic -bundle -undefined suppress -force_flat_namespace
else
# These are used for all but Darwin
- SOLINK=-shared -Xlinker -x
+ SOLINK=-shared
ifneq ($(findstring BSD,$(OSARCH)),)
LDFLAGS+=-L/usr/local/lib
endif
Modified: team/russell/sched_thread/apps/app_voicemail.c
URL: http://svn.digium.com/view/asterisk/team/russell/sched_thread/apps/app_voicemail.c?view=diff&rev=148822&r1=148821&r2=148822
==============================================================================
--- team/russell/sched_thread/apps/app_voicemail.c (original)
+++ team/russell/sched_thread/apps/app_voicemail.c Tue Oct 14 08:54:36 2008
@@ -943,7 +943,7 @@
if (strlen(password) > 10) {
ast_realtime_require_field("voicemail", "password", RQ_CHAR, strlen(password), SENTINEL);
}
- res = ast_update_realtime("voicemail", "uniqueid", vmu->uniqueid, "password", password, SENTINEL);
+ res = ast_update2_realtime("voicemail", "context", vmu->context, "mailbox", vmu->mailbox, SENTINEL, "password", password, SENTINEL);
if (res > 0) {
ast_copy_string(vmu->password, password, sizeof(vmu->password));
res = 0;
@@ -4638,8 +4638,6 @@
int ausemacro = 0;
int ousemacro = 0;
int ouseexten = 0;
- int rtmsgid = 0;
- char tmpid[16];
char tmpdur[16];
char priority[16];
char origtime[16];
@@ -4932,7 +4930,7 @@
snprintf(priority, sizeof(priority), "%d", chan->priority);
snprintf(origtime, sizeof(origtime), "%ld", (long)time(NULL));
get_date(date, sizeof(date));
- rtmsgid = ast_store_realtime("voicemail_data", "origmailbox", ext, "context", chan->context, "macrocontext", chan->macrocontext, "exten", chan->exten, "priority", priority, "callerchan", chan->name, "callerid", ast_callerid_merge(callerid, sizeof(callerid), chan->cid.cid_name, chan->cid.cid_num, "Unknown"), "origdate", date, "origtime", origtime, "category", S_OR(category,""), SENTINEL);
+ ast_store_realtime("voicemail_data", "origmailbox", ext, "context", chan->context, "macrocontext", chan->macrocontext, "exten", chan->exten, "priority", priority, "callerchan", chan->name, "callerid", ast_callerid_merge(callerid, sizeof(callerid), chan->cid.cid_name, chan->cid.cid_num, "Unknown"), "origdate", date, "origtime", origtime, "category", S_OR(category,""), "filename", tmptxtfile, SENTINEL);
}
/* Store information */
@@ -4976,8 +4974,7 @@
ast_filedelete(tmptxtfile, NULL);
unlink(tmptxtfile);
if (ast_check_realtime("voicemail_data")) {
- snprintf(tmpid, sizeof(tmpid), "%d", rtmsgid);
- ast_destroy_realtime("voicemail_data", "id", tmpid, SENTINEL);
+ ast_destroy_realtime("voicemail_data", "filename", tmptxtfile, SENTINEL);
}
} else {
fprintf(txt, "duration=%d\n", duration);
@@ -4992,8 +4989,7 @@
unlink(tmptxtfile);
ast_unlock_path(dir);
if (ast_check_realtime("voicemail_data")) {
- snprintf(tmpid, sizeof(tmpid), "%d", rtmsgid);
- ast_destroy_realtime("voicemail_data", "id", tmpid, SENTINEL);
+ ast_destroy_realtime("voicemail_data", "filename", tmptxtfile, SENTINEL);
}
} else {
#ifndef IMAP_STORAGE
@@ -5019,9 +5015,8 @@
ast_unlock_path(dir);
if (ast_check_realtime("voicemail_data")) {
- snprintf(tmpid, sizeof(tmpid), "%d", rtmsgid);
snprintf(tmpdur, sizeof(tmpdur), "%d", duration);
- ast_update_realtime("voicemail_data", "id", tmpid, "filename", fn, "duration", tmpdur, SENTINEL);
+ ast_update_realtime("voicemail_data", "filename", tmptxtfile, "filename", fn, "duration", tmpdur, SENTINEL);
}
/* We must store the file first, before copying the message, because
* ODBC storage does the entire copy with SQL.
Modified: team/russell/sched_thread/channels/chan_sip.c
URL: http://svn.digium.com/view/asterisk/team/russell/sched_thread/channels/chan_sip.c?view=diff&rev=148822&r1=148821&r2=148822
==============================================================================
--- team/russell/sched_thread/channels/chan_sip.c (original)
+++ team/russell/sched_thread/channels/chan_sip.c Tue Oct 14 08:54:36 2008
@@ -1,4 +1,4 @@
- /*
+/*
* Asterisk -- An open source telephony toolkit.
*
* Copyright (C) 1999 - 2006, Digium, Inc.
@@ -62,7 +62,8 @@
*
* \par incoming packets
* Incoming packets are received in the monitoring thread, then handled by
- * sipsock_read(). This function parses the packet and matches an existing
+ * sipsock_read() for udp only. In tcp, packets are read by the tcp_helper thread.
+ * sipsock_read() function parses the packet and matches an existing
* dialog or starts a new SIP dialog.
*
* sipsock_read sends the packet to handle_incoming(), that parses a bit more.
@@ -730,6 +731,8 @@
static char default_parkinglot[AST_MAX_CONTEXT]; /*!< Parkinglot */
static int default_maxcallbitrate; /*!< Maximum bitrate for call */
static struct ast_codec_pref default_prefs; /*!< Default codec prefs */
+static unsigned int default_transports; /*!< Default Transports (enum sip_transport) that are acceptable */
+static unsigned int default_primary_transport; /*!< Default primary Transport (enum sip_transport) for outbound connections to devices */
/*! \brief a place to store all global settings for the sip channel driver */
struct sip_settings {
@@ -1492,7 +1495,7 @@
struct sip_peer {
char name[80]; /*!< peer->name is the unique name of this object */
struct sip_socket socket; /*!< Socket used for this peer */
- unsigned int transports:3; /*!< Transports (enum sip_transport) that are acceptable for this peer */
+ unsigned int transports:3; /*!< Transports (enum sip_transport) that are acceptable for this peer */
char secret[80]; /*!< Password */
char md5secret[80]; /*!< Password in MD5 */
struct sip_auth *auth; /*!< Realm authentication list */
@@ -2008,7 +2011,7 @@
else if (!(peer->transports & tmpl->socket.type)) {\
ast_log(LOG_ERROR, \
"'%s' is not a valid transport for '%s'. we only use '%s'! ending call.\n", \
- get_transport(tmpl->socket.type), peer->name, get_transport_list(peer) \
+ get_transport(tmpl->socket.type), peer->name, get_transport_list(peer->transports) \
); \
ret = 1; \
} else if (peer->socket.type & SIP_TRANSPORT_TLS) { \
@@ -2308,7 +2311,7 @@
.master = AST_PTHREADT_NULL,
.tls_cfg = NULL,
.poll_timeout = -1,
- .name = "sip tcp server",
+ .name = "SIP TCP server",
.accept_fn = ast_tcptls_server_root,
.worker_fn = sip_tcp_worker_fn,
};
@@ -2319,7 +2322,7 @@
.master = AST_PTHREADT_NULL,
.tls_cfg = &sip_tls_cfg,
.poll_timeout = -1,
- .name = "sip tls server",
+ .name = "SIP TLS server",
.accept_fn = ast_tcptls_server_root,
.worker_fn = sip_tcp_worker_fn,
};
@@ -2373,7 +2376,9 @@
return _sip_tcp_helper_thread(NULL, ser);
}
-/*! \brief SIP TCP thread management function */
+/*! \brief SIP TCP thread management function
+ This function reads from the socket, parses the packet into a request
+*/
static void *_sip_tcp_helper_thread(struct sip_pvt *pvt, struct ast_tcptls_session_instance *ser)
{
int res, cl;
@@ -2393,6 +2398,8 @@
else
me->type = SIP_TRANSPORT_TCP;
+ ast_debug(2, "Starting thread for %s server\n", ser->ssl ? "SSL" : "TCP");
+
AST_LIST_LOCK(&threadl);
AST_LIST_INSERT_TAIL(&threadl, me, list);
AST_LIST_UNLOCK(&threadl);
@@ -2403,11 +2410,17 @@
goto cleanup;
for (;;) {
+ struct ast_str *str_save;
+
+ str_save = req.data;
+ memset(&req, 0, sizeof(req));
+ req.data = str_save;
ast_str_reset(req.data);
+
+ str_save = reqcpy.data;
+ memset(&reqcpy, 0, sizeof(reqcpy));
+ reqcpy.data = str_save;
ast_str_reset(reqcpy.data);
- req.len = 0;
- req.ignore = 0;
- req.debug = 0;
req.socket.fd = ser->fd;
if (ser->ssl) {
@@ -2419,7 +2432,7 @@
}
res = ast_wait_for_input(ser->fd, -1);
if (res < 0) {
- ast_debug(1, "ast_wait_for_input returned %d\n", res);
+ ast_debug(2, "SIP %s server :: ast_wait_for_input returned %d\n", ser->ssl ? "SSL": "TCP", res);
goto cleanup;
}
@@ -2438,6 +2451,7 @@
}
copy_request(&reqcpy, &req);
parse_request(&reqcpy);
+ /* In order to know how much to read, we need the content-length header */
if (sscanf(get_header(&reqcpy, "Content-Length"), "%d", &cl)) {
while (cl > 0) {
ast_mutex_lock(&ser->lock);
@@ -2453,6 +2467,9 @@
req.len = req.data->used;
}
}
+ /*! \todo XXX If there's no Content-Length or if the content-length and what
+ we receive is not the same - we should generate an error */
+
req.socket.ser = ser;
handle_request(&req, &ser->requestor);
}
@@ -2474,6 +2491,8 @@
ast_free(req.data);
req.data = NULL;
}
+
+ ast_debug(2, "Shutting down thread for %s server\n", ser->ssl ? "SSL" : "TCP");
ao2_ref(ser, -1);
@@ -2790,8 +2809,9 @@
return sip_debug_test_addr(sip_real_dst(p));
}
-static inline const char *get_transport_list(struct sip_peer *peer) {
- switch (peer->transports) {
+/*! \brief Return configuration of transports for a device */
+static inline const char *get_transport_list(unsigned int transports) {
+ switch (transports) {
case SIP_TRANSPORT_UDP:
return "UDP";
case SIP_TRANSPORT_TCP:
@@ -2805,11 +2825,12 @@
case SIP_TRANSPORT_TCP | SIP_TRANSPORT_TLS:
return "TLS,TCP";
default:
- return peer->transports ?
+ return transports ?
"TLS,TCP,UDP" : "UNKNOWN";
}
}
+/*! \brief Return transport as string */
static inline const char *get_transport(enum sip_transport t)
{
switch (t) {
@@ -2824,6 +2845,12 @@
return "UNKNOWN";
}
+/*! \brief Return transport of dialog.
+ \note this is based on a false assumption. We don't always use the
+ outbound proxy for all requests in a dialog. It depends on the
+ "force" parameter. The FIRST request is always sent to the ob proxy.
+ \todo Fix this function to work correctly
+*/
static inline const char *get_transport_pvt(struct sip_pvt *p)
{
if (p->outboundproxy && p->outboundproxy->transport)
@@ -2842,7 +2869,7 @@
int res = 0;
const struct sockaddr_in *dst = sip_real_dst(p);
- ast_debug(1, "Trying to put '%.10s' onto %s socket destined for %s:%d\n", data->str, get_transport_pvt(p), ast_inet_ntoa(dst->sin_addr), htons(dst->sin_port));
+ ast_debug(2, "Trying to put '%.10s' onto %s socket destined for %s:%d\n", data->str, get_transport_pvt(p), ast_inet_ntoa(dst->sin_addr), htons(dst->sin_port));
if (sip_prepare_socket(p) < 0)
return XMIT_ERROR;
@@ -2856,7 +2883,7 @@
if (p->socket.ser->f)
res = ast_tcptls_server_write(p->socket.ser, data->str, len);
else
- ast_debug(1, "No p->socket.ser->f len=%d\n", len);
+ ast_debug(2, "No p->socket.ser->f len=%d\n", len);
}
if (p->socket.ser)
@@ -3133,14 +3160,15 @@
/* If the transport is something reliable (TCP or TLS) then don't really send this reliably */
/* I removed the code from retrans_pkt that does the same thing so it doesn't get loaded into the scheduler */
- /* According to the RFC some packets need to be retransmitted even if its TCP, so this needs to get revisited */
+ /*! \todo According to the RFC some packets need to be retransmitted even if its TCP, so this needs to get revisited */
if (!(p->socket.type & SIP_TRANSPORT_UDP)) {
- xmitres = __sip_xmit(dialog_ref(p, "pasing dialog ptr into callback..."), data, len); /* Send packet */
+ xmitres = __sip_xmit(dialog_ref(p, "passing dialog ptr into callback..."), data, len); /* Send packet */
if (xmitres == XMIT_ERROR) { /* Serious network trouble, no need to try again */
append_history(p, "XmitErr", "%s", fatal ? "(Critical)" : "(Non-critical)");
return AST_FAILURE;
- } else
+ } else {
return AST_SUCCESS;
+ }
}
if (!(pkt = ast_calloc(1, sizeof(*pkt) + len + 1)))
@@ -4421,7 +4449,7 @@
/* Let's see if we can find the host in DNS. First try DNS SRV records,
then hostname lookup */
- /*! \todo Fix this function. When we ask SRC, we should check all transports
+ /*! \todo Fix this function. When we ask for SRV, we should check all transports
In the future, we should first check NAPTR to find out transport preference
*/
hostn = peername;
@@ -9001,8 +9029,10 @@
ast_string_field_build(p, our_contact, "<sip:%s%s%s:%d>", p->exten, ast_strlen_zero(p->exten) ? "" : "@", ast_inet_ntoa(p->ourip.sin_addr), ntohs(p->socket.port));
else
ast_string_field_build(p, our_contact, "<sip:%s%s%s>", p->exten, ast_strlen_zero(p->exten) ? "" : "@", ast_inet_ntoa(p->ourip.sin_addr));
- } else
+ } else {
+ /*! \todo We should not always add port here. Port is only added if it's non-standard (see code above) */
ast_string_field_build(p, our_contact, "<sip:%s%s%s:%d;transport=%s>", p->exten, ast_strlen_zero(p->exten) ? "" : "@", ast_inet_ntoa(p->ourip.sin_addr), ntohs(p->socket.port), get_transport_pvt(p));
+ }
}
/*! \brief Build the Remote Party-ID & From using callingpres options */
@@ -10498,6 +10528,15 @@
contact2 = contact2_buf;
/* We have only the part in <brackets> here so we just need to parse a SIP URI.*/
+
+ /*! \brief This code is wrong, it assumes that the contact we receive will use the
+ same transport as the request. It's not a valid assumption. The contact for
+ a udp connection can be a SIPS uri, or request ;transport=tcp
+ \todo Fix this buggy code. It doesn't even parse transport!!!!
+
+ Note: The outbound proxy could be using UDP between the proxy and Asterisk.
+ We still need to be able to send to the remote agent through the proxy.
+ */
if (tcp) {
if (parse_uri(contact, "sips:", &contact, NULL, &host, &pt, NULL)) {
if (parse_uri(contact2, "sip:", &contact, NULL, &host, &pt, NULL))
@@ -10530,6 +10569,7 @@
if (ast_test_flag(&pvt->flags[0], SIP_NAT_ROUTE)) {
/* NAT: Don't trust the contact field. Just use what they came to us
with. */
+ /*! \todo We need to save the TRANSPORT here too */
pvt->sa = pvt->recv;
return 0;
}
@@ -11131,7 +11171,7 @@
ast_log(LOG_NOTICE, "Invalid to address: '%s' from %s (missing sip:) trying to use anyway...\n", c, ast_inet_ntoa(sin->sin_addr));
}
- /* XXX here too we interpret a missing @domain as a name-only
+ /*! \todo XXX here too we interpret a missing @domain as a name-only
* URI, whereas the RFC says this is a domain-only uri.
*/
/* Strip off the domain name */
@@ -11165,6 +11205,7 @@
}
if (peer) {
+ /*! \todo OEJ Remove this - there's never RTP in a REGISTER dialog... */
/* Set Frame packetization */
if (p->rtp) {
ast_rtp_codec_setpref(p->rtp, &peer->prefs);
@@ -11181,35 +11222,37 @@
if (sip_cancel_destroy(p))
ast_log(LOG_WARNING, "Unable to cancel SIP destruction. Expect bad things.\n");
- /* We have a successful registration attempt with proper authentication,
- now, update the peer */
- switch (parse_register_contact(p, peer, req)) {
- case PARSE_REGISTER_FAILED:
- ast_log(LOG_WARNING, "Failed to parse contact info\n");
- transmit_response_with_date(p, "400 Bad Request", req);
- peer->lastmsgssent = -1;
- res = 0;
- break;
- case PARSE_REGISTER_QUERY:
- transmit_response_with_date(p, "200 OK", req);
- peer->lastmsgssent = -1;
- res = 0;
- break;
- case PARSE_REGISTER_UPDATE:
- update_peer(peer, p->expiry);
- /* Say OK and ask subsystem to retransmit msg counter */
- transmit_response_with_date(p, "200 OK", req);
- if (!ast_test_flag((&peer->flags[1]), SIP_PAGE2_SUBSCRIBEMWIONLY))
- peer->lastmsgssent = -1;
- res = 0;
- break;
- }
-
if (check_request_transport(peer, req)) {
ast_set_flag(&p->flags[0], SIP_PENDINGBYE);
transmit_response_with_date(p, "403 Forbidden", req);
res = AUTH_BAD_TRANSPORT;
+ } else {
+
+ /* We have a successful registration attempt with proper authentication,
+ now, update the peer */
+ switch (parse_register_contact(p, peer, req)) {
+ case PARSE_REGISTER_FAILED:
+ ast_log(LOG_WARNING, "Failed to parse contact info\n");
+ transmit_response_with_date(p, "400 Bad Request", req);
+ peer->lastmsgssent = -1;
+ res = 0;
+ break;
+ case PARSE_REGISTER_QUERY:
+ transmit_response_with_date(p, "200 OK", req);
+ peer->lastmsgssent = -1;
+ res = 0;
+ break;
+ case PARSE_REGISTER_UPDATE:
+ update_peer(peer, p->expiry);
+ /* Say OK and ask subsystem to retransmit msg counter */
+ transmit_response_with_date(p, "200 OK", req);
+ if (!ast_test_flag((&peer->flags[1]), SIP_PAGE2_SUBSCRIBEMWIONLY))
+ peer->lastmsgssent = -1;
+ res = 0;
+ break;
+ }
}
+
}
}
}
@@ -12957,11 +13000,11 @@
}
}
-/* this func is used with ao2_callback to unlink/delete all dialogs that
+/*! \brief this func is used with ao2_callback to unlink/delete all dialogs that
are marked needdestroy. It will return CMP_MATCH for candidates, and they
- will be unlinked */
-
-/* TODO: Implement a queue and instead of marking a dialog
+ will be unlinked
+
+ TODO: Implement a queue and instead of marking a dialog
to be destroyed, toss it into the queue. Have a separate
thread do the locking and destruction */
@@ -12995,7 +13038,7 @@
/* We absolutely cannot destroy the rtp struct while a bridge is active or we WILL crash */
if (dialog->rtp && ast_rtp_get_bridged(dialog->rtp)) {
- ast_debug(2, "Bridge still active. Delaying destroy of SIP dialog '%s' Method: %s\n", dialog->callid, sip_methods[dialog->method].text);
+ ast_debug(2, "Bridge still active. Delaying destruction of SIP dialog '%s' Method: %s\n", dialog->callid, sip_methods[dialog->method].text);
sip_pvt_unlock(dialog);
return 0;
}
@@ -13446,7 +13489,8 @@
ast_cli(fd, " ToHost : %s\n", peer->tohost);
ast_cli(fd, " Addr->IP : %s Port %d\n", peer->addr.sin_addr.s_addr ? ast_inet_ntoa(peer->addr.sin_addr) : "(Unspecified)", ntohs(peer->addr.sin_port));
ast_cli(fd, " Defaddr->IP : %s Port %d\n", ast_inet_ntoa(peer->defaddr.sin_addr), ntohs(peer->defaddr.sin_port));
- ast_cli(fd, " Transport : %s\n", get_transport(peer->socket.type));
+ ast_cli(fd, " Prim.Transp. : %s\n", get_transport(peer->socket.type));
+ ast_cli(fd, " Allowed.Trsp : %s\n", get_transport_list(peer->transports));
if (!ast_strlen_zero(global_regcontext))
ast_cli(fd, " Reg. exten : %s\n", peer->regexten);
ast_cli(fd, " Def. Username: %s\n", peer->username);
@@ -13954,6 +13998,8 @@
ast_cli(a->fd, "\nDefault Settings:\n");
ast_cli(a->fd, "-----------------\n");
+ ast_cli(a->fd, " Allowed transports: %s\n", get_transport_list(default_transports));
+ ast_cli(a->fd, " Outbound transport: %s\n", get_transport(default_primary_transport));
ast_cli(a->fd, " Context: %s\n", default_context);
ast_cli(a->fd, " Nat: %s\n", nat2str(ast_test_flag(&global_flags[0], SIP_NAT)));
ast_cli(a->fd, " DTMF: %s\n", dtmfmode2str(ast_test_flag(&global_flags[0], SIP_DTMF)));
@@ -15255,7 +15301,7 @@
}
/*! \brief Structure to declare a dialplan function: SIPPEER */
-struct ast_custom_function sippeer_function = {
+static struct ast_custom_function sippeer_function = {
.name = "SIPPEER",
.synopsis = "Gets SIP peer information",
.syntax = "SIPPEER(<peername>[,item])",
@@ -15457,7 +15503,7 @@
/* Actually don't destroy us yet, wait for the 487 on our original
INVITE, but do set an autodestruct just in case we never get it. */
else {
- /* We have a pending outbound invite, don't send someting
+ /* We have a pending outbound invite, don't send something
new in-transaction */
if (p->pendinginvite)
return;
@@ -18888,7 +18934,7 @@
/* Get RTCP quality before end of call */
if (p->do_history || p->owner) {
- struct ast_channel *bridge = ast_bridged_channel(p->owner);
+ struct ast_channel *bridge = p->owner ? ast_bridged_channel(p->owner) : NULL;
char *videoqos, *textqos;
if (p->rtp) {
@@ -18909,7 +18955,9 @@
append_history(p, "RTCPaudioRTT", "Quality:%s", audioqos_rtt);
}
- ast_rtp_set_vars(p->owner, p->rtp);
+ if (p->owner) {
+ ast_rtp_set_vars(p->owner, p->rtp);
+ }
}
if (bridge) {
@@ -19663,6 +19711,10 @@
return 1;
}
+/*! \brief Handle incoming SIP message - request or response
+
+ This is used for all transports (udp, tcp and tcp/tls)
+*/
static int handle_request(struct sip_request *req, struct sockaddr_in *sin)
{
struct sip_pvt *p;
@@ -19675,7 +19727,7 @@
if (pedanticsipchecking)
req->len = lws2sws(req->data->str, req->len); /* Fix multiline headers */
if (req->debug) {
- ast_verbose("\n<--- SIP read from %s://%s:%d --->\n%s\n<------------->\n",
+ ast_verbose("\n<--- SIP read from %s:%s:%d --->\n%s\n<------------->\n",
get_transport(req->socket.type), ast_inet_ntoa(sin->sin_addr),
ntohs(sin->sin_port), req->data->str);
}
@@ -19764,7 +19816,7 @@
return s.port == htons(STANDARD_SIP_PORT);
}
-/*! \todo document this function. */
+/*! \todo Find thread for TCP/TLS session (based on IP/Port */
static struct ast_tcptls_session_instance *sip_tcp_locate(struct sockaddr_in *s)
{
struct sip_threadinfo *th;
@@ -19782,7 +19834,7 @@
return NULL;
}
-/*! \todo document this function. */
+/*! \todo Get socket for dialog, prepare if needed, and return file handle */
static int sip_prepare_socket(struct sip_pvt *p)
{
struct sip_socket *s = &p->socket;
@@ -19794,8 +19846,11 @@
};
if (s->fd != -1)
- return s->fd;
-
+ return s->fd; /* This socket is already active */
+
+ /*! \todo Check this... This might be wrong, depending on the proxy configuration
+ If proxy is in "force" mode its correct.
+ */
if (p->outboundproxy && p->outboundproxy->transport) {
s->type = p->outboundproxy->transport;
}
@@ -19807,7 +19862,7 @@
ca.sin = *(sip_real_dst(p));
- if ((ser = sip_tcp_locate(&ca.sin))) {
+ if ((ser = sip_tcp_locate(&ca.sin))) { /* Check if we have a thread handling a socket connected to this IP/port */
s->fd = ser->fd;
if (s->ser) {
ao2_ref(s->ser, -1);
@@ -19834,7 +19889,7 @@
if (s->ser) {
/* the pvt socket already has a server instance ... */
} else {
- s->ser = ast_tcptls_client_start(&ca);
+ s->ser = ast_tcptls_client_start(&ca); /* Start a client connection to this address */
}
if (!s->ser) {
@@ -21623,8 +21678,10 @@
}
if (!peer->socket.type) {
- peer->transports = SIP_TRANSPORT_UDP;
- peer->socket.type = SIP_TRANSPORT_UDP;
+ /* Set default set of transports */
+ peer->transports = default_transports;
+ /* Set default primary transport */
+ peer->socket.type = default_primary_transport;
}
if (fullcontact->used > 0) {
@@ -21812,6 +21869,7 @@
default_tls_cfg.cipher = ast_strdup("");
default_tls_cfg.cafile = ast_strdup("");
default_tls_cfg.capath = ast_strdup("");
+
/* Initialize copy of current global_regcontext for later use in removing stale contexts */
ast_copy_string(oldcontexts, global_regcontext, sizeof(oldcontexts));
@@ -21837,6 +21895,8 @@
global_outboundproxy.ip.sin_port = htons(STANDARD_SIP_PORT);
global_outboundproxy.ip.sin_family = AF_INET; /*!< Type of address: IPv4 */
global_outboundproxy.force = FALSE; /*!< Don't force proxy usage, use route: headers */
+ default_transports = 0; /*!< Reset default transport to zero here, default value later on */
+ default_primary_transport = 0; /*!< Reset default primary transport to zero here, default value later on */
ourport_tcp = STANDARD_SIP_PORT;
ourport_tls = STANDARD_TLS_PORT;
bindaddr.sin_port = htons(STANDARD_SIP_PORT);
@@ -21980,6 +22040,25 @@
global_timer_b = global_t1 * 64;
} else if (!strcasecmp(v->name, "t1min")) {
global_t1min = atoi(v->value);
+ } else if (!strcasecmp(v->name, "transport") && !ast_strlen_zero(v->value)) {
+ char *val = ast_strdupa(v->value);
+ char *trans;
+
+ while ((trans = strsep(&val, ","))) {
+ trans = ast_skip_blanks(trans);
+
+ if (!strncasecmp(trans, "udp", 3))
+ default_transports |= SIP_TRANSPORT_UDP;
+ else if (!strncasecmp(trans, "tcp", 3))
+ default_transports |= SIP_TRANSPORT_TCP;
+ else if (!strncasecmp(trans, "tls", 3))
+ default_transports |= SIP_TRANSPORT_TLS;
+ else
+ ast_log(LOG_NOTICE, "'%s' is not a valid transport type. if no other is specified, udp will be used.\n", trans);
+ if (default_primary_transport == 0) {
+ default_primary_transport = default_transports;
+ }
+ }
} else if (!strcasecmp(v->name, "tcpenable")) {
sip_tcp_desc.sin.sin_family = ast_false(v->value) ? 0 : AF_INET;
ast_debug(2, "Enabling TCP socket for listening\n");
@@ -22342,6 +22421,10 @@
ast_log(LOG_WARNING, "To disallow external domains, you need to configure local SIP domains.\n");
allow_external_domains = 1;
}
+ /* If not configured, set default transports */
+ if (default_transports == 0) {
+ default_transports = default_primary_transport = SIP_TRANSPORT_UDP;
+ }
/* Build list of authentication to various SIP realms, i.e. service providers */
for (v = ast_variable_browse(cfg, "authentication"); v ; v = v->next) {
@@ -22495,13 +22578,24 @@
/* Start TCP server */
ast_tcptls_server_start(&sip_tcp_desc);
+ if (sip_tcp_desc.accept_fd == -1 && sip_tcp_desc.sin.sin_family == AF_INET) {
+ /* TCP server start failed. Tell the admin */
+ ast_log(LOG_ERROR, "SIP TCP Server start failed. Not listening on TCP socket.\n");
+ sip_tcp_desc.sin.sin_family = 0;
+ } else {
+ ast_debug(2, "SIP TCP server started\n");
+ }
/* Start TLS server if needed */
memcpy(sip_tls_desc.tls_cfg, &default_tls_cfg, sizeof(default_tls_cfg));
- if (ast_ssl_setup(sip_tls_desc.tls_cfg))
+ if (ast_ssl_setup(sip_tls_desc.tls_cfg)) {
ast_tcptls_server_start(&sip_tls_desc);
- else if (sip_tls_desc.tls_cfg->enabled) {
+ if (default_tls_cfg.enabled && sip_tls_desc.accept_fd == -1) {
+ ast_log(LOG_ERROR, "TLS Server start failed. Not listening on TLS socket.\n");
+ sip_tls_desc.tls_cfg = NULL;
+ }
+ } else if (sip_tls_desc.tls_cfg->enabled) {
sip_tls_desc.tls_cfg = NULL;
ast_log(LOG_WARNING, "SIP TLS server did not load because of errors.\n");
}
Modified: team/russell/sched_thread/include/asterisk/config.h
URL: http://svn.digium.com/view/asterisk/team/russell/sched_thread/include/asterisk/config.h?view=diff&rev=148822&r1=148821&r2=148822
==============================================================================
--- team/russell/sched_thread/include/asterisk/config.h (original)
+++ team/russell/sched_thread/include/asterisk/config.h Tue Oct 14 08:54:36 2008
@@ -91,6 +91,7 @@
typedef struct ast_variable *realtime_var_get(const char *database, const char *table, va_list ap);
typedef struct ast_config *realtime_multi_get(const char *database, const char *table, va_list ap);
typedef int realtime_update(const char *database, const char *table, const char *keyfield, const char *entity, va_list ap);
+typedef int realtime_update2(const char *database, const char *table, va_list ap);
typedef int realtime_store(const char *database, const char *table, va_list ap);
typedef int realtime_destroy(const char *database, const char *table, const char *keyfield, const char *entity, va_list ap);
typedef int realtime_require(const char *database, const char *table, va_list ap);
@@ -103,6 +104,7 @@
realtime_var_get *realtime_func;
realtime_multi_get *realtime_multi_func;
realtime_update *update_func;
+ realtime_update2 *update2_func;
realtime_store *store_func;
realtime_destroy *destroy_func;
realtime_require *require_func;
@@ -208,6 +210,9 @@
* entity in realtime and return a variable list of its parameters. Note
* that unlike the variables in ast_config, the resulting list of variables
* MUST be freed with ast_variables_destroy() as there is no container.
+ *
+ * Note that you should use the constant SENTINEL to terminate arguments, in
+ * order to preserve cross-platform compatibility.
*/
struct ast_variable *ast_load_realtime(const char *family, ...) attribute_sentinel;
struct ast_variable *ast_load_realtime_all(const char *family, ...) attribute_sentinel;
@@ -243,6 +248,9 @@
* a timeout value may reasonably be specified as an INTEGER2, with size 5.
* Even though values above 32767 seconds are possible, they are unlikely
* to be useful, and we should not complain about that size).
+ *
+ * Note that you should use the constant SENTINEL to terminate arguments, in
+ * order to preserve cross-platform compatibility.
*/
int ast_realtime_require_field(const char *family, ...) attribute_sentinel;
@@ -254,6 +262,9 @@
* the ast_load_realtime, this function can return more than one entry and
* is thus stored inside a taditional ast_config structure rather than
* just returning a linked list of variables.
+ *
+ * Note that you should use the constant SENTINEL to terminate arguments, in
+ * order to preserve cross-platform compatibility.
*/
struct ast_config *ast_load_realtime_multientry(const char *family, ...) attribute_sentinel;
@@ -264,14 +275,31 @@
* \param lookup which value to look for in the key field to match the entry.
* This function is used to update a parameter in realtime configuration space.
*
+ * Note that you should use the constant SENTINEL to terminate arguments, in
+ * order to preserve cross-platform compatibility.
*/
int ast_update_realtime(const char *family, const char *keyfield, const char *lookup, ...) attribute_sentinel;
+
+/*!
+ * \brief Update realtime configuration
+ * \param family which family/config to be updated
+ * This function is used to update a parameter in realtime configuration space.
+ * It includes the ability to lookup a row based upon multiple key criteria.
+ * As a result, this function includes two sentinel values, one to terminate
+ * lookup values and the other to terminate the listing of fields to update.
+ *
+ * Note that you should use the constant SENTINEL to terminate arguments, in
+ * order to preserve cross-platform compatibility.
+ */
+int ast_update2_realtime(const char *family, ...) attribute_sentinel;
/*!
* \brief Create realtime configuration
* \param family which family/config to be created
* This function is used to create a parameter in realtime configuration space.
*
+ * Note that you should use the constant SENTINEL to terminate arguments, in
+ * order to preserve cross-platform compatibility.
*/
int ast_store_realtime(const char *family, ...) attribute_sentinel;
@@ -283,6 +311,8 @@
* This function is used to destroy an entry in realtime configuration space.
* Additional params are used as keys.
*
+ * Note that you should use the constant SENTINEL to terminate arguments, in
+ * order to preserve cross-platform compatibility.
*/
int ast_destroy_realtime(const char *family, const char *keyfield, const char *lookup, ...) attribute_sentinel;
Modified: team/russell/sched_thread/include/asterisk/strings.h
URL: http://svn.digium.com/view/asterisk/team/russell/sched_thread/include/asterisk/strings.h?view=diff&rev=148822&r1=148821&r2=148822
==============================================================================
--- team/russell/sched_thread/include/asterisk/strings.h (original)
+++ team/russell/sched_thread/include/asterisk/strings.h Tue Oct 14 08:54:36 2008
@@ -421,8 +421,8 @@
_DB1(__ast_threadstorage_object_replace(old_buf, *buf, new_len + sizeof(struct ast_str));)
}
- (*buf)->len = new_len;
- return 0;
+ (*buf)->len = new_len;
+ return 0;
}
)
Modified: team/russell/sched_thread/main/config.c
URL: http://svn.digium.com/view/asterisk/team/russell/sched_thread/main/config.c?view=diff&rev=148822&r1=148821&r2=148822
==============================================================================
--- team/russell/sched_thread/main/config.c (original)
+++ team/russell/sched_thread/main/config.c Tue Oct 14 08:54:36 2008
@@ -2069,8 +2069,8 @@
static struct ast_variable *ast_load_realtime_helper(const char *family, va_list ap)
{
struct ast_config_engine *eng;
- char db[256]="";
- char table[256]="";
+ char db[256];
+ char table[256];
struct ast_variable *res=NULL;
eng = find_engine(family, db, sizeof(db), table, sizeof(table));
@@ -2141,8 +2141,8 @@
int ast_realtime_require_field(const char *family, ...)
{
struct ast_config_engine *eng;
- char db[256] = "";
- char table[256] = "";
+ char db[256];
+ char table[256];
va_list ap;
int res = -1;
@@ -2159,8 +2159,8 @@
int ast_unload_realtime(const char *family)
{
struct ast_config_engine *eng;
- char db[256] = "";
- char table[256] = "";
+ char db[256];
+ char table[256];
int res = -1;
eng = find_engine(family, db, sizeof(db), table, sizeof(table));
@@ -2173,9 +2173,9 @@
struct ast_config *ast_load_realtime_multientry(const char *family, ...)
{
struct ast_config_engine *eng;
- char db[256]="";
- char table[256]="";
- struct ast_config *res=NULL;
+ char db[256];
+ char table[256];
+ struct ast_config *res = NULL;
va_list ap;
va_start(ap, family);
@@ -2191,8 +2191,8 @@
{
struct ast_config_engine *eng;
int res = -1;
- char db[256]="";
- char table[256]="";
+ char db[256];
+ char table[256];
va_list ap;
va_start(ap, lookup);
@@ -2204,12 +2204,29 @@
return res;
}
-int ast_store_realtime(const char *family, ...)
+int ast_update2_realtime(const char *family, ...)
{
struct ast_config_engine *eng;
int res = -1;
- char db[256]="";
- char table[256]="";
+ char db[256];
+ char table[256];
+ va_list ap;
+
+ va_start(ap, family);
+ eng = find_engine(family, db, sizeof(db), table, sizeof(table));
+ if (eng && eng->update2_func)
+ res = eng->update2_func(db, table, ap);
+ va_end(ap);
+
+ return res;
+}
+
+int ast_store_realtime(const char *family, ...)
+{
+ struct ast_config_engine *eng;
+ int res = -1;
+ char db[256];
+ char table[256];
va_list ap;
va_start(ap, family);
@@ -2225,8 +2242,8 @@
{
struct ast_config_engine *eng;
int res = -1;
- char db[256]="";
- char table[256]="";
+ char db[256];
+ char table[256];
va_list ap;
va_start(ap, lookup);
Modified: team/russell/sched_thread/main/pbx.c
URL: http://svn.digium.com/view/asterisk/team/russell/sched_thread/main/pbx.c?view=diff&rev=148822&r1=148821&r2=148822
==============================================================================
--- team/russell/sched_thread/main/pbx.c (original)
+++ team/russell/sched_thread/main/pbx.c Tue Oct 14 08:54:36 2008
@@ -5089,18 +5089,57 @@
}
}
- if (option_debug && c->pattern_tree)
+ ast_unlock_context(c);
+
+ /* if we print something in context, make an empty line */
+ if (context_info_printed)
+ ast_cli(fd, "\r\n");
+ }
+ ast_unlock_contexts();
+
+ return (dpc->total_exten == old_total_exten) ? -1 : res;
+}
+
+static int show_debug_helper(int fd, const char *context, const char *exten, struct dialplan_counters *dpc, struct ast_include *rinclude, int includecount, const char *includes[])
+{
+ struct ast_context *c = NULL;
+ int res = 0, old_total_exten = dpc->total_exten;
+
+ ast_cli(fd,"\r\n In-mem exten Trie for Fast Extension Pattern Matching:\r\n\r\n");
+
+ ast_cli(fd,"\r\n Explanation: Node Contents Format = <char(s) to match>:<pattern?>:<specif>:[matched extension]\r\n");
+ ast_cli(fd, " Where <char(s) to match> is a set of chars, any one of which should match the current character\r\n");
+ ast_cli(fd, " <pattern?>: Y if this a pattern match (eg. _XZN[5-7]), N otherwise\r\n");
+ ast_cli(fd, " <specif>: an assigned 'exactness' number for this matching char. The lower the number, the more exact the match\r\n");
+ ast_cli(fd, " [matched exten]: If all chars matched to this point, which extension this matches. In form: EXTEN:<exten string> \r\n");
+ ast_cli(fd, " In general, you match a trie node to a string character, from left to right. All possible matching chars\r\n");
+ ast_cli(fd, " are in a string vertically, separated by an unbroken string of '+' characters.\r\n\r\n");
+ ast_rdlock_contexts();
+
+ /* walk all contexts ... */
+ while ( (c = ast_walk_contexts(c)) ) {
+ int context_info_printed = 0;
+
+ if (context && strcmp(ast_get_context_name(c), context))
+ continue; /* skip this one, name doesn't match */
+
+ dpc->context_existence = 1;
+
+ if (!c->pattern_tree)
+ ast_exists_extension(NULL, c->name, "s", 1, ""); /* do this to force the trie to built, if it is not already */
+
+ ast_rdlock_context(c);
+
+ dpc->total_context++;
+ ast_cli(fd, "[ Context '%s' created by '%s' ]\n",
+ ast_get_context_name(c), ast_get_context_registrar(c));
+ context_info_printed = 1;
+
+ if (c->pattern_tree)
{
- ast_cli(fd,"\r\n In-mem exten Trie for Fast Extension Pattern Matching:\r\n\r\n");
-
- ast_cli(fd,"\r\n Explanation: Node Contents Format = <char(s) to match>:<pattern?>:<specif>:[matched extension]\r\n");
- ast_cli(fd, " Where <char(s) to match> is a set of chars, any one of which should match the current character\r\n");
- ast_cli(fd, " <pattern?>: Y if this a pattern match (eg. _XZN[5-7]), N otherwise\r\n");
- ast_cli(fd, " <specif>: an assigned 'exactness' number for this matching char. The lower the number, the more exact the match\r\n");
- ast_cli(fd, " [matched exten]: If all chars matched to this point, which extension this matches. In form: EXTEN:<exten string> \r\n");
- ast_cli(fd, " In general, you match a trie node to a string character, from left to right. All possible matching chars\r\n");
- ast_cli(fd, " are in a string vertically, separated by an unbroken string of '+' characters.\r\n\r\n");
cli_match_char_tree(c->pattern_tree, " ", fd);
+ } else {
[... 1763 lines stripped ...]
More information about the asterisk-commits
mailing list