diff options
author | Benny Prijono <bennylp@teluu.com> | 2007-12-02 15:40:52 +0000 |
---|---|---|
committer | Benny Prijono <bennylp@teluu.com> | 2007-12-02 15:40:52 +0000 |
commit | 085b6a1482c3241345b79c3f29ad9f4d64f4805f (patch) | |
tree | 9645ab7e0d3ff2b9bf845977f28b3d296f077f24 /pjsip | |
parent | a379832fa79e4ca211c85783b68eac1f070622f2 (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
Diffstat (limited to 'pjsip')
-rw-r--r-- | pjsip/build/test_pjsip.dsp | 4 | ||||
-rw-r--r-- | pjsip/src/pjsip/sip_msg.c | 21 | ||||
-rw-r--r-- | pjsip/src/pjsip/sip_parser.c | 37 | ||||
-rw-r--r-- | pjsip/src/pjsip/sip_resolve.c | 13 | ||||
-rw-r--r-- | pjsip/src/pjsip/sip_transport.c | 4 | ||||
-rw-r--r-- | pjsip/src/pjsip/sip_uri.c | 19 | ||||
-rw-r--r-- | pjsip/src/pjsua-lib/pjsua_acc.c | 92 | ||||
-rw-r--r-- | pjsip/src/test-pjsip/msg_test.c | 109 | ||||
-rw-r--r-- | pjsip/src/test-pjsip/test.h | 2 | ||||
-rw-r--r-- | pjsip/src/test-pjsip/uri_test.c | 46 |
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; } |