summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2007-12-02 15:40:52 +0000
committerBenny Prijono <bennylp@teluu.com>2007-12-02 15:40:52 +0000
commit085b6a1482c3241345b79c3f29ad9f4d64f4805f (patch)
tree9645ab7e0d3ff2b9bf845977f28b3d296f077f24
parenta379832fa79e4ca211c85783b68eac1f070622f2 (diff)
More ticket #421: fixed SIP messaging components to support IPv6 format
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@1610 74dad513-b988-da41-8d7b-12977e46ad98
-rw-r--r--pjsip/build/test_pjsip.dsp4
-rw-r--r--pjsip/src/pjsip/sip_msg.c21
-rw-r--r--pjsip/src/pjsip/sip_parser.c37
-rw-r--r--pjsip/src/pjsip/sip_resolve.c13
-rw-r--r--pjsip/src/pjsip/sip_transport.c4
-rw-r--r--pjsip/src/pjsip/sip_uri.c19
-rw-r--r--pjsip/src/pjsua-lib/pjsua_acc.c92
-rw-r--r--pjsip/src/test-pjsip/msg_test.c109
-rw-r--r--pjsip/src/test-pjsip/test.h2
-rw-r--r--pjsip/src/test-pjsip/uri_test.c46
10 files changed, 310 insertions, 37 deletions
diff --git a/pjsip/build/test_pjsip.dsp b/pjsip/build/test_pjsip.dsp
index 1429063e..010c743b 100644
--- a/pjsip/build/test_pjsip.dsp
+++ b/pjsip/build/test_pjsip.dsp
@@ -42,7 +42,7 @@ RSC=rc.exe
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
-# ADD CPP /nologo /MD /W3 /Zi /O2 /Ob2 /I "../include" /I "../../pjlib/include" /I "../../pjlib-util/include" /I "../../pjnath/include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "PJ_WIN32" /D "PJ_M_I386" /FR /FD /c
+# ADD CPP /nologo /MD /W3 /Zi /O2 /Ob2 /I "../include" /I "../../pjlib/include" /I "../../pjlib-util/include" /I "../../pjnath/include" /I "../../pjmedia/include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "PJ_WIN32" /D "PJ_M_I386" /FR /FD /c
# SUBTRACT CPP /YX
# ADD BASE RSC /l 0x409 /d "NDEBUG"
# ADD RSC /l 0x409 /d "NDEBUG"
@@ -67,7 +67,7 @@ LINK32=link.exe
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
-# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "../include" /I "../../pjlib/include" /I "../../pjlib-util/include" /I "../../pjnath/include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "PJ_WIN32" /D "PJ_M_I386" /FR /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "../include" /I "../../pjlib/include" /I "../../pjlib-util/include" /I "../../pjnath/include" /I "../../pjmedia/include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "PJ_WIN32" /D "PJ_M_I386" /FR /FD /GZ /c
# SUBTRACT CPP /YX
# ADD BASE RSC /l 0x409 /d "_DEBUG"
# ADD RSC /l 0x409 /d "_DEBUG"
diff --git a/pjsip/src/pjsip/sip_msg.c b/pjsip/src/pjsip/sip_msg.c
index 869cb59d..f635a3da 100644
--- a/pjsip/src/pjsip/sip_msg.c
+++ b/pjsip/src/pjsip/sip_msg.c
@@ -1773,8 +1773,14 @@ static int pjsip_via_hdr_print( pjsip_via_hdr *hdr,
pj_memcpy(buf, hdr->transport.ptr, hdr->transport.slen);
buf += hdr->transport.slen;
*buf++ = ' ';
- pj_memcpy(buf, hdr->sent_by.host.ptr, hdr->sent_by.host.slen);
- buf += hdr->sent_by.host.slen;
+
+ /* Check if host contains IPv6 */
+ if (pj_memchr(hdr->sent_by.host.ptr, ':', hdr->sent_by.host.slen)) {
+ copy_advance_pair_quote_cond(buf, "", 0, hdr->sent_by.host, '[', ']');
+ } else {
+ copy_advance_check(buf, hdr->sent_by.host);
+ }
+
if (hdr->sent_by.port != 0) {
*buf++ = ':';
printed = pj_utoa(hdr->sent_by.port, buf);
@@ -1803,7 +1809,16 @@ static int pjsip_via_hdr_print( pjsip_via_hdr *hdr,
}
- copy_advance_pair(buf, ";maddr=", 7, hdr->maddr_param);
+ if (hdr->maddr_param.slen) {
+ /* Detect IPv6 IP address */
+ if (pj_memchr(hdr->maddr_param.ptr, ':', hdr->maddr_param.slen)) {
+ copy_advance_pair_quote_cond(buf, ";maddr=", 7, hdr->maddr_param,
+ '[', ']');
+ } else {
+ copy_advance_pair(buf, ";maddr=", 7, hdr->maddr_param);
+ }
+ }
+
copy_advance_pair(buf, ";received=", 10, hdr->recvd_param);
copy_advance_pair(buf, ";branch=", 8, hdr->branch_param);
diff --git a/pjsip/src/pjsip/sip_parser.c b/pjsip/src/pjsip/sip_parser.c
index bb77dcca..88edf707 100644
--- a/pjsip/src/pjsip/sip_parser.c
+++ b/pjsip/src/pjsip/sip_parser.c
@@ -1077,6 +1077,14 @@ static void parse_param_imp( pj_scanner *scanner, pj_pool_t *pool,
pvalue->ptr++;
pvalue->slen -= 2;
}
+ } else if (*scanner->curptr == '[') {
+ /* pvalue can be a quoted IPv6; in this case, the
+ * '[' and ']' quote characters are to be removed
+ * from the pvalue.
+ */
+ pj_scan_get_char(scanner);
+ pj_scan_get_until_ch(scanner, ']', pvalue);
+ pj_scan_get_char(scanner);
} else if(pj_cis_match(spec, *scanner->curptr)) {
parser_get_and_unescape(scanner, pool, spec, esc_spec, pvalue);
}
@@ -1157,11 +1165,27 @@ static void int_parse_hparam( pj_scanner *scanner, pj_pool_t *pool,
}
}
+/* Parse host part:
+ * host = hostname / IPv4address / IPv6reference
+ */
+static void int_parse_host(pj_scanner *scanner, pj_str_t *host)
+{
+ if (*scanner->curptr == '[') {
+ /* Note: the '[' and ']' characters are removed from the host */
+ pj_scan_get_char(scanner);
+ pj_scan_get_until_ch(scanner, ']', host);
+ pj_scan_get_char(scanner);
+ } else {
+ pj_scan_get( scanner, &pconst.pjsip_HOST_SPEC, host);
+ }
+}
+
/* Parse host:port in URI. */
static void int_parse_uri_host_port( pj_scanner *scanner,
pj_str_t *host, int *p_port)
{
- pj_scan_get( scanner, &pconst.pjsip_HOST_SPEC, host);
+ int_parse_host(scanner, host);
+
/* RFC3261 section 19.1.2: host don't need to be unescaped */
if (*scanner->curptr == ':') {
pj_str_t port;
@@ -1842,7 +1866,14 @@ static void int_parse_via_param( pjsip_via_hdr *hdr, pj_scanner *scanner,
while ( *scanner->curptr == ';' ) {
pj_str_t pname, pvalue;
- int_parse_param( scanner, pool, &pname, &pvalue, 0);
+ //Parse with PARAM_CHAR instead, to allow IPv6
+ //int_parse_param( scanner, pool, &pname, &pvalue, 0);
+ /* Get ';' character */
+ pj_scan_get_char(scanner);
+
+ parse_param_imp(scanner, pool, &pname, &pvalue,
+ &pconst.pjsip_PARAM_CHAR_SPEC,
+ &pconst.pjsip_PARAM_CHAR_SPEC_ESC, 0);
if (!parser_stricmp(pname, pconst.pjsip_BRANCH_STR) && pvalue.slen) {
hdr->branch_param = pvalue;
@@ -1983,7 +2014,7 @@ static pjsip_hdr* parse_hdr_via( pjsip_parse_ctx *ctx )
pj_scan_advance_n( scanner, 8, 1);
pj_scan_get( scanner, &pconst.pjsip_TOKEN_SPEC, &hdr->transport);
- pj_scan_get( scanner, &pconst.pjsip_HOST_SPEC, &hdr->sent_by.host);
+ int_parse_host(scanner, &hdr->sent_by.host);
if (*scanner->curptr==':') {
pj_str_t digit;
diff --git a/pjsip/src/pjsip/sip_resolve.c b/pjsip/src/pjsip/sip_resolve.c
index 41b892b3..1723219c 100644
--- a/pjsip/src/pjsip/sip_resolve.c
+++ b/pjsip/src/pjsip/sip_resolve.c
@@ -225,7 +225,7 @@ PJ_DEF(void) pjsip_resolve( pjsip_resolver_t *resolver,
*/
if (ip_addr_ver || resolver->res == NULL) {
- pj_in_addr ip_addr;
+ char ip_addr[PJ_INET6_ADDRSTRLEN];
int af;
pj_addrinfo ai;
unsigned count;
@@ -271,22 +271,23 @@ PJ_DEF(void) pjsip_resolve( pjsip_resolver_t *resolver,
}
/* Call the callback. */
- ip_addr = ((pj_sockaddr_in*)&svr_addr.entry[0].addr)->sin_addr;
PJ_LOG(5,(THIS_FILE,
"Target '%.*s:%d' type=%s resolved to "
- "'%s:%d' type=%s",
+ "'%s:%d' type=%s (%s)",
(int)target->addr.host.slen,
target->addr.host.ptr,
target->addr.port,
pjsip_transport_get_type_name(target->type),
- pj_inet_ntoa(ip_addr),
+ pj_inet_ntop2(af, pj_sockaddr_get_addr(&svr_addr.entry[0].addr),
+ ip_addr, sizeof(ip_addr)),
srv_port,
- pjsip_transport_get_type_name(type)));
+ pjsip_transport_get_type_name(type),
+ pjsip_transport_get_type_desc(type)));
svr_addr.count = 1;
svr_addr.entry[0].priority = 0;
svr_addr.entry[0].weight = 0;
svr_addr.entry[0].type = type;
- svr_addr.entry[0].addr_len = sizeof(pj_sockaddr_in);
+ svr_addr.entry[0].addr_len = pj_sockaddr_get_len(&svr_addr.entry[0].addr);
(*cb)(status, token, &svr_addr);
/* Done. */
diff --git a/pjsip/src/pjsip/sip_transport.c b/pjsip/src/pjsip/sip_transport.c
index 2c85f44d..f524e557 100644
--- a/pjsip/src/pjsip/sip_transport.c
+++ b/pjsip/src/pjsip/sip_transport.c
@@ -272,7 +272,7 @@ PJ_DEF(pjsip_transport_type_e) pjsip_transport_get_type_from_flag(unsigned flag)
*/
PJ_DEF(int) pjsip_transport_type_get_af(pjsip_transport_type_e type)
{
- if (type | PJSIP_TRANSPORT_IPV6)
+ if (type & PJSIP_TRANSPORT_IPV6)
return pj_AF_INET6();
else
return pj_AF_INET();
@@ -1158,7 +1158,7 @@ PJ_DEF(pj_status_t) pjsip_tpmgr_find_local_addr( pjsip_tpmgr *tpmgr,
pj_lock_release(tpmgr->lock);
}
- return PJ_SUCCESS;
+ return status;
}
/*
diff --git a/pjsip/src/pjsip/sip_uri.c b/pjsip/src/pjsip/sip_uri.c
index e22776ab..8cce07bd 100644
--- a/pjsip/src/pjsip/sip_uri.c
+++ b/pjsip/src/pjsip/sip_uri.c
@@ -265,7 +265,12 @@ static pj_ssize_t pjsip_url_print( pjsip_uri_context_e context,
/* Print host. */
pj_assert(url->host.slen != 0);
- copy_advance_check(buf, url->host);
+ /* Detect IPv6 IP address */
+ if (pj_memchr(url->host.ptr, ':', url->host.slen)) {
+ copy_advance_pair_quote_cond(buf, "", 0, url->host, '[', ']');
+ } else {
+ copy_advance_check(buf, url->host);
+ }
/* Only print port if it is explicitly specified.
* Port is not allowed in To and From header.
@@ -311,9 +316,15 @@ static pj_ssize_t pjsip_url_print( pjsip_uri_context_e context,
}
/* maddr param is not allowed in From and To header. */
- if (context != PJSIP_URI_IN_FROMTO_HDR) {
- copy_advance_pair_escape(buf, ";maddr=", 7, url->maddr_param,
- pc->pjsip_PARAM_CHAR_SPEC);
+ if (context != PJSIP_URI_IN_FROMTO_HDR && url->maddr_param.slen) {
+ /* Detect IPv6 IP address */
+ if (pj_memchr(url->maddr_param.ptr, ':', url->maddr_param.slen)) {
+ copy_advance_pair_quote_cond(buf, ";maddr=", 7, url->maddr_param,
+ '[', ']');
+ } else {
+ copy_advance_pair_escape(buf, ";maddr=", 7, url->maddr_param,
+ pc->pjsip_PARAM_CHAR_SPEC);
+ }
}
/* lr param is not allowed in From, To, and Contact header. */
diff --git a/pjsip/src/pjsua-lib/pjsua_acc.c b/pjsip/src/pjsua-lib/pjsua_acc.c
index 53090c4a..829f5616 100644
--- a/pjsip/src/pjsua-lib/pjsua_acc.c
+++ b/pjsip/src/pjsua-lib/pjsua_acc.c
@@ -325,6 +325,8 @@ PJ_DEF(pj_status_t) pjsua_acc_add_local( pjsua_transport_id tid,
{
pjsua_acc_config cfg;
pjsua_transport_data *t = &pjsua_var.tpdata[tid];
+ const char *beginquote, *endquote;
+ char transport_param[32];
char uri[PJSIP_MAX_URL_SIZE];
/* ID must be valid */
@@ -339,13 +341,32 @@ PJ_DEF(pj_status_t) pjsua_acc_add_local( pjsua_transport_id tid,
/* Lower the priority of local account */
--cfg.priority;
+ /* Enclose IPv6 address in square brackets */
+ if (t->type & PJSIP_TRANSPORT_IPV6) {
+ beginquote = "[";
+ endquote = "]";
+ } else {
+ beginquote = endquote = "";
+ }
+
+ /* Don't add transport parameter if it's UDP */
+ if ((t->type & PJSIP_TRANSPORT_UDP) == 0) {
+ pj_ansi_snprintf(transport_param, sizeof(transport_param),
+ ";transport=%s",
+ pjsip_transport_get_type_name(t->type));
+ } else {
+ transport_param[0] = '\0';
+ }
+
/* Build URI for the account */
pj_ansi_snprintf(uri, PJSIP_MAX_URL_SIZE,
- "<sip:%.*s:%d;transport=%s>",
+ "<sip:%s%.*s%s:%d%s>",
+ beginquote,
(int)t->local_name.host.slen,
t->local_name.host.ptr,
+ endquote,
t->local_name.port,
- pjsip_transport_get_type_name(t->type));
+ transport_param);
cfg.id = pj_str(uri);
@@ -1361,6 +1382,9 @@ PJ_DEF(pj_status_t) pjsua_acc_create_uac_contact( pj_pool_t *pool,
unsigned flag;
int secure;
int local_port;
+ const char *beginquote, *endquote;
+ char transport_param[32];
+
PJ_ASSERT_RETURN(pjsua_acc_is_valid(acc_id), PJ_EINVAL);
acc = &pjsua_var.acc[acc_id];
@@ -1405,6 +1429,12 @@ PJ_DEF(pj_status_t) pjsua_acc_create_uac_contact( pj_pool_t *pool,
if (tp_type == PJSIP_TRANSPORT_UNSPECIFIED)
return PJSIP_EUNSUPTRANSPORT;
+ /* If destination URI specifies IPv6, then set transport type
+ * to use IPv6 as well.
+ */
+ if (pj_strchr(suri, ':'))
+ tp_type = (pjsip_transport_type_e)(((int)tp_type) + PJSIP_TRANSPORT_IPV6);
+
flag = pjsip_transport_get_flag_from_type(tp_type);
secure = (flag & PJSIP_TRANSPORT_SECURE) != 0;
@@ -1418,10 +1448,28 @@ PJ_DEF(pj_status_t) pjsua_acc_create_uac_contact( pj_pool_t *pool,
if (status != PJ_SUCCESS)
return status;
+ /* Enclose IPv6 address in square brackets */
+ if (tp_type & PJSIP_TRANSPORT_IPV6) {
+ beginquote = "[";
+ endquote = "]";
+ } else {
+ beginquote = endquote = "";
+ }
+
+ /* Don't add transport parameter if it's UDP */
+ if ((tp_type & PJSIP_TRANSPORT_UDP) == 0) {
+ pj_ansi_snprintf(transport_param, sizeof(transport_param),
+ ";transport=%s",
+ pjsip_transport_get_type_name(tp_type));
+ } else {
+ transport_param[0] = '\0';
+ }
+
+
/* Create the contact header */
contact->ptr = (char*)pj_pool_alloc(pool, PJSIP_MAX_URL_SIZE);
contact->slen = pj_ansi_snprintf(contact->ptr, PJSIP_MAX_URL_SIZE,
- "%.*s%s<%s:%.*s%s%.*s:%d;transport=%s>",
+ "%.*s%s<%s:%.*s%s%s%.*s%s:%d%s>",
(int)acc->display.slen,
acc->display.ptr,
(acc->display.slen?" " : ""),
@@ -1429,10 +1477,12 @@ PJ_DEF(pj_status_t) pjsua_acc_create_uac_contact( pj_pool_t *pool,
(int)acc->user_part.slen,
acc->user_part.ptr,
(acc->user_part.slen?"@":""),
+ beginquote,
(int)local_addr.slen,
local_addr.ptr,
+ endquote,
local_port,
- pjsip_transport_get_type_name(tp_type));
+ transport_param);
return PJ_SUCCESS;
}
@@ -1461,6 +1511,8 @@ PJ_DEF(pj_status_t) pjsua_acc_create_uas_contact( pj_pool_t *pool,
unsigned flag;
int secure;
int local_port;
+ const char *beginquote, *endquote;
+ char transport_param[32];
PJ_ASSERT_RETURN(pjsua_acc_is_valid(acc_id), PJ_EINVAL);
acc = &pjsua_var.acc[acc_id];
@@ -1508,10 +1560,16 @@ PJ_DEF(pj_status_t) pjsua_acc_create_uas_contact( pj_pool_t *pool,
tp_type = PJSIP_TRANSPORT_UDP;
} else
tp_type = pjsip_transport_get_type_from_name(&sip_uri->transport_param);
-
+
if (tp_type == PJSIP_TRANSPORT_UNSPECIFIED)
return PJSIP_EUNSUPTRANSPORT;
+ /* If destination URI specifies IPv6, then set transport type
+ * to use IPv6 as well.
+ */
+ if (pj_strchr(&sip_uri->host, ':'))
+ tp_type = (pjsip_transport_type_e)(((int)tp_type) + PJSIP_TRANSPORT_IPV6);
+
flag = pjsip_transport_get_flag_from_type(tp_type);
secure = (flag & PJSIP_TRANSPORT_SECURE) != 0;
@@ -1525,10 +1583,28 @@ PJ_DEF(pj_status_t) pjsua_acc_create_uas_contact( pj_pool_t *pool,
if (status != PJ_SUCCESS)
return status;
+ /* Enclose IPv6 address in square brackets */
+ if (tp_type & PJSIP_TRANSPORT_IPV6) {
+ beginquote = "[";
+ endquote = "]";
+ } else {
+ beginquote = endquote = "";
+ }
+
+ /* Don't add transport parameter if it's UDP */
+ if ((tp_type & PJSIP_TRANSPORT_UDP) == 0) {
+ pj_ansi_snprintf(transport_param, sizeof(transport_param),
+ ";transport=%s",
+ pjsip_transport_get_type_name(tp_type));
+ } else {
+ transport_param[0] = '\0';
+ }
+
+
/* Create the contact header */
contact->ptr = (char*) pj_pool_alloc(pool, PJSIP_MAX_URL_SIZE);
contact->slen = pj_ansi_snprintf(contact->ptr, PJSIP_MAX_URL_SIZE,
- "%.*s%s<%s:%.*s%s%.*s:%d;transport=%s>",
+ "%.*s%s<%s:%.*s%s%s%.*s%s:%d%s>",
(int)acc->display.slen,
acc->display.ptr,
(acc->display.slen?" " : ""),
@@ -1536,10 +1612,12 @@ PJ_DEF(pj_status_t) pjsua_acc_create_uas_contact( pj_pool_t *pool,
(int)acc->user_part.slen,
acc->user_part.ptr,
(acc->user_part.slen?"@":""),
+ beginquote,
(int)local_addr.slen,
local_addr.ptr,
+ endquote,
local_port,
- pjsip_transport_get_type_name(tp_type));
+ transport_param);
return PJ_SUCCESS;
}
diff --git a/pjsip/src/test-pjsip/msg_test.c b/pjsip/src/test-pjsip/msg_test.c
index ce6c372f..c271aab8 100644
--- a/pjsip/src/test-pjsip/msg_test.c
+++ b/pjsip/src/test-pjsip/msg_test.c
@@ -700,6 +700,7 @@ static pj_status_t simple_test(void)
}
+#if INCLUDE_BENCHMARKS
static int msg_benchmark(unsigned *p_detect, unsigned *p_parse,
unsigned *p_print)
{
@@ -775,6 +776,7 @@ static int msg_benchmark(unsigned *p_detect, unsigned *p_parse,
*p_print = (unsigned)avg_print;
return status;
}
+#endif /* INCLUDE_BENCHMARKS */
/*****************************************************************************/
/* Test various header parsing and production */
@@ -795,12 +797,14 @@ static int hdr_test_record_route(pjsip_hdr *h);
static int hdr_test_supported(pjsip_hdr *h);
static int hdr_test_to(pjsip_hdr *h);
static int hdr_test_via(pjsip_hdr *h);
-
+static int hdr_test_via_ipv6_1(pjsip_hdr *h);
+static int hdr_test_via_ipv6_2(pjsip_hdr *h);
+static int hdr_test_via_ipv6_3(pjsip_hdr *h);
#define GENERIC_PARAM "p0=a;p1=\"ab:;cd\";p2=ab%3acd;p3"
#define GENERIC_PARAM_PARSED "p0=a;p1=\"ab:;cd\";p2=ab:cd;p3"
-#define PARAM_CHAR "[]/:&+$"
+#define PARAM_CHAR "][/:&+$"
#define SIMPLE_ADDR_SPEC "sip:host"
#define ADDR_SPEC SIMPLE_ADDR_SPEC ";"PARAM_CHAR"="PARAM_CHAR ";p1=\";\""
#define NAME_ADDR "<" ADDR_SPEC ">"
@@ -947,6 +951,27 @@ struct hdr_test_t
"Via", "v",
"SIP/2.0/XYZ host" ";" GENERIC_PARAM,
&hdr_test_via
+ },
+
+ {
+ /* Via with IPv6 */
+ "Via", "v",
+ "SIP/2.0/UDP [::1]",
+ &hdr_test_via_ipv6_1
+ },
+
+ {
+ /* Via with IPv6 */
+ "Via", "v",
+ "SIP/2.0/UDP [::1]:5061",
+ &hdr_test_via_ipv6_2
+ },
+
+ {
+ /* Via with IPv6 */
+ "Via", "v",
+ "SIP/2.0/UDP [::1];rport=5061;received=::2",
+ &hdr_test_via_ipv6_3
}
};
@@ -1111,7 +1136,7 @@ static int test_simple_addr_spec(pjsip_uri *uri)
}
/*
-#define PARAM_CHAR "[]/:&+$"
+#define PARAM_CHAR "][/:&+$"
#define SIMPLE_ADDR_SPEC "sip:host"
#define ADDR_SPEC SIMPLE_ADDR_SPEC ";"PARAM_CHAR"="PARAM_CHAR ";p1=\";\""
#define NAME_ADDR "<" ADDR_SPEC ">"
@@ -1433,6 +1458,74 @@ static int hdr_test_via(pjsip_hdr *h)
}
+/*
+ "SIP/2.0/UDP [::1]"
+ */
+static int hdr_test_via_ipv6_1(pjsip_hdr *h)
+{
+ pjsip_via_hdr *hdr = (pjsip_via_hdr*)h;
+
+ if (h->type != PJSIP_H_VIA)
+ return -2610;
+
+ if (pj_strcmp2(&hdr->transport, "UDP"))
+ return -2615;
+
+ if (pj_strcmp2(&hdr->sent_by.host, "::1"))
+ return -2620;
+
+ if (hdr->sent_by.port != 0)
+ return -2630;
+
+ return 0;
+}
+
+/* "SIP/2.0/UDP [::1]:5061" */
+static int hdr_test_via_ipv6_2(pjsip_hdr *h)
+{
+ pjsip_via_hdr *hdr = (pjsip_via_hdr*)h;
+
+ if (h->type != PJSIP_H_VIA)
+ return -2710;
+
+ if (pj_strcmp2(&hdr->transport, "UDP"))
+ return -2715;
+
+ if (pj_strcmp2(&hdr->sent_by.host, "::1"))
+ return -2720;
+
+ if (hdr->sent_by.port != 5061)
+ return -2730;
+
+ return 0;
+}
+
+/* "SIP/2.0/UDP [::1];rport=5061;received=::2" */
+static int hdr_test_via_ipv6_3(pjsip_hdr *h)
+{
+ pjsip_via_hdr *hdr = (pjsip_via_hdr*)h;
+
+ if (h->type != PJSIP_H_VIA)
+ return -2810;
+
+ if (pj_strcmp2(&hdr->transport, "UDP"))
+ return -2815;
+
+ if (pj_strcmp2(&hdr->sent_by.host, "::1"))
+ return -2820;
+
+ if (hdr->sent_by.port != 0)
+ return -2830;
+
+ if (pj_strcmp2(&hdr->recvd_param, "::2"))
+ return -2840;
+
+ if (hdr->rport_param != 5061)
+ return -2850;
+
+ return 0;
+}
+
static int hdr_test(void)
{
unsigned i;
@@ -1533,14 +1626,15 @@ int msg_test(void)
char desc[250];
pj_status_t status;
- status = simple_test();
- if (status != PJ_SUCCESS)
- return status;
-
status = hdr_test();
if (status != 0)
return status;
+ status = simple_test();
+ if (status != PJ_SUCCESS)
+ return status;
+
+#if INCLUDE_BENCHMARKS
for (i=0; i<COUNT; ++i) {
PJ_LOG(3,(THIS_FILE, " benchmarking (%d of %d)..", i+1, COUNT));
status = msg_benchmark(&run[i].detect, &run[i].parse, &run[i].print);
@@ -1608,6 +1702,7 @@ int msg_test(void)
"SIP messages printed per second). "
"The value is derived from msg-print-per-sec above.");
+#endif /* INCLUDE_BENCHMARKS */
return PJ_SUCCESS;
}
diff --git a/pjsip/src/test-pjsip/test.h b/pjsip/src/test-pjsip/test.h
index b2566510..1234cebc 100644
--- a/pjsip/src/test-pjsip/test.h
+++ b/pjsip/src/test-pjsip/test.h
@@ -41,6 +41,8 @@ extern pjsip_endpoint *endpt;
#define INCLUDE_TSX_GROUP 1
#define INCLUDE_INV_GROUP 1
+#define INCLUDE_BENCHMARKS 1
+
/*
* Include tests that normally would fail under certain gcc
* optimization levels.
diff --git a/pjsip/src/test-pjsip/uri_test.c b/pjsip/src/test-pjsip/uri_test.c
index 413c6fed..612a8410 100644
--- a/pjsip/src/test-pjsip/uri_test.c
+++ b/pjsip/src/test-pjsip/uri_test.c
@@ -76,7 +76,8 @@ static pjsip_uri *create_uri31( pj_pool_t *pool );
static pjsip_uri *create_uri32( pj_pool_t *pool );
static pjsip_uri *create_uri33( pj_pool_t *pool );
static pjsip_uri *create_uri34( pj_pool_t *pool );
-//static pjsip_uri *create_uri35( pj_pool_t *pool );
+static pjsip_uri *create_uri35( pj_pool_t *pool );
+static pjsip_uri *create_uri36( pj_pool_t *pool );
static pjsip_uri *create_dummy( pj_pool_t *pool );
#define ERR_NOT_EQUAL -1001
@@ -318,7 +319,21 @@ struct uri_test
&create_uri34,
"tel:911;p1=p1;p2=p2"
},
-
+ {
+ /* 35: IPv6 in host and maddr parameter */
+ PJ_SUCCESS,
+ "sip:user@[::1];maddr=[::01]",
+ &create_uri35,
+ "sip:user@[::1];maddr=[::01]"
+ },
+ {
+ /* 36: IPv6 in host and maddr, without username */
+ PJ_SUCCESS,
+ "sip:[::1];maddr=[::01]",
+ &create_uri36,
+ "sip:[::1];maddr=[::01]"
+ }
+
};
static pjsip_uri *create_uri0(pj_pool_t *pool)
@@ -669,6 +684,27 @@ static pjsip_uri *create_uri34(pj_pool_t *pool)
return (pjsip_uri*)uri;
}
+/* "sip:user@[::1];maddr=[::01]" */
+static pjsip_uri *create_uri35( pj_pool_t *pool )
+{
+ pjsip_sip_uri *url;
+ url = pjsip_sip_uri_create(pool, 0);
+ url->user = pj_str("user");
+ url->host = pj_str("::1");
+ url->maddr_param = pj_str("::01");
+ return (pjsip_uri*)url;
+}
+
+/* "sip:[::1];maddr=[::01]" */
+static pjsip_uri *create_uri36( pj_pool_t *pool )
+{
+ pjsip_sip_uri *url;
+ url = pjsip_sip_uri_create(pool, 0);
+ url->host = pj_str("::1");
+ url->maddr_param = pj_str("::01");
+ return (pjsip_uri*)url;
+
+}
static pjsip_uri *create_dummy(pj_pool_t *pool)
{
@@ -824,6 +860,7 @@ static int simple_uri_test(void)
return 0;
}
+#if INCLUDE_BENCHMARKS
static int uri_benchmark(unsigned *p_parse, unsigned *p_print, unsigned *p_cmp)
{
unsigned i, loop;
@@ -909,7 +946,7 @@ static int uri_benchmark(unsigned *p_parse, unsigned *p_print, unsigned *p_cmp)
on_return:
return status;
}
-
+#endif /* INCLUDE_BENCHMARKS */
/*****************************************************************************/
@@ -929,6 +966,7 @@ int uri_test(void)
if (status != PJ_SUCCESS)
return status;
+#if INCLUDE_BENCHMARKS
for (i=0; i<COUNT; ++i) {
PJ_LOG(3,(THIS_FILE, " benchmarking (%d of %d)...", i+1, COUNT));
status = uri_benchmark(&run[i].parse, &run[i].print, &run[i].cmp);
@@ -993,6 +1031,8 @@ int uri_test(void)
report_ival("uri-cmp-per-sec", max, "URI/sec", desc);
+#endif /* INCLUDE_BENCHMARKS */
+
return PJ_SUCCESS;
}