aboutsummaryrefslogtreecommitdiffstats
path: root/channels/sip
diff options
context:
space:
mode:
authormmichelson <mmichelson@f38db490-d61c-443f-a65b-d21fe96a405b>2010-07-08 22:08:07 +0000
committermmichelson <mmichelson@f38db490-d61c-443f-a65b-d21fe96a405b>2010-07-08 22:08:07 +0000
commitc3c2e5edfd715b3a99aac1567623a0b1b7d49de0 (patch)
treec05335b563c3f7cb9a3edbf3e101d8e1b80e0be4 /channels/sip
parentaf344f1a5be5b43f1d10b95ea6e57ebfa761cf50 (diff)
Add IPv6 to Asterisk.
This adds a generic API for accommodating IPv6 and IPv4 addresses within Asterisk. While many files have been updated to make use of the API, chan_sip and the RTP code are the files which actually support IPv6 addresses at the time of this commit. The way has been paved for easier upgrading for other files in the near future, though. Big thanks go to Simon Perrault, Marc Blanchet, and Jean-Philippe Dionne for their hard work on this. (closes issue #17565) Reported by: russell Patches: asteriskv6-test-report.pdf uploaded by russell (license 2) Review: https://reviewboard.asterisk.org/r/743 git-svn-id: http://svn.digium.com/svn/asterisk/trunk@274783 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels/sip')
-rw-r--r--channels/sip/dialplan_functions.c31
-rw-r--r--channels/sip/include/dialog.h2
-rw-r--r--channels/sip/include/globals.h2
-rw-r--r--channels/sip/include/reqresp_parser.h14
-rw-r--r--channels/sip/include/sip.h27
-rw-r--r--channels/sip/reqresp_parser.c244
6 files changed, 149 insertions, 171 deletions
diff --git a/channels/sip/dialplan_functions.c b/channels/sip/dialplan_functions.c
index d09627ed8..6e1f65b84 100644
--- a/channels/sip/dialplan_functions.c
+++ b/channels/sip/dialplan_functions.c
@@ -62,9 +62,9 @@ int sip_acf_channel_read(struct ast_channel *chan, const char *funcname, char *p
}
if (!strcasecmp(args.param, "peerip")) {
- ast_copy_string(buf, p->sa.sin_addr.s_addr ? ast_inet_ntoa(p->sa.sin_addr) : "", buflen);
+ ast_copy_string(buf, ast_sockaddr_isnull(&p->sa) ? "" : ast_sockaddr_stringify_addr(&p->sa), buflen);
} else if (!strcasecmp(args.param, "recvip")) {
- ast_copy_string(buf, p->recv.sin_addr.s_addr ? ast_inet_ntoa(p->recv.sin_addr) : "", buflen);
+ ast_copy_string(buf, ast_sockaddr_isnull(&p->recv) ? "" : ast_sockaddr_stringify_addr(&p->recv), buflen);
} else if (!strcasecmp(args.param, "from")) {
ast_copy_string(buf, p->from, buflen);
} else if (!strcasecmp(args.param, "uri")) {
@@ -76,7 +76,7 @@ int sip_acf_channel_read(struct ast_channel *chan, const char *funcname, char *p
} else if (!strcasecmp(args.param, "t38passthrough")) {
ast_copy_string(buf, (p->t38.state == T38_DISABLED) ? "0" : "1", buflen);
} else if (!strcasecmp(args.param, "rtpdest")) {
- struct sockaddr_in sin;
+ struct ast_sockaddr addr;
struct ast_rtp_instance *stream;
if (ast_strlen_zero(args.type))
@@ -96,10 +96,10 @@ int sip_acf_channel_read(struct ast_channel *chan, const char *funcname, char *p
return 0;
}
- ast_rtp_instance_get_remote_address(stream, &sin);
- snprintf(buf, buflen, "%s:%d", ast_inet_ntoa(sin.sin_addr), ntohs(sin.sin_port));
+ ast_rtp_instance_get_remote_address(stream, &addr);
+ snprintf(buf, buflen, "%s", ast_sockaddr_stringify(&addr));
} else if (!strcasecmp(args.param, "rtpsource")) {
- struct sockaddr_in sin;
+ struct ast_sockaddr sa;
struct ast_rtp_instance *stream;
if (ast_strlen_zero(args.type))
@@ -119,15 +119,15 @@ int sip_acf_channel_read(struct ast_channel *chan, const char *funcname, char *p
return 0;
}
- ast_rtp_instance_get_local_address(stream, &sin);
+ ast_rtp_instance_get_local_address(stream, &sa);
- if (!sin.sin_addr.s_addr) {
- struct sockaddr_in dest_sin;
- ast_rtp_instance_get_remote_address(stream, &dest_sin);
- ast_ouraddrfor(&dest_sin.sin_addr, &sin.sin_addr);
+ if (ast_sockaddr_isnull(&sa)) {
+ struct ast_sockaddr dest_sa;
+ ast_rtp_instance_get_remote_address(stream, &dest_sa);
+ ast_ouraddrfor(&dest_sa, &sa);
}
- snprintf(buf, buflen, "%s:%d", ast_inet_ntoa(sin.sin_addr), ntohs(sin.sin_port));
+ snprintf(buf, buflen, "%s", ast_sockaddr_stringify(&sa));
} else if (!strcasecmp(args.param, "rtpqos")) {
struct ast_rtp_instance *rtp = NULL;
@@ -225,7 +225,7 @@ int sip_acf_channel_read(struct ast_channel *chan, const char *funcname, char *p
}
#ifdef TEST_FRAMEWORK
-static int test_sip_rtpqos_1_new(struct ast_rtp_instance *instance, struct sched_context *sched, struct sockaddr_in *sin, void *data)
+static int test_sip_rtpqos_1_new(struct ast_rtp_instance *instance, struct sched_context *sched, struct ast_sockaddr *addr, void *data)
{
/* Needed to pass sanity checks */
ast_rtp_instance_set_data(instance, data);
@@ -268,7 +268,7 @@ AST_TEST_DEFINE(test_sip_rtpqos_1)
.write = test_sip_rtpqos_1_write,
.get_stat = test_sip_rtpqos_1_get_stat,
};
- struct sockaddr_in sin = { .sin_port = 31337, .sin_addr = { .s_addr = 4 * 16777216 + 3 * 65536 + 2 * 256 + 1 } };
+ struct ast_sockaddr sa = { {0, } };
struct ast_rtp_instance_stats mine = { 0, };
struct sip_pvt *p = NULL;
struct ast_channel *chan = NULL;
@@ -331,11 +331,12 @@ AST_TEST_DEFINE(test_sip_rtpqos_1)
res = AST_TEST_NOT_RUN;
goto done;
}
+
if (!(p->rtp = ast_rtp_instance_new("test", sched, &bindaddr, &mine))) {
res = AST_TEST_NOT_RUN;
goto done;
}
- ast_rtp_instance_set_remote_address(p->rtp, &sin);
+ ast_rtp_instance_set_remote_address(p->rtp, &sa);
if (!(chan = ast_dummy_channel_alloc())) {
res = AST_TEST_NOT_RUN;
goto done;
diff --git a/channels/sip/include/dialog.h b/channels/sip/include/dialog.h
index 8972c02d9..ed31b7774 100644
--- a/channels/sip/include/dialog.h
+++ b/channels/sip/include/dialog.h
@@ -34,7 +34,7 @@
struct sip_pvt *dialog_ref_debug(struct sip_pvt *p, char *tag, char *file, int line, const char *func);
struct sip_pvt *dialog_unref_debug(struct sip_pvt *p, char *tag, char *file, int line, const char *func);
-struct sip_pvt *sip_alloc(ast_string_field callid, struct sockaddr_in *sin,
+struct sip_pvt *sip_alloc(ast_string_field callid, struct ast_sockaddr *sin,
int useglobal_nat, const int intended_method, struct sip_request *req);
void sip_scheddestroy_final(struct sip_pvt *p, int ms);
void sip_scheddestroy(struct sip_pvt *p, int ms);
diff --git a/channels/sip/include/globals.h b/channels/sip/include/globals.h
index 0d7131d87..414d2189b 100644
--- a/channels/sip/include/globals.h
+++ b/channels/sip/include/globals.h
@@ -24,7 +24,7 @@
#ifndef _SIP_GLOBALS_H
#define _SIP_GLOBALS_H
-extern struct sockaddr_in bindaddr; /*!< UDP: The address we bind to */
+extern struct ast_sockaddr bindaddr; /*!< UDP: The address we bind to */
extern struct sched_context *sched; /*!< The scheduling context */
/*! \brief Definition of this channel for PBX channel registration */
diff --git a/channels/sip/include/reqresp_parser.h b/channels/sip/include/reqresp_parser.h
index 58784a621..d8631c982 100644
--- a/channels/sip/include/reqresp_parser.h
+++ b/channels/sip/include/reqresp_parser.h
@@ -28,7 +28,7 @@
* \note
* - Multiple scheme's can be specified ',' delimited. ex: "sip:,sips:"
* - If a component is not requested, do not split around it. This means
- * that if we don't have domain, we cannot split name:pass and domain:port.
+ * that if we don't have domain, we cannot split name:pass.
* - It is safe to call with ret_name, pass, domain, port pointing all to
* the same place.
* - If no secret parameter is provided, ret_name will return with both parts, user:secret
@@ -42,7 +42,8 @@
* general form we are expecting is sip:user:password;user-parameters@host:port;uri-parameters?headers
* \endverbatim
*/
-int parse_uri(char *uri, const char *scheme, char **ret_name, char **pass, char **domain, char **port, char **transport);
+int parse_uri(char *uri, const char *scheme, char **ret_name, char **pass,
+ char **domain, char **transport);
/*!
* \brief parses a URI in to all of its components and any trailing residue
@@ -51,7 +52,9 @@ int parse_uri(char *uri, const char *scheme, char **ret_name, char **pass, char
* \retval -1 on error.
*
*/
-int parse_uri_full(char *uri, const char *scheme, char **user, char **pass, char **host, char **port, struct uriparams *params, char **headers, char **residue);
+int parse_uri_full(char *uri, const char *scheme, char **user, char **pass,
+ char **domain, struct uriparams *params, char **headers,
+ char **residue);
/*!
* \brief Get caller id name from SIP headers, copy into output buffer
@@ -100,7 +103,10 @@ int get_in_brackets_full(char *tmp, char **out, char **residue);
* \retval 0 success
* \retval -1 failure
*/
-int parse_name_andor_addr(char *uri, const char *scheme, char **name, char **user, char **pass, char **host, char **port, struct uriparams *params, char **headers, char **remander);
+int parse_name_andor_addr(char *uri, const char *scheme, char **name,
+ char **user, char **pass, char **domain,
+ struct uriparams *params, char **headers,
+ char **remander);
/*! \brief Parse all contact header contacts
* \retval 0 success
diff --git a/channels/sip/include/sip.h b/channels/sip/include/sip.h
index 13527517f..92fa68e82 100644
--- a/channels/sip/include/sip.h
+++ b/channels/sip/include/sip.h
@@ -646,7 +646,8 @@ enum sip_tcptls_alert {
*/
struct sip_proxy {
char name[MAXHOSTNAMELEN]; /*!< DNS name of domain/host or IP */
- struct sockaddr_in ip; /*!< Currently used IP address and port */
+ struct ast_sockaddr ip; /*!< Currently used IP address and port */
+ int port;
time_t last_dnsupdate; /*!< When this was resolved */
enum sip_transport transport;
int force; /*!< If it's an outbound proxy, Force use of this outbound proxy for all outbound requests */
@@ -702,6 +703,7 @@ struct sip_settings {
char default_subscribecontext[AST_MAX_CONTEXT];
struct ast_ha *contact_ha; /*! \brief Global list of addresses dynamic peers are not allowed to use */
format_t capability; /*!< Supported codecs */
+ int tcp_enabled;
};
/*! \brief The SIP socket definition */
@@ -1008,16 +1010,16 @@ struct sip_pvt {
long invite_branch; /*!< The branch used when we sent the initial INVITE */
int64_t sessionversion_remote; /*!< Remote UA's SDP Session Version */
unsigned int portinuri:1; /*!< Non zero if a port has been specified, will also disable srv lookups */
- struct sockaddr_in sa; /*!< Our peer */
- struct sockaddr_in redirip; /*!< Where our RTP should be going if not to us */
- struct sockaddr_in vredirip; /*!< Where our Video RTP should be going if not to us */
- struct sockaddr_in tredirip; /*!< Where our Text RTP should be going if not to us */
+ struct ast_sockaddr sa; /*!< Our peer */
+ struct ast_sockaddr redirip; /*!< Where our RTP should be going if not to us */
+ struct ast_sockaddr vredirip; /*!< Where our Video RTP should be going if not to us */
+ struct ast_sockaddr tredirip; /*!< Where our Text RTP should be going if not to us */
time_t lastrtprx; /*!< Last RTP received */
time_t lastrtptx; /*!< Last RTP sent */
int rtptimeout; /*!< RTP timeout time */
struct ast_ha *directmediaha; /*!< Which IPs are allowed to interchange direct media with this peer - copied from sip_peer */
- struct sockaddr_in recv; /*!< Received as */
- struct sockaddr_in ourip; /*!< Our IP (as seen from the outside) */
+ struct ast_sockaddr recv; /*!< Received as */
+ struct ast_sockaddr ourip; /*!< Our IP (as seen from the outside) */
enum transfermodes allowtransfer; /*!< REFER: restriction scheme */
struct ast_channel *owner; /*!< Who owns us (if we have an owner) */
struct sip_route *route; /*!< Head of linked list of routing steps (fm Record-Route) */
@@ -1209,7 +1211,7 @@ struct sip_peer {
ast_group_t pickupgroup; /*!< Pickup group */
struct sip_proxy *outboundproxy;/*!< Outbound proxy for this peer */
struct ast_dnsmgr_entry *dnsmgr;/*!< DNS refresh manager for peer */
- struct sockaddr_in addr; /*!< IP address of peer */
+ struct ast_sockaddr addr; /*!< IP address of peer */
unsigned int portinuri:1; /*!< Whether the port should be included in the URI */
struct sip_pvt *call; /*!< Call pointer */
int pokeexpire; /*!< Qualification: When to expire poke (qualify= checking) */
@@ -1217,7 +1219,7 @@ struct sip_peer {
int maxms; /*!< Qualification: Max ms we will accept for the host to be up, 0 to not monitor */
int qualifyfreq; /*!< Qualification: Qualification: How often to check for the host to be up */
struct timeval ps; /*!< Qualification: Time for sending SIP OPTION in sip_pke_peer() */
- struct sockaddr_in defaddr; /*!< Default IP address, used until registration */
+ struct ast_sockaddr defaddr; /*!< Default IP address, used until registration */
struct ast_ha *ha; /*!< Access control list */
struct ast_ha *contactha; /*!< Restrict what IPs are allowed in the Contact header (for registration) */
struct ast_ha *directmediaha; /*!< Restrict what IPs are allowed to interchange direct media with */
@@ -1281,7 +1283,7 @@ struct sip_registry {
int callid_valid; /*!< 0 means we haven't chosen callid for this registry yet. */
unsigned int ocseq; /*!< Sequence number we got to for REGISTERs for this registry */
struct ast_dnsmgr_entry *dnsmgr; /*!< DNS refresh manager for register */
- struct sockaddr_in us; /*!< Who the server thinks we are */
+ struct ast_sockaddr us; /*!< Who the server thinks we are */
int noncecount; /*!< Nonce-count */
char lastmsg[256]; /*!< Last Message sent/received */
};
@@ -1321,7 +1323,7 @@ struct sip_subscription_mwi {
unsigned int subscribed:1; /*!< Whether we are currently subscribed or not */
struct sip_pvt *call; /*!< Outbound subscription dialog */
struct ast_dnsmgr_entry *dnsmgr; /*!< DNS refresh manager for subscription */
- struct sockaddr_in us; /*!< Who the server thinks we are */
+ struct ast_sockaddr us; /*!< Who the server thinks we are */
};
/*!
@@ -1697,8 +1699,7 @@ struct contact {
char *name;
char *user;
char *pass;
- char *host;
- char *port;
+ char *domain;
struct uriparams params;
char *headers;
char *expires;
diff --git a/channels/sip/reqresp_parser.c b/channels/sip/reqresp_parser.c
index bf35bc226..59cefaa46 100644
--- a/channels/sip/reqresp_parser.c
+++ b/channels/sip/reqresp_parser.c
@@ -28,7 +28,9 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#include "include/reqresp_parser.h"
/*! \brief * parses a URI in its components.*/
-int parse_uri_full(char *uri, const char *scheme, char **user, char **pass, char **host, char **port, struct uriparams *params, char **headers, char **residue)
+int parse_uri_full(char *uri, const char *scheme, char **user, char **pass,
+ char **domain, struct uriparams *params, char **headers,
+ char **residue)
{
char *userinfo = NULL;
char *parameters = NULL;
@@ -58,31 +60,24 @@ int parse_uri_full(char *uri, const char *scheme, char **user, char **pass, char
}
}
- if (!host) {
- /* if we don't want to split around host, keep everything as a userinfo - cos thats how old parse_uri operated*/
+ if (!domain) {
+ /* if we don't want to split around domain, keep everything as a
+ * userinfo - cos thats how old parse_uri operated*/
userinfo = uri;
} else {
- char *hostport;
+ char *dom = "";
if ((c = strchr(uri, '@'))) {
*c++ = '\0';
- hostport = c;
+ dom = c;
userinfo = uri;
- uri = hostport; /* userinfo can contain ? and ; chars so step forward before looking for params and headers */
+ uri = c; /* userinfo can contain ? and ; chars so step forward before looking for params and headers */
} else {
/* domain-only URI, according to the SIP RFC. */
- hostport = uri;
+ dom = uri;
userinfo = "";
}
- if (port && (c = strchr(hostport, ':'))) { /* Remove :port */
- *c++ = '\0';
- *port = c;
- uri = c;
- } else if (port) {
- *port = "";
- }
-
- *host = hostport;
+ *domain = dom;
}
if (pass && (c = strchr(userinfo, ':'))) { /* user:password */
@@ -201,7 +196,7 @@ AST_TEST_DEFINE(sip_parse_uri_fully_test)
{
int res = AST_TEST_PASS;
char uri[1024];
- char *user, *pass, *host, *port, *headers, *residue;
+ char *user, *pass, *domain, *headers, *residue;
struct uriparams params;
struct testdata {
@@ -209,15 +204,13 @@ AST_TEST_DEFINE(sip_parse_uri_fully_test)
char *uri;
char **userptr;
char **passptr;
- char **hostptr;
- char **portptr;
+ char **domainptr;
char **headersptr;
char **residueptr;
struct uriparams *paramsptr;
char *user;
char *pass;
- char *host;
- char *port;
+ char *domain;
char *headers;
char *residue;
struct uriparams params;
@@ -234,17 +227,15 @@ AST_TEST_DEFINE(sip_parse_uri_fully_test)
.uri = "sip:user:secret@host:5060;param=discard;transport=tcp;param2=residue",
.userptr = &user,
.passptr = &pass,
- .hostptr = &host,
- .portptr = &port,
+ .domainptr = &domain,
.headersptr = &headers,
.residueptr = &residue,
.paramsptr = &params,
.user = "user",
.pass = "secret",
- .host = "host",
- .port = "5060",
+ .domain = "host:5060",
.headers = "",
- .residue = "param2=residue",
+ .residue = "param2=residue",
.params.transport = "tcp",
.params.lr = 0,
.params.user = ""
@@ -255,15 +246,13 @@ AST_TEST_DEFINE(sip_parse_uri_fully_test)
.uri = "sip:user:secret@host:5060;param=discard;transport=tcp;param2=discard2?header=blah&header2=blah2;param3=residue",
.userptr = &user,
.passptr = &pass,
- .hostptr = &host,
- .portptr = &port,
+ .domainptr = &domain,
.headersptr = &headers,
.residueptr = &residue,
.paramsptr = &params,
.user = "user",
.pass = "secret",
- .host = "host",
- .port = "5060",
+ .domain = "host:5060",
.headers = "header=blah&header2=blah2",
.residue = "param3=residue",
.params.transport = "tcp",
@@ -276,15 +265,13 @@ AST_TEST_DEFINE(sip_parse_uri_fully_test)
.uri = "sip:-_.!~*'()&=+$,;?/:secret@host:5060;transport=tcp",
.userptr = &user,
.passptr = &pass,
- .hostptr = &host,
- .portptr = &port,
+ .domainptr = &domain,
.headersptr = &headers,
.residueptr = &residue,
.paramsptr = &params,
.user = "-_.!~*'()&=+$,;?/",
.pass = "secret",
- .host = "host",
- .port = "5060",
+ .domain = "host:5060",
.headers = "",
.residue = "",
.params.transport = "tcp",
@@ -297,15 +284,13 @@ AST_TEST_DEFINE(sip_parse_uri_fully_test)
.uri = "sip:user:-_.!~*'()&=+$,@host:5060;transport=tcp",
.userptr = &user,
.passptr = &pass,
- .hostptr = &host,
- .portptr = &port,
+ .domainptr = &domain,
.headersptr = &headers,
.residueptr = &residue,
.paramsptr = &params,
.user = "user",
.pass = "-_.!~*'()&=+$,",
- .host = "host",
- .port = "5060",
+ .domain = "host:5060",
.headers = "",
.residue = "",
.params.transport = "tcp",
@@ -318,15 +303,13 @@ AST_TEST_DEFINE(sip_parse_uri_fully_test)
.uri = "sip:user:secret@1-1.a-1.:5060;transport=tcp",
.userptr = &user,
.passptr = &pass,
- .hostptr = &host,
- .portptr = &port,
+ .domainptr = &domain,
.headersptr = &headers,
.residueptr = &residue,
.paramsptr = &params,
.user = "user",
.pass = "secret",
- .host = "1-1.a-1.",
- .port = "5060",
+ .domain = "1-1.a-1.:5060",
.headers = "",
.residue = "",
.params.transport = "tcp",
@@ -339,15 +322,13 @@ AST_TEST_DEFINE(sip_parse_uri_fully_test)
.uri = "sip:user:secret@host:5060;-_.!~*'()[]/:&+$=-_.!~*'()[]/:&+$;transport=tcp",
.userptr = &user,
.passptr = &pass,
- .hostptr = &host,
- .portptr = &port,
+ .domainptr = &domain,
.headersptr = &headers,
.residueptr = &residue,
.paramsptr = &params,
.user = "user",
.pass = "secret",
- .host = "host",
- .port = "5060",
+ .domain = "host:5060",
.headers = "",
.residue = "",
.params.transport = "tcp",
@@ -360,15 +341,13 @@ AST_TEST_DEFINE(sip_parse_uri_fully_test)
.uri = "sip:user:secret@host:5060;-_.!~*'()[]/:&+$=-_.!~*'()[]/:&+$?header=blah&header2=blah2;-_.!~*'()[]/:&+$=residue",
.userptr = &user,
.passptr = &pass,
- .hostptr = &host,
- .portptr = &port,
+ .domainptr = &domain,
.headersptr = &headers,
.residueptr = &residue,
.paramsptr = &params,
.user = "user",
.pass = "secret",
- .host = "host",
- .port = "5060",
+ .domain = "host:5060",
.headers = "header=blah&header2=blah2",
.residue = "-_.!~*'()[]/:&+$=residue",
.params.transport = "",
@@ -381,15 +360,13 @@ AST_TEST_DEFINE(sip_parse_uri_fully_test)
.uri = "sip:user:secret@host:5060;param=discard;lr?header=blah",
.userptr = &user,
.passptr = &pass,
- .hostptr = &host,
- .portptr = &port,
+ .domainptr = &domain,
.headersptr = &headers,
.residueptr = &residue,
.paramsptr = &params,
.user = "user",
.pass = "secret",
- .host = "host",
- .port = "5060",
+ .domain = "host:5060",
.headers = "header=blah",
.residue = "",
.params.transport = "",
@@ -402,15 +379,13 @@ AST_TEST_DEFINE(sip_parse_uri_fully_test)
.uri = "sip:user:secret@host:5060;param=discard;lr=yes?header=blah",
.userptr = &user,
.passptr = &pass,
- .hostptr = &host,
- .portptr = &port,
+ .domainptr = &domain,
.headersptr = &headers,
.residueptr = &residue,
.paramsptr = &params,
.user = "user",
.pass = "secret",
- .host = "host",
- .port = "5060",
+ .domain = "host:5060",
.headers = "header=blah",
.residue = "",
.params.transport = "",
@@ -423,15 +398,13 @@ AST_TEST_DEFINE(sip_parse_uri_fully_test)
.uri = "sip:user:secret@host:5060;paramlr=lr;lr=no;lr=off;lr=0;lr=;=lr;lrextra;lrparam2=lr?header=blah",
.userptr = &user,
.passptr = &pass,
- .hostptr = &host,
- .portptr = &port,
+ .domainptr = &domain,
.headersptr = &headers,
.residueptr = &residue,
.paramsptr = &params,
.user = "user",
.pass = "secret",
- .host = "host",
- .port = "5060",
+ .domain = "host:5060",
.headers = "header=blah",
.residue = "",
.params.transport = "",
@@ -466,16 +439,19 @@ AST_TEST_DEFINE(sip_parse_uri_fully_test)
}
AST_LIST_TRAVERSE(&testdatalist, testdataptr, list) {
- user = pass = host = port = headers = residue = NULL;
+ user = pass = domain = headers = residue = NULL;
params.transport = params.user = params.method = params.ttl = params.maddr = NULL;
params.lr = 0;
ast_copy_string(uri,testdataptr->uri,sizeof(uri));
- if (parse_uri_full(uri, "sip:,sips:", testdataptr->userptr, testdataptr->passptr, testdataptr->hostptr, testdataptr->portptr, testdataptr->paramsptr, testdataptr->headersptr, testdataptr->residueptr) ||
+ if (parse_uri_full(uri, "sip:,sips:", testdataptr->userptr,
+ testdataptr->passptr, testdataptr->domainptr,
+ testdataptr->paramsptr,
+ testdataptr->headersptr,
+ testdataptr->residueptr) ||
((testdataptr->userptr) && strcmp(testdataptr->user, user)) ||
((testdataptr->passptr) && strcmp(testdataptr->pass, pass)) ||
- ((testdataptr->hostptr) && strcmp(testdataptr->host, host)) ||
- ((testdataptr->portptr) && strcmp(testdataptr->port, port)) ||
+ ((testdataptr->domainptr) && strcmp(testdataptr->domain, domain)) ||
((testdataptr->headersptr) && strcmp(testdataptr->headers, headers)) ||
((testdataptr->residueptr) && strcmp(testdataptr->residue, residue)) ||
((testdataptr->paramsptr) && strcmp(testdataptr->params.transport,params.transport)) ||
@@ -492,13 +468,14 @@ AST_TEST_DEFINE(sip_parse_uri_fully_test)
}
-int parse_uri(char *uri, const char *scheme, char **user, char **pass, char **host, char **port, char **transport) {
+int parse_uri(char *uri, const char *scheme, char **user, char **pass,
+ char **domain, char **transport) {
int ret;
char *headers;
struct uriparams params;
headers = NULL;
- ret = parse_uri_full(uri, scheme, user, pass, host, port, &params, &headers, NULL);
+ ret = parse_uri_full(uri, scheme, user, pass, domain, &params, &headers, NULL);
if (transport) {
*transport=params.transport;
}
@@ -508,7 +485,7 @@ int parse_uri(char *uri, const char *scheme, char **user, char **pass, char **ho
AST_TEST_DEFINE(sip_parse_uri_test)
{
int res = AST_TEST_PASS;
- char *name, *pass, *domain, *port, *transport;
+ char *name, *pass, *domain, *transport;
char uri1[] = "sip:name@host";
char uri2[] = "sip:name@host;transport=tcp";
char uri3[] = "sip:name:secret@host;transport=tcp";
@@ -535,70 +512,66 @@ AST_TEST_DEFINE(sip_parse_uri_test)
}
/* Test 1, simple URI */
- name = pass = domain = port = transport = NULL;
- if (parse_uri(uri1, "sip:,sips:", &name, &pass, &domain, &port, &transport) ||
+ name = pass = domain = transport = NULL;
+ if (parse_uri(uri1, "sip:,sips:", &name, &pass, &domain, &transport) ||
strcmp(name, "name") ||
!ast_strlen_zero(pass) ||
strcmp(domain, "host") ||
- !ast_strlen_zero(port) ||
!ast_strlen_zero(transport)) {
ast_test_status_update(test, "Test 1: simple uri failed. \n");
res = AST_TEST_FAIL;
}
/* Test 2, add tcp transport */
- name = pass = domain = port = transport = NULL;
- if (parse_uri(uri2, "sip:,sips:", &name, &pass, &domain, &port, &transport) ||
+ name = pass = domain = transport = NULL;
+ if (parse_uri(uri2, "sip:,sips:", &name, &pass, &domain, &transport) ||
strcmp(name, "name") ||
!ast_strlen_zero(pass) ||
strcmp(domain, "host") ||
- !ast_strlen_zero(port) ||
strcmp(transport, "tcp")) {
ast_test_status_update(test, "Test 2: uri with addtion of tcp transport failed. \n");
res = AST_TEST_FAIL;
}
/* Test 3, add secret */
- name = pass = domain = port = transport = NULL;
- if (parse_uri(uri3, "sip:,sips:", &name, &pass, &domain, &port, &transport) ||
+ name = pass = domain = transport = NULL;
+ if (parse_uri(uri3, "sip:,sips:", &name, &pass, &domain, &transport) ||
strcmp(name, "name") ||
strcmp(pass, "secret") ||
strcmp(domain, "host") ||
- !ast_strlen_zero(port) ||
strcmp(transport, "tcp")) {
ast_test_status_update(test, "Test 3: uri with addition of secret failed.\n");
res = AST_TEST_FAIL;
}
/* Test 4, add port and unparsed header field*/
- name = pass = domain = port = transport = NULL;
- if (parse_uri(uri4, "sip:,sips:", &name, &pass, &domain, &port, &transport) ||
+ name = pass = domain = transport = NULL;
+ if (parse_uri(uri4, "sip:,sips:", &name, &pass, &domain, &transport) ||
strcmp(name, "name") ||
strcmp(pass, "secret") ||
- strcmp(domain, "host") ||
- strcmp(port, "port") ||
+ strcmp(domain, "host:port") ||
strcmp(transport, "tcp")) {
ast_test_status_update(test, "Test 4: add port and unparsed header field failed.\n");
res = AST_TEST_FAIL;
}
/* Test 5, verify parse_uri does not crash when given a NULL uri */
- name = pass = domain = port = transport = NULL;
- if (!parse_uri(NULL, "sip:,sips:", &name, &pass, &domain, &port, &transport)) {
+ name = pass = domain = transport = NULL;
+ if (!parse_uri(NULL, "sip:,sips:", &name, &pass, &domain, &transport)) {
ast_test_status_update(test, "Test 5: passing a NULL uri failed.\n");
res = AST_TEST_FAIL;
}
/* Test 6, verify parse_uri does not crash when given a NULL output parameters */
- name = pass = domain = port = transport = NULL;
- if (parse_uri(uri6, "sip:,sips:", NULL, NULL, NULL, NULL, NULL)) {
+ name = pass = domain = transport = NULL;
+ if (parse_uri(uri6, "sip:,sips:", NULL, NULL, NULL, NULL)) {
ast_test_status_update(test, "Test 6: passing NULL output parameters failed.\n");
res = AST_TEST_FAIL;
}
- /* Test 7, verify parse_uri returns user:secret and domain:port when no port or secret output parameters are supplied. */
- name = pass = domain = port = transport = NULL;
- if (parse_uri(uri7, "sip:,sips:", &name, NULL, &domain, NULL, NULL) ||
+ /* Test 7, verify parse_uri returns user:secret and domain when no port or secret output parameters are supplied. */
+ name = pass = domain = transport = NULL;
+ if (parse_uri(uri7, "sip:,sips:", &name, NULL, &domain, NULL) ||
strcmp(name, "name:secret") ||
strcmp(domain, "host:port")) {
@@ -607,8 +580,8 @@ AST_TEST_DEFINE(sip_parse_uri_test)
}
/* Test 8, verify parse_uri can handle a domain only uri */
- name = pass = domain = port = transport = NULL;
- if (parse_uri(uri8, "sip:,sips:", &name, &pass, &domain, &port, &transport) ||
+ name = pass = domain = transport = NULL;
+ if (parse_uri(uri8, "sip:,sips:", &name, &pass, &domain, &transport) ||
strcmp(domain, "host") ||
!ast_strlen_zero(name)) {
ast_test_status_update(test, "Test 8: add port and unparsed header field failed.\n");
@@ -616,12 +589,11 @@ AST_TEST_DEFINE(sip_parse_uri_test)
}
/* Test 9, add port and unparsed header field with domain only uri*/
- name = pass = domain = port = transport = NULL;
- if (parse_uri(uri9, "sip:,sips:", &name, &pass, &domain, &port, &transport) ||
+ name = pass = domain = transport = NULL;
+ if (parse_uri(uri9, "sip:,sips:", &name, &pass, &domain, &transport) ||
!ast_strlen_zero(name) ||
!ast_strlen_zero(pass) ||
strcmp(domain, "host") ||
- strcmp(port, "port") ||
strcmp(transport, "tcp")) {
ast_test_status_update(test, "Test 9: domain only uri failed \n");
res = AST_TEST_FAIL;
@@ -630,12 +602,11 @@ AST_TEST_DEFINE(sip_parse_uri_test)
/* Test 10, handle invalid/missing "sip:,sips:" scheme
* we expect parse_uri to return an error, but still parse
* the results correctly here */
- name = pass = domain = port = transport = NULL;
- if (!parse_uri(uri10, "sip:,sips:", &name, &pass, &domain, &port, &transport) ||
+ name = pass = domain = transport = NULL;
+ if (!parse_uri(uri10, "sip:,sips:", &name, &pass, &domain, &transport) ||
!ast_strlen_zero(name) ||
!ast_strlen_zero(pass) ||
strcmp(domain, "host") ||
- strcmp(port, "port") ||
strcmp(transport, "tcp")) {
ast_test_status_update(test, "Test 10: missing \"sip:sips:\" scheme failed\n");
res = AST_TEST_FAIL;
@@ -644,12 +615,11 @@ AST_TEST_DEFINE(sip_parse_uri_test)
/* Test 11, simple domain only URI with missing scheme
* we expect parse_uri to return an error, but still parse
* the results correctly here */
- name = pass = domain = port = transport = NULL;
- if (!parse_uri(uri11, "sip:,sips:", &name, &pass, &domain, &port, &transport) ||
+ name = pass = domain = transport = NULL;
+ if (!parse_uri(uri11, "sip:,sips:", &name, &pass, &domain, &transport) ||
!ast_strlen_zero(name) ||
!ast_strlen_zero(pass) ||
strcmp(domain, "host") ||
- !ast_strlen_zero(port) ||
!ast_strlen_zero(transport)) {
ast_test_status_update(test, "Test 11: simple uri with missing scheme failed. \n");
res = AST_TEST_FAIL;
@@ -871,7 +841,7 @@ int get_name_and_number(const char *hdr, char **name, char **number)
tmp_number = get_in_brackets(header);
/* parse out the number here */
- if (parse_uri(tmp_number, "sip:,sips:", &tmp_number, &dummy, &domain, &dummy, NULL) || ast_strlen_zero(tmp_number)) {
+ if (parse_uri(tmp_number, "sip:,sips:", &tmp_number, &dummy, &domain, NULL) || ast_strlen_zero(tmp_number)) {
ast_log(LOG_ERROR, "can not parse name and number from sip header.\n");
return -1;
}
@@ -1149,7 +1119,10 @@ AST_TEST_DEFINE(get_in_brackets_test)
}
-int parse_name_andor_addr(char *uri, const char *scheme, char **name, char **user, char **pass, char **host, char **port, struct uriparams *params, char **headers, char **residue)
+int parse_name_andor_addr(char *uri, const char *scheme, char **name,
+ char **user, char **pass, char **domain,
+ struct uriparams *params, char **headers,
+ char **residue)
{
static char buf[1024];
char **residue2=residue;
@@ -1164,14 +1137,15 @@ int parse_name_andor_addr(char *uri, const char *scheme, char **name, char **use
residue2 = NULL;
}
- return parse_uri_full(uri, scheme, user, pass, host, port, params, headers, residue2);
+ return parse_uri_full(uri, scheme, user, pass, domain, params, headers,
+ residue2);
}
AST_TEST_DEFINE(parse_name_andor_addr_test)
{
int res = AST_TEST_PASS;
char uri[1024];
- char *name, *user, *pass, *host, *port, *headers, *residue;
+ char *name, *user, *pass, *domain, *headers, *residue;
struct uriparams params;
struct testdata {
@@ -1180,16 +1154,14 @@ AST_TEST_DEFINE(parse_name_andor_addr_test)
char **nameptr;
char **userptr;
char **passptr;
- char **hostptr;
- char **portptr;
+ char **domainptr;
char **headersptr;
char **residueptr;
struct uriparams *paramsptr;
char *name;
char *user;
char *pass;
- char *host;
- char *port;
+ char *domain;
char *headers;
char *residue;
struct uriparams params;
@@ -1206,16 +1178,14 @@ AST_TEST_DEFINE(parse_name_andor_addr_test)
.nameptr = &name,
.userptr = &user,
.passptr = &pass,
- .hostptr = &host,
- .portptr = &port,
+ .domainptr = &domain,
.headersptr = &headers,
.residueptr = &residue,
.paramsptr = &params,
.name = "name :@ ",
.user = "user",
.pass = "secret",
- .host = "host",
- .port = "5060",
+ .domain = "host:5060",
.headers = "",
.residue = "tag=tag",
.params.transport = "tcp",
@@ -1229,16 +1199,14 @@ AST_TEST_DEFINE(parse_name_andor_addr_test)
.nameptr = &name,
.userptr = &user,
.passptr = &pass,
- .hostptr = &host,
- .portptr = &port,
+ .domainptr = &domain,
.headersptr = &headers,
.residueptr = &residue,
.paramsptr = &params,
.name = "givenname familyname",
.user = "user",
.pass = "secret",
- .host = "host",
- .port = "5060",
+ .domain = "host:5060",
.headers = "",
.residue = "expires=3600",
.params.transport = "tcp",
@@ -1252,16 +1220,14 @@ AST_TEST_DEFINE(parse_name_andor_addr_test)
.nameptr = &name,
.userptr = &user,
.passptr = &pass,
- .hostptr = &host,
- .portptr = &port,
+ .domainptr = &domain,
.headersptr = &headers,
.residueptr = &residue,
.paramsptr = &params,
.name = "",
.user = "user",
.pass = "secret",
- .host = "host",
- .port = "5060",
+ .domain = "host:5060",
.headers = "",
.residue = "q=1",
.params.transport = "tcp",
@@ -1275,16 +1241,14 @@ AST_TEST_DEFINE(parse_name_andor_addr_test)
.nameptr = &name,
.userptr = &user,
.passptr = &pass,
- .hostptr = &host,
- .portptr = &port,
+ .domainptr = &domain,
.headersptr = &headers,
.residueptr = &residue,
.paramsptr = &params,
.name = "",
.user = "",
.pass = "",
- .host = "host",
- .port = "",
+ .domain = "host",
.headers = "",
.residue = "",
.params.transport = "",
@@ -1313,16 +1277,22 @@ AST_TEST_DEFINE(parse_name_andor_addr_test)
}
AST_LIST_TRAVERSE(&testdatalist, testdataptr, list) {
- name = user = pass = host = port = headers = residue = NULL;
+ name = user = pass = domain = headers = residue = NULL;
params.transport = params.user = params.method = params.ttl = params.maddr = NULL;
params.lr = 0;
ast_copy_string(uri,testdataptr->uri,sizeof(uri));
- if (parse_name_andor_addr(uri, "sip:,sips:", testdataptr->nameptr, testdataptr->userptr, testdataptr->passptr, testdataptr->hostptr, testdataptr->portptr, testdataptr->paramsptr, testdataptr->headersptr, testdataptr->residueptr) ||
+ if (parse_name_andor_addr(uri, "sip:,sips:",
+ testdataptr->nameptr,
+ testdataptr->userptr,
+ testdataptr->passptr,
+ testdataptr->domainptr,
+ testdataptr->paramsptr,
+ testdataptr->headersptr,
+ testdataptr->residueptr) ||
((testdataptr->nameptr) && strcmp(testdataptr->name, name)) ||
((testdataptr->userptr) && strcmp(testdataptr->user, user)) ||
((testdataptr->passptr) && strcmp(testdataptr->pass, pass)) ||
- ((testdataptr->hostptr) && strcmp(testdataptr->host, host)) ||
- ((testdataptr->portptr) && strcmp(testdataptr->port, port)) ||
+ ((testdataptr->domainptr) && strcmp(testdataptr->domain, domain)) ||
((testdataptr->headersptr) && strcmp(testdataptr->headers, headers)) ||
((testdataptr->residueptr) && strcmp(testdataptr->residue, residue)) ||
((testdataptr->paramsptr) && strcmp(testdataptr->params.transport,params.transport)) ||
@@ -1391,7 +1361,11 @@ int parse_contact_header(char *contactheader, struct contactliststruct *contactl
AST_LIST_HEAD_SET_NOLOCK(contactlist, contact);
while ((last = get_comma(contactheader,&comma)) != -1) {
- res = parse_name_andor_addr(contactheader,"sip:,sips:",&contact->name,&contact->user,&contact->pass,&contact->host,&contact->port,&contact->params,&contact->headers,&residue);
+ res = parse_name_andor_addr(contactheader, "sip:,sips:",
+ &contact->name, &contact->user,
+ &contact->pass, &contact->domain,
+ &contact->params, &contact->headers,
+ &residue);
if (res == -1) {
return res;
}
@@ -1462,8 +1436,7 @@ AST_TEST_DEFINE(parse_contact_header_test)
.name = "name :@;?&,",
.user = "user",
.pass = "secret",
- .host = "host",
- .port = "5082",
+ .domain = "host:5082",
.params.transport = "tcp",
.params.ttl = "",
.params.lr = 0,
@@ -1482,8 +1455,7 @@ AST_TEST_DEFINE(parse_contact_header_test)
.name = "",
.user = ",user1,",
.pass = ",secret1,",
- .host = "host1",
- .port = "",
+ .domain = "host1",
.params.transport = "",
.params.ttl = "7",
.params.lr = 0,
@@ -1495,8 +1467,7 @@ AST_TEST_DEFINE(parse_contact_header_test)
.name = "",
.user = "",
.pass = "",
- .host = "host2",
- .port = "",
+ .domain = "host2",
.params.transport = "",
.params.ttl = "",
.params.lr = 0,
@@ -1552,8 +1523,7 @@ AST_TEST_DEFINE(parse_contact_header_test)
strcmp(tdcontactptr->name, contactptr->name) ||
strcmp(tdcontactptr->user, contactptr->user) ||
strcmp(tdcontactptr->pass, contactptr->pass) ||
- strcmp(tdcontactptr->host, contactptr->host) ||
- strcmp(tdcontactptr->port, contactptr->port) ||
+ strcmp(tdcontactptr->domain, contactptr->domain) ||
strcmp(tdcontactptr->headers, contactptr->headers) ||
strcmp(tdcontactptr->expires, contactptr->expires) ||
strcmp(tdcontactptr->q, contactptr->q) ||