More ticket #421: fixed SIP messaging components to support IPv6 format

git-svn-id: https://svn.pjsip.org/repos/pjproject/trunk@1610 74dad513-b988-da41-8d7b-12977e46ad98
This commit is contained in:
Benny Prijono 2007-12-02 15:40:52 +00:00
parent 3282c50b39
commit d0bd498ec6
10 changed files with 310 additions and 37 deletions

View File

@ -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"

View File

@ -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);

View File

@ -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;

View File

@ -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. */

View File

@ -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;
}
/*

View File

@ -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. */

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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.

View File

@ -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;
}