[asterisk-commits] oej: branch oej/oolong-path-support-11 r379605 - in /team/oej/oolong-path-sup...
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Sun Jan 20 03:34:13 CST 2013
Author: oej
Date: Sun Jan 20 03:34:06 2013
New Revision: 379605
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=379605
Log:
Adding patch for Asterisk 11
Added:
team/oej/oolong-path-support-11/README.oolong-path-support (with props)
Modified:
team/oej/oolong-path-support-11/channels/chan_sip.c
team/oej/oolong-path-support-11/channels/sip/include/sip.h
team/oej/oolong-path-support-11/configs/sip.conf.sample
team/oej/oolong-path-support-11/contrib/realtime/mysql/sippeers.sql
team/oej/oolong-path-support-11/contrib/realtime/postgresql/realtime.sql
Added: team/oej/oolong-path-support-11/README.oolong-path-support
URL: http://svnview.digium.com/svn/asterisk/team/oej/oolong-path-support-11/README.oolong-path-support?view=auto&rev=379605
==============================================================================
--- team/oej/oolong-path-support-11/README.oolong-path-support (added)
+++ team/oej/oolong-path-support-11/README.oolong-path-support Sun Jan 20 03:34:06 2013
@@ -1,0 +1,34 @@
+Edvina AB
+Olle E. Johansson
+
+
+
+
+SIP PATH header support for Asterisk
+====================================
+
+This branch is based on Klaus Darillions work in https://reviewboard.asterisk.org/r/991/
+
+Issue in the bug tracker: https://issues.asterisk.org/jira/browse/ASTERISK-16884
+
+I've added
+- Realtime support (not tested)
+- Global flag support
+
+Tested without realtime, it works as expected. If you test with Realtime, please provide feedback in the
+bug tracker. All tests done with Kamailio - http://www.kamailio.org
+
+What is path header?
+====================
+Path is documented in RFC 3327.
+
+Since REGISTER requests can not support Record-Route/route an edge proxy that is separate from a registrar/location
+server adds a Path: header to a SIP REGISTER request to indicate that requests to this contact should be routed
+through a certain edge proxy. This is saved in the registration database and used for new requests to the
+registred contact.
+
+In Asterisk we save the Path in the AstDB and/or in the realtime database
+
+Todo:
+----
+- Update LDAP schemas for realtime
Propchange: team/oej/oolong-path-support-11/README.oolong-path-support
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: team/oej/oolong-path-support-11/README.oolong-path-support
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Propchange: team/oej/oolong-path-support-11/README.oolong-path-support
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: team/oej/oolong-path-support-11/channels/chan_sip.c
URL: http://svnview.digium.com/svn/asterisk/team/oej/oolong-path-support-11/channels/chan_sip.c?view=diff&rev=379605&r1=379604&r2=379605
==============================================================================
--- team/oej/oolong-path-support-11/channels/chan_sip.c (original)
+++ team/oej/oolong-path-support-11/channels/chan_sip.c Sun Jan 20 03:34:06 2013
@@ -1362,6 +1362,8 @@
static void free_old_route(struct sip_route *route);
static void list_route(struct sip_route *route);
static void build_route(struct sip_pvt *p, struct sip_request *req, int backwards, int resp);
+static void build_path(struct sip_pvt *p, struct sip_peer *peer, struct sip_request *req, char *pathbuf);
+static void copy_route(struct sip_route **d, struct sip_route *s);
static enum check_auth_result register_verify(struct sip_pvt *p, struct ast_sockaddr *addr,
struct sip_request *req, const char *uri);
static struct sip_pvt *get_sip_pvt_byid_locked(const char *callid, const char *totag, const char *fromtag);
@@ -1535,7 +1537,7 @@
static int peer_ipcmp_cb_full(void *obj, void *arg, void *data, int flags);
/* Realtime device support */
-static void realtime_update_peer(const char *peername, struct ast_sockaddr *addr, const char *username, const char *fullcontact, const char *useragent, int expirey, unsigned short deprecated_username, int lastms);
+static void realtime_update_peer(const char *peername, struct ast_sockaddr *addr, const char *username, const char *fullcontact, const char *useragent, int expirey, unsigned short deprecated_username, int lastms, const char *path);
static void update_peer(struct sip_peer *p, int expire);
static struct ast_variable *get_insecure_variable_from_config(struct ast_config *config);
static const char *get_name_from_variable(const struct ast_variable *var);
@@ -1617,6 +1619,7 @@
static int add_rpid(struct sip_request *req, struct sip_pvt *p);
static int add_vidupdate(struct sip_request *req);
static void add_route(struct sip_request *req, struct sip_route *route);
+static void make_route_list(struct sip_route *route, char *r, int rem);
static int copy_header(struct sip_request *req, const struct sip_request *orig, const char *field);
static int copy_all_header(struct sip_request *req, const struct sip_request *orig, const char *field);
static int copy_via_headers(struct sip_pvt *p, struct sip_request *req, const struct sip_request *orig, const char *field);
@@ -5061,7 +5064,7 @@
that name and store that in the "regserver" field in the sippeers
table to facilitate multi-server setups.
*/
-static void realtime_update_peer(const char *peername, struct ast_sockaddr *addr, const char *defaultuser, const char *fullcontact, const char *useragent, int expirey, unsigned short deprecated_username, int lastms)
+static void realtime_update_peer(const char *peername, struct ast_sockaddr *addr, const char *defaultuser, const char *fullcontact, const char *useragent, int expirey, unsigned short deprecated_username, int lastms, const char *path)
{
char port[10];
char ipaddr[INET6_ADDRSTRLEN];
@@ -5084,10 +5087,11 @@
ast_copy_string(ipaddr, ast_sockaddr_isnull(addr) ? "" : ast_sockaddr_stringify_addr(addr), sizeof(ipaddr));
ast_copy_string(port, ast_sockaddr_port(addr) ? ast_sockaddr_stringify_port(addr) : "", sizeof(port));
- if (ast_strlen_zero(sysname)) /* No system name, disable this */
+ if (ast_strlen_zero(sysname)) { /* No system name, disable this */
sysname = NULL;
- else if (sip_cfg.rtsave_sysname)
+ } else if (sip_cfg.rtsave_sysname) {
syslabel = "regserver";
+ }
/* XXX IMPORTANT: Anytime you add a new parameter to be updated, you
* must also add it to contrib/scripts/asterisk.ldap-schema,
@@ -5095,18 +5099,38 @@
* and to configs/res_ldap.conf.sample as described in
* bugs 15156 and 15895
*/
- if (fc) {
- ast_update_realtime(tablename, "name", peername, "ipaddr", ipaddr,
- "port", port, "regseconds", regseconds,
- deprecated_username ? "username" : "defaultuser", defaultuser,
- "useragent", useragent, "lastms", str_lastms,
- fc, fullcontact, syslabel, sysname, SENTINEL); /* note fc and syslabel _can_ be NULL */
+
+ /* This is ugly, we need something better ;-) */
+ if (sip_cfg.rtsave_path) {
+ if (fc) {
+ ast_update_realtime(tablename, "name", peername, "ipaddr", ipaddr,
+ "port", port, "regseconds", regseconds,
+ deprecated_username ? "username" : "defaultuser", defaultuser,
+ "useragent", useragent, "lastms", str_lastms,
+ "path", path, /* Path data can be NULL */
+ fc, fullcontact, syslabel, sysname, SENTINEL); /* note fc and syslabel _can_ be NULL */
+ } else {
+ ast_update_realtime(tablename, "name", peername, "ipaddr", ipaddr,
+ "port", port, "regseconds", regseconds,
+ "useragent", useragent, "lastms", str_lastms,
+ deprecated_username ? "username" : "defaultuser", defaultuser,
+ "path", path, /* Path data can be NULL */
+ syslabel, sysname, SENTINEL); /* note syslabel _can_ be NULL */
+ }
} else {
- ast_update_realtime(tablename, "name", peername, "ipaddr", ipaddr,
- "port", port, "regseconds", regseconds,
- "useragent", useragent, "lastms", str_lastms,
- deprecated_username ? "username" : "defaultuser", defaultuser,
- syslabel, sysname, SENTINEL); /* note syslabel _can_ be NULL */
+ if (fc) {
+ ast_update_realtime(tablename, "name", peername, "ipaddr", ipaddr,
+ "port", port, "regseconds", regseconds,
+ deprecated_username ? "username" : "defaultuser", defaultuser,
+ "useragent", useragent, "lastms", str_lastms,
+ fc, fullcontact, syslabel, sysname, SENTINEL); /* note fc and syslabel _can_ be NULL */
+ } else {
+ ast_update_realtime(tablename, "name", peername, "ipaddr", ipaddr,
+ "port", port, "regseconds", regseconds,
+ "useragent", useragent, "lastms", str_lastms,
+ deprecated_username ? "username" : "defaultuser", defaultuser,
+ syslabel, sysname, SENTINEL); /* note syslabel _can_ be NULL */
+ }
}
}
@@ -5200,6 +5224,10 @@
if (peer->chanvars) {
ast_variables_destroy(peer->chanvars);
peer->chanvars = NULL;
+ }
+ if (peer->path) {
+ free_old_route(peer->path);
+ peer->path = NULL;
}
register_peer_exten(peer, FALSE);
@@ -5243,7 +5271,9 @@
int rtcachefriends = ast_test_flag(&p->flags[1], SIP_PAGE2_RTCACHEFRIENDS);
if (sip_cfg.peer_rtupdate &&
(p->is_realtime || rtcachefriends)) {
- realtime_update_peer(p->name, &p->addr, p->username, p->fullcontact, p->useragent, expire, p->deprecated_username, p->lastms);
+ char path[SIPBUFSIZE*2];
+ make_route_list(p->path, path, sizeof(path));
+ realtime_update_peer(p->name, &p->addr, p->username, p->fullcontact, p->useragent, expire, p->deprecated_username, p->lastms, path);
}
}
@@ -5938,6 +5968,8 @@
return 0;
}
+static int __set_address_from_contact(const char *fullcontact, struct ast_sockaddr *addr, int tcp);
+
/*! \brief Create address structure from peer reference.
* This function copies data from peer to the dialog, so we don't have to look up the peer
* again from memory or database during the life time of the dialog.
@@ -5978,6 +6010,12 @@
dialog->rtptimeout = peer->rtptimeout;
dialog->rtpholdtimeout = peer->rtpholdtimeout;
dialog->rtpkeepalive = peer->rtpkeepalive;
+ copy_route(&dialog->route, peer->path);
+ if (dialog->route) {
+ /* Parse SIP URI of first route-set hop and use it as target address */
+ __set_address_from_contact(dialog->route->hop, &dialog->sa, dialog->socket.type == SIP_TRANSPORT_TLS ? 1 : 0);
+ }
+
if (dialog_initialize_rtp(dialog)) {
return -1;
}
@@ -11454,11 +11492,20 @@
/*! \brief Add route header into request per learned route */
static void add_route(struct sip_request *req, struct sip_route *route)
{
- char r[SIPBUFSIZE*2], *p;
- int n, rem = sizeof(r);
+ char r[SIPBUFSIZE*2];
if (!route)
return;
+
+ make_route_list(route, r, sizeof(r));
+ add_header(req, "Route", r);
+}
+
+/*! \brief Make the comma separated list of route headers from the route list */
+static void make_route_list(struct sip_route *route, char *r, int rem)
+{
+ char *p;
+ int n;
p = r;
for (;route ; route = route->next) {
@@ -11476,7 +11523,6 @@
rem -= (n+2);
}
*p = '\0';
- add_header(req, "Route", r);
}
/*! \brief Set destination from SIP URI
@@ -15545,6 +15591,7 @@
ast_update_realtime(tablename, "name", peer->name, "fullcontact", "", "ipaddr", "", "port", "", "regseconds", "0", "regserver", "", "useragent", "", "lastms", "0", SENTINEL);
} else {
ast_db_del("SIP/Registry", peer->name);
+ ast_db_del("SIP/RegistryPath", peer->name);
ast_db_del("SIP/PeerMethods", peer->name);
}
}
@@ -15648,6 +15695,7 @@
static void reg_source_db(struct sip_peer *peer)
{
char data[256];
+ char path[SIPBUFSIZE*2];
struct ast_sockaddr sa;
int expire;
char full_addr[128];
@@ -15706,6 +15754,11 @@
sip_unref_peer(peer, "remove registration ref"),
sip_ref_peer(peer, "add registration ref"));
register_peer_exten(peer, TRUE);
+ if (ast_db_get("SIP/RegistryPath", peer->name, path, sizeof(path))) {
+ return;
+ }
+ build_path(0, peer, 0, path);
+
}
/*! \brief Save contact header for 200 OK on INVITE */
@@ -16001,11 +16054,18 @@
}
}
pvt->expiry = expire;
+ build_path(pvt, peer, req, 0);
snprintf(data, sizeof(data), "%s:%d:%s:%s", ast_sockaddr_stringify(&peer->addr),
expire, peer->username, peer->fullcontact);
/* We might not immediately be able to reconnect via TCP, but try caching it anyhow */
- if (!peer->rt_fromcontact || !sip_cfg.peer_rtupdate)
+ if (!peer->rt_fromcontact || !sip_cfg.peer_rtupdate) {
+ char path[SIPBUFSIZE*2];
+ if (peer->path) {
+ make_route_list(peer->path, path, sizeof(path));
+ ast_db_put("SIP/RegistryPath", peer->name, path);
+ }
ast_db_put("SIP/Registry", peer->name, data);
+ }
manager_event(EVENT_FLAG_SYSTEM, "PeerStatus", "ChannelType: SIP\r\nPeer: SIP/%s\r\nPeerStatus: Registered\r\nAddress: %s\r\n", peer->name, ast_sockaddr_stringify(&peer->addr));
/* Is this a new IP address for us? */
@@ -16041,10 +16101,10 @@
static void list_route(struct sip_route *route)
{
if (!route) {
- ast_verbose("list_route: no route\n");
+ ast_verbose("list_route: no route/path\n");
} else {
for (;route; route = route->next)
- ast_verbose("list_route: hop: <%s>\n", route->hop);
+ ast_verbose("list_route: route/path hop: <%s>\n", route->hop);
}
}
@@ -16165,6 +16225,107 @@
/* For debugging dump what we ended up with */
if (sip_debug_test_pvt(p)) {
list_route(p->route);
+ }
+}
+
+/*! \brief copy route-set */
+static void copy_route(struct sip_route **d, struct sip_route *s)
+{
+ struct sip_route *thishop, *head, *tail;
+ /* Build a tailq, then assign it to **d when done.
+ */
+ head = NULL;
+ tail = head;
+ while (s) {
+ int len = strlen(s->hop) + 1;
+ if ((thishop = ast_malloc(sizeof(*thishop) + len))) {
+ /* ast_calloc is not needed because all fields are initialized in this block */
+ ast_copy_string(thishop->hop, s->hop, len);
+ ast_debug(2, "copy_route: copied hop: <%s>\n", thishop->hop);
+ thishop->next = NULL;
+ /* Link in at the end */
+ if (tail) {
+ tail->next = thishop;
+ } else {
+ head = thishop;
+ }
+ tail = thishop;
+ }
+ s = s->next;
+ }
+ *d = head;
+}
+/*! \brief Build route list from Path header
+ * RFC 3327 requires that the Path header contains SIP URIs with lr paramter.
+ * Thus, we do not care about strict routing SIP routers
+ */
+static void build_path(struct sip_pvt *p, struct sip_peer *peer, struct sip_request *req, char *pathbuf)
+{
+ struct sip_route *thishop, *head, *tail;
+ int start = 0;
+ int len;
+ const char *rr;
+
+ if (peer->path) {
+ free_old_route(peer->path);
+ peer->path = NULL;
+ }
+
+ if (!ast_test_flag(&peer->flags[0], SIP_USEPATH)) {
+ ast_debug(2, "build_path: do not use Path headers\n");
+ return;
+ }
+ ast_debug(2, "build_path: try to build pre-loaded route-set by parsing Path headers\n");
+
+ /* Build a tailq, then assign it to peer->path when done.
+ */
+ head = NULL;
+ tail = head;
+ /* 1st we pass through all the hops in any Path headers */
+ for (;;) {
+ /* Either loop over the request's Path headers or parse the buffer */
+ if (req) {
+ rr = __get_header(req, "Path", &start);
+ if (*rr == '\0') {
+ break;
+ }
+ } else if (pathbuf) {
+ if (start == 0) {
+ rr = pathbuf;
+ start++;
+ } else {
+ break;
+ }
+ } else {
+ break;
+ }
+ for (; (rr = strchr(rr, '<')) ; rr += len) { /* Each route entry */
+ ++rr;
+ len = strcspn(rr, ">") + 1;
+ /* Make a struct route */
+ if ((thishop = ast_malloc(sizeof(*thishop) + len))) {
+ /* ast_calloc is not needed because all fields are initialized in this block */
+ ast_copy_string(thishop->hop, rr, len);
+ ast_debug(2, "build_path: Path hop: <%s>\n", thishop->hop);
+ /* Link in */
+ thishop->next = NULL;
+ /* Link in at the end */
+ if (tail) {
+ tail->next = thishop;
+ } else {
+ head = thishop;
+ }
+ tail = thishop;
+ }
+ }
+ }
+
+ /* Store as new route */
+ peer->path = head;
+
+ /* For debugging dump what we ended up with */
+ if (p && sip_debug_test_pvt(p)) {
+ list_route(peer->path);
}
}
@@ -19785,6 +19946,20 @@
ast_cli(fd, " Ign SDP ver : %s\n", AST_CLI_YESNO(ast_test_flag(&peer->flags[1], SIP_PAGE2_IGNORESDPVERSION)));
ast_cli(fd, " Trust RPID : %s\n", AST_CLI_YESNO(ast_test_flag(&peer->flags[0], SIP_TRUSTRPID)));
ast_cli(fd, " Send RPID : %s\n", AST_CLI_YESNO(ast_test_flag(&peer->flags[0], SIP_SENDRPID)));
+ ast_cli(fd, " Path support : %s\n", AST_CLI_YESNO(ast_test_flag(&peer->flags[0], SIP_USEPATH)));
+ ast_cli(fd, " Path : ");
+ if (!peer->path) {
+ ast_cli(fd, "N/A\n");
+ } else {
+ struct sip_route *r=peer->path;
+ int first = 1;
+ while (r) {
+ ast_cli(fd, "%s<%s>", first ? "" : ", ", r->hop);
+ first = 0;
+ r=r->next;
+ }
+ ast_cli(fd, "\n");
+ }
ast_cli(fd, " Subscriptions: %s\n", AST_CLI_YESNO(ast_test_flag(&peer->flags[1], SIP_PAGE2_ALLOWSUBSCRIBE)));
ast_cli(fd, " Overlap dial : %s\n", allowoverlap2str(ast_test_flag(&peer->flags[1], SIP_PAGE2_ALLOWOVERLAP)));
if (peer->outboundproxy)
@@ -20375,6 +20550,7 @@
ast_cli(a->fd, " Allow promisc. redir: %s\n", AST_CLI_YESNO(ast_test_flag(&global_flags[0], SIP_PROMISCREDIR)));
ast_cli(a->fd, " Enable call counters: %s\n", AST_CLI_YESNO(global_callcounter));
ast_cli(a->fd, " SIP domain support: %s\n", AST_CLI_YESNO(!AST_LIST_EMPTY(&domain_list)));
+ ast_cli(a->fd, " Path support : %s\n", AST_CLI_YESNO(ast_test_flag(&global_flags[0], SIP_USEPATH)));
ast_cli(a->fd, " Realm. auth: %s\n", AST_CLI_YESNO(credentials != NULL));
if (credentials) {
struct sip_auth *auth;
@@ -20548,6 +20724,7 @@
ast_cli(a->fd, " Update: %s\n", AST_CLI_YESNO(sip_cfg.peer_rtupdate));
ast_cli(a->fd, " Ignore Reg. Expire: %s\n", AST_CLI_YESNO(sip_cfg.ignore_regexpire));
ast_cli(a->fd, " Save sys. name: %s\n", AST_CLI_YESNO(sip_cfg.rtsave_sysname));
+ ast_cli(a->fd, " Save path header: %s\n", AST_CLI_YESNO(sip_cfg.rtsave_path));
ast_cli(a->fd, " Auto Clear: %d (%s)\n", sip_cfg.rtautoclear, ast_test_flag(&global_flags[1], SIP_PAGE2_RTAUTOCLEAR) ? "Enabled" : "Disabled");
}
ast_cli(a->fd, "\n----\n");
@@ -29249,6 +29426,7 @@
ast_copy_flags(&p->flags[0], &peer->flags[0], SIP_FLAGS_TO_COPY);
ast_copy_flags(&p->flags[1], &peer->flags[1], SIP_PAGE2_FLAGS_TO_COPY);
ast_copy_flags(&p->flags[2], &peer->flags[2], SIP_PAGE3_FLAGS_TO_COPY);
+ copy_route(&p->route, peer->path);
/* Send OPTIONs to peer's fullcontact */
if (!ast_strlen_zero(peer->fullcontact)) {
@@ -29703,6 +29881,9 @@
if (!strcasecmp(v->name, "trustrpid")) {
ast_set_flag(&mask[0], SIP_TRUSTRPID);
ast_set2_flag(&flags[0], ast_true(v->value), SIP_TRUSTRPID);
+ } else if (!strcasecmp(v->name, "supportpath")) {
+ ast_set_flag(&mask[0], SIP_USEPATH);
+ ast_set2_flag(&flags[0], ast_true(v->value), SIP_USEPATH);
} else if (!strcasecmp(v->name, "sendrpid")) {
ast_set_flag(&mask[0], SIP_SENDRPID);
if (!strcasecmp(v->value, "pai")) {
@@ -31282,6 +31463,8 @@
ast_set2_flag(&global_flags[1], ast_true(v->value), SIP_PAGE2_RTCACHEFRIENDS);
} else if (!strcasecmp(v->name, "rtsavesysname")) {
sip_cfg.rtsave_sysname = ast_true(v->value);
+ } else if (!strcasecmp(v->name, "rtsavepath")) {
+ sip_cfg.rtsave_path = ast_true(v->value);
} else if (!strcasecmp(v->name, "rtupdate")) {
sip_cfg.peer_rtupdate = ast_true(v->value);
} else if (!strcasecmp(v->name, "ignoreregexpire")) {
Modified: team/oej/oolong-path-support-11/channels/sip/include/sip.h
URL: http://svnview.digium.com/svn/asterisk/team/oej/oolong-path-support-11/channels/sip/include/sip.h?view=diff&rev=379605&r1=379604&r2=379605
==============================================================================
--- team/oej/oolong-path-support-11/channels/sip/include/sip.h (original)
+++ team/oej/oolong-path-support-11/channels/sip/include/sip.h Sun Jan 20 03:34:06 2013
@@ -294,6 +294,7 @@
#define SIP_PROG_INBAND_NO (1 << 25)
#define SIP_PROG_INBAND_YES (2 << 25)
+#define SIP_USEPATH (1 << 27) /*!< P: Trust and use incoming Path headers? */
#define SIP_SENDRPID (3 << 29) /*!< DP: Remote Party-ID Support */
#define SIP_SENDRPID_NO (0 << 29)
#define SIP_SENDRPID_PAI (1 << 29) /*!< Use "P-Asserted-Identity" for rpid */
@@ -304,7 +305,7 @@
#define SIP_FLAGS_TO_COPY \
(SIP_PROMISCREDIR | SIP_TRUSTRPID | SIP_SENDRPID | SIP_DTMF | SIP_REINVITE | \
SIP_PROG_INBAND | SIP_USECLIENTCODE | SIP_NAT_FORCE_RPORT | SIP_G726_NONSTANDARD | \
- SIP_USEREQPHONE | SIP_INSECURE)
+ SIP_USEREQPHONE | SIP_INSECURE | SIP_USEPATH)
/*@}*/
/*! \name SIPflags2
@@ -736,6 +737,7 @@
struct sip_settings {
int peer_rtupdate; /*!< G: Update database with registration data for peer? */
int rtsave_sysname; /*!< G: Save system name at registration? */
+ int rtsave_path; /*!< G: Save path header on registration */
int ignore_regexpire; /*!< G: Ignore expiration of peer */
int rtautoclear; /*!< Realtime ?? */
int directrtpsetup; /*!< Enable support for Direct RTP setup (no re-invites) */
@@ -1367,6 +1369,7 @@
int timer_t1; /*!< The maximum T1 value for the peer */
int timer_b; /*!< The maximum timer B (transaction timeouts) */
int fromdomainport; /*!< The From: domain port */
+ struct sip_route *path; /*!< Head of linked list of out-of-dialog outgoing routing steps (fm Path headers) */
/*XXX Seems like we suddenly have two flags with the same content. Why? To be continued... */
enum sip_peer_type type; /*!< Distinguish between "user" and "peer" types. This is used solely for CLI and manager commands */
Modified: team/oej/oolong-path-support-11/configs/sip.conf.sample
URL: http://svnview.digium.com/svn/asterisk/team/oej/oolong-path-support-11/configs/sip.conf.sample?view=diff&rev=379605&r1=379604&r2=379605
==============================================================================
--- team/oej/oolong-path-support-11/configs/sip.conf.sample (original)
+++ team/oej/oolong-path-support-11/configs/sip.conf.sample Sun Jan 20 03:34:06 2013
@@ -442,6 +442,14 @@
;outboundproxy=[2001:db8::1]:5062 ; IPv6 address literal with explicit port
; ; (could also be tcp,udp) - defining transports on the proxy line only
; ; applies for the global proxy, otherwise use the transport= option
+;supportpath=yes ; This activates parsing and handling of Path header as defined in RFC 3327. This enables
+ ; Asterisk to route outgoing out-of-dialog requests via a set of proxies by using a pre-loaded
+ ; route-set defined by the Path headers in the REGISTER request. NOTE: As this influences routing
+ ; of SIP requests make sure to not trust Path headers provided by the user's SIP client (the proxy
+ ; in front of Asterisk should remove existing user provided Path headers).
+ ; NOTE: when a peer has both a path and outboundproxy set, the path will be added to
+ ; Route: header but routing to next hop is done using the outboundproxy.
+
;matchexternaddrlocally = yes ; Only substitute the externaddr or externhost setting if it matches
; your localnet setting. Unless you have some sort of strange network
; setup you will not need to enable this.
Modified: team/oej/oolong-path-support-11/contrib/realtime/mysql/sippeers.sql
URL: http://svnview.digium.com/svn/asterisk/team/oej/oolong-path-support-11/contrib/realtime/mysql/sippeers.sql?view=diff&rev=379605&r1=379604&r2=379605
==============================================================================
--- team/oej/oolong-path-support-11/contrib/realtime/mysql/sippeers.sql (original)
+++ team/oej/oolong-path-support-11/contrib/realtime/mysql/sippeers.sql Sun Jan 20 03:34:06 2013
@@ -79,6 +79,7 @@
`callingpres` enum('allowed_not_screened','allowed_passed_screen','allowed_failed_screen','allowed','prohib_not_screened','prohib_passed_screen','prohib_failed_screen','prohib') DEFAULT NULL,
`mohinterpret` varchar(40) DEFAULT NULL,
`mohsuggest` varchar(40) DEFAULT NULL,
+ `path` varchar(256) DEFAULT NULL,
`parkinglot` varchar(40) DEFAULT NULL,
`hasvoicemail` enum('yes','no') DEFAULT NULL,
`subscribemwi` enum('yes','no') DEFAULT NULL,
Modified: team/oej/oolong-path-support-11/contrib/realtime/postgresql/realtime.sql
URL: http://svnview.digium.com/svn/asterisk/team/oej/oolong-path-support-11/contrib/realtime/postgresql/realtime.sql?view=diff&rev=379605&r1=379604&r2=379605
==============================================================================
--- team/oej/oolong-path-support-11/contrib/realtime/postgresql/realtime.sql (original)
+++ team/oej/oolong-path-support-11/contrib/realtime/postgresql/realtime.sql Sun Jan 20 03:34:06 2013
@@ -70,6 +70,7 @@
lastms integer DEFAULT 0 NOT NULL,
defaultuser character varying(80),
fullcontact character varying(80),
+path character varying(256),
regserver character varying(30),
useragent character varying(40),
callbackextension character varying(40)
More information about the asterisk-commits
mailing list