summaryrefslogtreecommitdiff
path: root/pjsip/src/test-pjsip/msg_test.c
diff options
context:
space:
mode:
authorNanang Izzuddin <nanang@teluu.com>2009-04-22 14:27:55 +0000
committerNanang Izzuddin <nanang@teluu.com>2009-04-22 14:27:55 +0000
commitd593d23d9acec3467625480a8a027babacec3618 (patch)
tree430e074ddb4323da5536ec081d56adbd99563241 /pjsip/src/test-pjsip/msg_test.c
parente9770fb6f2b66e939984b8887137d28b24b25799 (diff)
Ticket #706: Merged branch vs-reorg into trunk:
- Currently supported platforms are Win32 & WM6 std/pro. - Renamed project test_pjsip with pjsip_test, also source directory 'test-pjsip' to 'test'. git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@2638 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjsip/src/test-pjsip/msg_test.c')
-rw-r--r--pjsip/src/test-pjsip/msg_test.c2058
1 files changed, 0 insertions, 2058 deletions
diff --git a/pjsip/src/test-pjsip/msg_test.c b/pjsip/src/test-pjsip/msg_test.c
deleted file mode 100644
index 840c40ff..00000000
--- a/pjsip/src/test-pjsip/msg_test.c
+++ /dev/null
@@ -1,2058 +0,0 @@
-/* $Id$ */
-/*
- * Copyright (C) 2008-2009 Teluu Inc. (http://www.teluu.com)
- * Copyright (C) 2003-2008 Benny Prijono <benny@prijono.org>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-#include "test.h"
-#include <pjsip.h>
-#include <pjlib.h>
-
-#define POOL_SIZE 8000
-#if defined(PJ_DEBUG) && PJ_DEBUG!=0
-# define LOOP 10000
-#else
-# define LOOP 100000
-#endif
-#define AVERAGE_MSG_LEN 800
-#define THIS_FILE "msg_test.c"
-
-static pjsip_msg *create_msg0(pj_pool_t *pool);
-static pjsip_msg *create_msg1(pj_pool_t *pool);
-
-#define STATUS_PARTIAL 1
-#define STATUS_SYNTAX_ERROR 2
-
-#define FLAG_DETECT_ONLY 1
-#define FLAG_PARSE_ONLY 4
-#define FLAG_PRINT_ONLY 8
-
-struct test_msg
-{
- char msg[1024];
- pjsip_msg *(*creator)(pj_pool_t *pool);
- pj_size_t len;
- int expected_status;
-} test_array[] =
-{
-{
- /* 'Normal' message with all headers. */
- "INVITE sip:user@foo SIP/2.0\n"
- "from: Hi I'm Joe <sip:joe.user@bar.otherdomain.com>;tag=123457890123456\r"
- "To: Fellow User <sip:user@foo.bar.domain.com>\r\n"
- "Call-ID: 12345678901234567890@bar\r\n"
- "Content-Length: 0\r\n"
- "CSeq: 123456 INVITE\n"
- "Contact: <sip:joe@bar> ; q=0.5;expires=3600,sip:user@host;q=0.500\r"
- " ,sip:user2@host2\n"
- "Content-Type: text/html ; charset=ISO-8859-4\r"
- "Route: <sip:bigbox3.site3.atlanta.com;lr>,\r\n"
- " <sip:server10.biloxi.com;lr>\r"
- "Record-Route: <sip:server10.biloxi.com>,\r\n" /* multiple routes+folding*/
- " <sip:bigbox3.site3.atlanta.com;lr>\n"
- "v: SIP/2.0/SCTP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c230\n"
- "Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8\n" /* folding. */
- " ;received=192.0.2.1\r\n"
- "Via: SIP/2.0/UDP 10.2.1.1, SIP/2.0/TCP 192.168.1.1\n"
- "Organization: \r"
- "Max-Forwards: 70\n"
- "X-Header: \r\n" /* empty header */
- "P-Associated-URI:\r\n" /* empty header without space */
- "\r\n",
- &create_msg0,
- 0,
- PJ_SUCCESS
-},
-{
- /* Typical response message. */
- "SIP/2.0 200 OK\r\n"
- "Via: SIP/2.0/SCTP server10.biloxi.com;branch=z9hG4bKnashds8;rport;received=192.0.2.1\r\n"
- "Via: SIP/2.0/UDP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1;received=192.0.2.2\r\n"
- "Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bK776asdhds ;received=192.0.2.3\r\n"
- "Route: <sip:proxy.sipprovider.com>\r\n"
- "Route: <sip:proxy.supersip.com:5060>\r\n"
- "Max-Forwards: 70\r\n"
- "To: Bob <sip:bob@biloxi.com>;tag=a6c85cf\r\n"
- "From: Alice <sip:alice@atlanta.com>;tag=1928301774\r\n"
- "Call-ID: a84b4c76e66710@pc33.atlanta.com\r\n"
- "CSeq: 314159 INVITE\r\n"
- "Contact: <sips:bob@192.0.2.4>\r\n"
- "Content-Type: application/sdp\r\n"
- "Content-Length: 150\r\n"
- "\r\n"
- "v=0\r\n"
- "o=alice 53655765 2353687637 IN IP4 pc33.atlanta.com\r\n"
- "s=-\r\n"
- "t=0 0\r\n"
- "c=IN IP4 pc33.atlanta.com\r\n"
- "m=audio 3456 RTP/AVP 0 1 3 99\r\n"
- "a=rtpmap:0 PCMU/8000\r\n",
- &create_msg1,
- 0,
- PJ_SUCCESS
-},
-{
- /* Torture message from RFC 4475
- * 3.1.1.1 A short tortuous INVITE
- */
- "INVITE sip:vivekg@chair-dnrc.example.com;unknownparam SIP/2.0\n"
- "TO :\n"
- " sip:vivekg@chair-dnrc.example.com ; tag = 1918181833n\n"
- "from : \"J Rosenberg \\\\\\\"\" <sip:jdrosen@example.com>\n"
- " ;\n"
- " tag = 98asjd8\n"
- "MaX-fOrWaRdS: 0068\n"
- "Call-ID: wsinv.ndaksdj@192.0.2.1\n"
- "Content-Length : 150\n"
- "cseq: 0009\n"
- " INVITE\n"
- "Via : SIP / 2.0\n"
- " /UDP\n"
- " 192.0.2.2;rport;branch=390skdjuw\n"
- "s :\n"
- "NewFangledHeader: newfangled value\n"
- " continued newfangled value\n"
- "UnknownHeaderWithUnusualValue: ;;,,;;,;\n"
- "Content-Type: application/sdp\n"
- "Route:\n"
- " <sip:services.example.com;lr;unknownwith=value;unknown-no-value>\n"
- "v: SIP / 2.0 / TCP spindle.example.com ;\n"
- " branch = z9hG4bK9ikj8 ,\n"
- " SIP / 2.0 / UDP 192.168.255.111 ; branch=\n"
- " z9hG4bK30239\n"
- "m:\"Quoted string \\\"\\\"\" <sip:jdrosen@example.com> ; newparam =\n"
- " newvalue ;\n"
- " secondparam ; q = 0.33\r\n"
- "\r\n"
- "v=0\r\n"
- "o=mhandley 29739 7272939 IN IP4 192.0.2.3\r\n"
- "s=-\r\n"
- "c=IN IP4 192.0.2.4\r\n"
- "t=0 0\r\n"
- "m=audio 49217 RTP/AVP 0 12\r\n"
- "m=video 3227 RTP/AVP 31\r\n"
- "a=rtpmap:31 LPC\r\n",
- NULL,
- 0,
- PJ_SUCCESS
-},
-{
- /* Torture message from RFC 4475
- * 3.1.1.2 Wide Range of Valid Characters
- */
- "!interesting-Method0123456789_*+`.%indeed'~ sip:1_unusual.URI~(to-be!sure)&isn't+it$/crazy?,/;;*:&it+has=1,weird!*pas$wo~d_too.(doesn't-it)@example.com SIP/2.0\n"
- "Via: SIP/2.0/UDP host1.example.com;rport;branch=z9hG4bK-.!%66*_+`'~\n"
- "To: \"BEL:\\\x07 NUL:\\\x00 DEL:\\\x7F\" <sip:1_unusual.URI~(to-be!sure)&isn't+it$/crazy?,/;;*@example.com>\n"
- "From: token1~` token2'+_ token3*%!.- <sip:mundane@example.com> ;fromParam''~+*_!.-%=\"\xD1\x80\xD0\xB0\xD0\xB1\xD0\xBE\xD1\x82\xD0\xB0\xD1\x8E\xD1\x89\xD0\xB8\xD0\xB9\";tag=_token~1'+`*%!-.\n"
- "Call-ID: intmeth.word%ZK-!.*_+'@word`~)(><:\\/\"][?}{\n"
- "CSeq: 139122385 !interesting-Method0123456789_*+`.%indeed'~\n"
- "Max-Forwards: 255\n"
- "extensionHeader-!.%*+_`'~: \xEF\xBB\xBF\xE5\xA4\xA7\xE5\x81\x9C\xE9\x9B\xBB\n"
- "Content-Length: 0\r\n\r\n",
- NULL,
- 641,
- PJ_SUCCESS
-},
-{
- /* Torture message from RFC 4475
- * 3.1.1.3 Valid Use of the % Escaping Mechanism
- */
- "INVITE sip:sips%3Auser%40example.com@example.net SIP/2.0\n"
- "To: sip:%75se%72@example.com\n"
- "From: <sip:I%20have%20spaces@example.net>;tag=1234\n"
- "Max-Forwards: 87\n"
- "i: esc01.239409asdfakjkn23onasd0-3234\n"
- "CSeq: 234234 INVITE\n"
- "Via: SIP/2.0/UDP host5.example.net;rport;branch=z9hG4bKkdjuw\n"
- "C: application/sdp\n"
- "Contact:\n"
- " <sip:cal%6Cer@192.168.0.2:5060;%6C%72;n%61me=v%61lue%25%34%31>\n"
- "Content-Length: 150\r\n"
- "\r\n"
- "v=0\r\n"
- "o=mhandley 29739 7272939 IN IP4 192.0.2.1\r\n"
- "s=-\r\n"
- "c=IN IP4 192.0.2.1\r\n"
- "t=0 0\r\n"
- "m=audio 49217 RTP/AVP 0 12\r\n"
- "m=video 3227 RTP/AVP 31\r\n"
- "a=rtpmap:31 LPC\r\n",
- NULL,
- 0,
- PJ_SUCCESS
-},
-{
- /* Torture message from RFC 4475
- * 3.1.1.4 Escaped Nulls in URIs
- */
- "REGISTER sip:example.com SIP/2.0\r\n"
- "To: sip:null-%00-null@example.com\r\n"
- "From: sip:null-%00-null@example.com;tag=839923423\r\n"
- "Max-Forwards: 70\r\n"
- "Call-ID: escnull.39203ndfvkjdasfkq3w4otrq0adsfdfnavd\r\n"
- "CSeq: 14398234 REGISTER\r\n"
- "Via: SIP/2.0/UDP host5.example.com;rport;branch=z9hG4bKkdjuw\r\n"
- "Contact: <sip:%00@host5.example.com>\r\n"
- "Contact: <sip:%00%00@host5.example.com>\r\n"
- "L:0\r\n"
- "\r\n",
- NULL,
- 0,
- PJ_SUCCESS
-},
-{
- /* Torture message from RFC 4475
- * 3.1.1.5 Use of % When It Is Not an Escape
- */
- "RE%47IST%45R sip:registrar.example.com SIP/2.0\r\n"
- "To: \"%Z%45\" <sip:resource@example.com>\r\n"
- "From: \"%Z%45\" <sip:resource@example.com>;tag=f232jadfj23\r\n"
- "Call-ID: esc02.asdfnqwo34rq23i34jrjasdcnl23nrlknsdf\r\n"
- "Via: SIP/2.0/TCP host.example.com;rport;branch=z9hG4bK209%fzsnel234\r\n"
- "CSeq: 29344 RE%47IST%45R\r\n"
- "Max-Forwards: 70\r\n"
- "Contact: <sip:alias1@host1.example.com>\r\n"
- "C%6Fntact: <sip:alias2@host2.example.com>\r\n"
- "Contact: <sip:alias3@host3.example.com>\r\n"
- "l: 0\r\n"
- "\r\n",
- NULL,
- 0,
- PJ_SUCCESS
-}
-};
-
-static struct
-{
- int flag;
- pj_highprec_t detect_len, parse_len, print_len;
- pj_timestamp detect_time, parse_time, print_time;
-} var;
-
-static pj_status_t test_entry( pj_pool_t *pool, struct test_msg *entry )
-{
- pjsip_msg *parsed_msg, *ref_msg = NULL;
- static pjsip_msg *print_msg;
- pj_status_t status = PJ_SUCCESS;
- int len;
- pj_str_t str1, str2;
- pjsip_hdr *hdr1, *hdr2;
- pj_timestamp t1, t2;
- pjsip_parser_err_report err_list;
- pj_size_t msg_size;
- char msgbuf1[PJSIP_MAX_PKT_LEN];
- char msgbuf2[PJSIP_MAX_PKT_LEN];
- enum { BUFLEN = 512 };
-
- if (entry->len==0)
- entry->len = pj_ansi_strlen(entry->msg);
-
- if (var.flag & FLAG_PARSE_ONLY)
- goto parse_msg;
-
- if (var.flag & FLAG_PRINT_ONLY) {
- if (print_msg == NULL)
- print_msg = entry->creator(pool);
- goto print_msg;
- }
-
- /* Detect message. */
- var.detect_len = var.detect_len + entry->len;
- pj_get_timestamp(&t1);
- status = pjsip_find_msg(entry->msg, entry->len, PJ_FALSE, &msg_size);
- if (status != PJ_SUCCESS) {
- if (status!=PJSIP_EPARTIALMSG ||
- entry->expected_status!=STATUS_PARTIAL)
- {
- app_perror(" error: unable to detect message", status);
- return -5;
- }
- }
- if (msg_size != entry->len) {
- PJ_LOG(3,(THIS_FILE, " error: size mismatch"));
- return -6;
- }
- pj_get_timestamp(&t2);
- pj_sub_timestamp(&t2, &t1);
- pj_add_timestamp(&var.detect_time, &t2);
-
- if (var.flag & FLAG_DETECT_ONLY)
- return PJ_SUCCESS;
-
- /* Parse message. */
-parse_msg:
- var.parse_len = var.parse_len + entry->len;
- pj_get_timestamp(&t1);
- pj_list_init(&err_list);
- parsed_msg = pjsip_parse_msg(pool, entry->msg, entry->len, &err_list);
- if (parsed_msg == NULL) {
- if (entry->expected_status != STATUS_SYNTAX_ERROR) {
- status = -10;
- if (err_list.next != &err_list) {
- PJ_LOG(3,(THIS_FILE, " Syntax error in line %d col %d",
- err_list.next->line, err_list.next->col));
- }
- goto on_return;
- }
- }
- pj_get_timestamp(&t2);
- pj_sub_timestamp(&t2, &t1);
- pj_add_timestamp(&var.parse_time, &t2);
-
- if ((var.flag & FLAG_PARSE_ONLY) || entry->creator==NULL)
- return PJ_SUCCESS;
-
- /* Create reference message. */
- ref_msg = entry->creator(pool);
-
- /* Create buffer for comparison. */
- str1.ptr = (char*)pj_pool_alloc(pool, BUFLEN);
- str2.ptr = (char*)pj_pool_alloc(pool, BUFLEN);
-
- /* Compare message type. */
- if (parsed_msg->type != ref_msg->type) {
- status = -20;
- goto on_return;
- }
-
- /* Compare request or status line. */
- if (parsed_msg->type == PJSIP_REQUEST_MSG) {
- pjsip_method *m1 = &parsed_msg->line.req.method;
- pjsip_method *m2 = &ref_msg->line.req.method;
-
- if (pjsip_method_cmp(m1, m2) != 0) {
- status = -30;
- goto on_return;
- }
- status = pjsip_uri_cmp(PJSIP_URI_IN_REQ_URI,
- parsed_msg->line.req.uri,
- ref_msg->line.req.uri);
- if (status != PJ_SUCCESS) {
- app_perror(" error: request URI mismatch", status);
- status = -31;
- goto on_return;
- }
- } else {
- if (parsed_msg->line.status.code != ref_msg->line.status.code) {
- PJ_LOG(3,(THIS_FILE, " error: status code mismatch"));
- status = -32;
- goto on_return;
- }
- if (pj_strcmp(&parsed_msg->line.status.reason,
- &ref_msg->line.status.reason) != 0)
- {
- PJ_LOG(3,(THIS_FILE, " error: status text mismatch"));
- status = -33;
- goto on_return;
- }
- }
-
- /* Compare headers. */
- hdr1 = parsed_msg->hdr.next;
- hdr2 = ref_msg->hdr.next;
-
- while (hdr1 != &parsed_msg->hdr && hdr2 != &ref_msg->hdr) {
- len = hdr1->vptr->print_on(hdr1, str1.ptr, BUFLEN);
- if (len < 1) {
- status = -40;
- goto on_return;
- }
- str1.ptr[len] = '\0';
- str1.slen = len;
-
- len = hdr2->vptr->print_on(hdr2, str2.ptr, BUFLEN);
- if (len < 1) {
- status = -50;
- goto on_return;
- }
- str2.ptr[len] = '\0';
- str2.slen = len;
-
- if (pj_strcmp(&str1, &str2) != 0) {
- status = -60;
- PJ_LOG(3,(THIS_FILE, " error: header string mismatch:\n"
- " h1='%s'\n"
- " h2='%s'\n",
- str1.ptr, str2.ptr));
- goto on_return;
- }
-
- hdr1 = hdr1->next;
- hdr2 = hdr2->next;
- }
-
- if (hdr1 != &parsed_msg->hdr || hdr2 != &ref_msg->hdr) {
- status = -70;
- goto on_return;
- }
-
- /* Compare body? */
- if (parsed_msg->body==NULL && ref_msg->body==NULL)
- goto print_msg;
-
- /* Compare msg body length. */
- if (parsed_msg->body->len != ref_msg->body->len) {
- status = -80;
- goto on_return;
- }
-
- /* Compare msg body content type. */
- if (pj_strcmp(&parsed_msg->body->content_type.type,
- &ref_msg->body->content_type.type) != 0) {
- status = -90;
- goto on_return;
- }
- if (pj_strcmp(&parsed_msg->body->content_type.subtype,
- &ref_msg->body->content_type.subtype) != 0) {
- status = -100;
- goto on_return;
- }
-
- /* Compare body content. */
- str1.slen = parsed_msg->body->print_body(parsed_msg->body,
- msgbuf1, sizeof(msgbuf1));
- if (str1.slen < 1) {
- status = -110;
- goto on_return;
- }
- str1.ptr = msgbuf1;
-
- str2.slen = ref_msg->body->print_body(ref_msg->body,
- msgbuf2, sizeof(msgbuf2));
- if (str2.slen < 1) {
- status = -120;
- goto on_return;
- }
- str2.ptr = msgbuf2;
-
- if (pj_strcmp(&str1, &str2) != 0) {
- status = -140;
- goto on_return;
- }
-
- /* Print message. */
-print_msg:
- var.print_len = var.print_len + entry->len;
- pj_get_timestamp(&t1);
- if (var.flag && FLAG_PRINT_ONLY)
- ref_msg = print_msg;
- len = pjsip_msg_print(ref_msg, msgbuf1, PJSIP_MAX_PKT_LEN);
- if (len < 1) {
- status = -150;
- goto on_return;
- }
- pj_get_timestamp(&t2);
- pj_sub_timestamp(&t2, &t1);
- pj_add_timestamp(&var.print_time, &t2);
-
-
- status = PJ_SUCCESS;
-
-on_return:
- return status;
-}
-
-
-static pjsip_msg *create_msg0(pj_pool_t *pool)
-{
-
- pjsip_msg *msg;
- pjsip_name_addr *name_addr;
- pjsip_sip_uri *url;
- pjsip_fromto_hdr *fromto;
- pjsip_cid_hdr *cid;
- pjsip_clen_hdr *clen;
- pjsip_cseq_hdr *cseq;
- pjsip_contact_hdr *contact;
- pjsip_ctype_hdr *ctype;
- pjsip_routing_hdr *routing;
- pjsip_via_hdr *via;
- pjsip_generic_string_hdr *generic;
- pj_str_t str;
-
- msg = pjsip_msg_create(pool, PJSIP_REQUEST_MSG);
-
- /* "INVITE sip:user@foo SIP/2.0\n" */
- pjsip_method_set(&msg->line.req.method, PJSIP_INVITE_METHOD);
- url = pjsip_sip_uri_create(pool, 0);
- msg->line.req.uri = (pjsip_uri*)url;
- pj_strdup2(pool, &url->user, "user");
- pj_strdup2(pool, &url->host, "foo");
-
- /* "From: Hi I'm Joe <sip:joe.user@bar.otherdomain.com>;tag=123457890123456\r" */
- fromto = pjsip_from_hdr_create(pool);
- pjsip_msg_add_hdr(msg, (pjsip_hdr*)fromto);
- pj_strdup2(pool, &fromto->tag, "123457890123456");
- name_addr = pjsip_name_addr_create(pool);
- fromto->uri = (pjsip_uri*)name_addr;
- pj_strdup2(pool, &name_addr->display, "Hi I'm Joe");
- url = pjsip_sip_uri_create(pool, 0);
- name_addr->uri = (pjsip_uri*)url;
- pj_strdup2(pool, &url->user, "joe.user");
- pj_strdup2(pool, &url->host, "bar.otherdomain.com");
-
- /* "To: Fellow User <sip:user@foo.bar.domain.com>\r\n" */
- fromto = pjsip_to_hdr_create(pool);
- pjsip_msg_add_hdr(msg, (pjsip_hdr*)fromto);
- name_addr = pjsip_name_addr_create(pool);
- fromto->uri = (pjsip_uri*)name_addr;
- pj_strdup2(pool, &name_addr->display, "Fellow User");
- url = pjsip_sip_uri_create(pool, 0);
- name_addr->uri = (pjsip_uri*)url;
- pj_strdup2(pool, &url->user, "user");
- pj_strdup2(pool, &url->host, "foo.bar.domain.com");
-
- /* "Call-ID: 12345678901234567890@bar\r\n" */
- cid = pjsip_cid_hdr_create(pool);
- pjsip_msg_add_hdr(msg, (pjsip_hdr*)cid);
- pj_strdup2(pool, &cid->id, "12345678901234567890@bar");
-
- /* "Content-Length: 0\r\n" */
- clen = pjsip_clen_hdr_create(pool);
- pjsip_msg_add_hdr(msg, (pjsip_hdr*)clen);
- clen->len = 0;
-
- /* "CSeq: 123456 INVITE\n" */
- cseq = pjsip_cseq_hdr_create(pool);
- pjsip_msg_add_hdr(msg, (pjsip_hdr*)cseq);
- cseq->cseq = 123456;
- pjsip_method_set(&cseq->method, PJSIP_INVITE_METHOD);
-
- /* "Contact: <sip:joe@bar>;q=0.5;expires=3600*/
- contact = pjsip_contact_hdr_create(pool);
- pjsip_msg_add_hdr(msg, (pjsip_hdr*)contact);
- contact->q1000 = 500;
- contact->expires = 3600;
- name_addr = pjsip_name_addr_create(pool);
- contact->uri = (pjsip_uri*)name_addr;
- url = pjsip_sip_uri_create(pool, 0);
- name_addr->uri = (pjsip_uri*)url;
- pj_strdup2(pool, &url->user, "joe");
- pj_strdup2(pool, &url->host, "bar");
-
- /*, sip:user@host;q=0.500\r" */
- contact = pjsip_contact_hdr_create(pool);
- pjsip_msg_add_hdr(msg, (pjsip_hdr*)contact);
- contact->q1000 = 500;
- name_addr = pjsip_name_addr_create(pool);
- contact->uri = (pjsip_uri*)name_addr;
- url = pjsip_sip_uri_create(pool, 0);
- name_addr->uri = (pjsip_uri*)url;
- pj_strdup2(pool, &url->user, "user");
- pj_strdup2(pool, &url->host, "host");
-
- /* " ,sip:user2@host2\n" */
- contact = pjsip_contact_hdr_create(pool);
- pjsip_msg_add_hdr(msg, (pjsip_hdr*)contact);
- name_addr = pjsip_name_addr_create(pool);
- contact->uri = (pjsip_uri*)name_addr;
- url = pjsip_sip_uri_create(pool, 0);
- name_addr->uri = (pjsip_uri*)url;
- pj_strdup2(pool, &url->user, "user2");
- pj_strdup2(pool, &url->host, "host2");
-
- /* "Content-Type: text/html; charset=ISO-8859-4\r" */
- ctype = pjsip_ctype_hdr_create(pool);
- pjsip_msg_add_hdr(msg, (pjsip_hdr*)ctype);
- pj_strdup2(pool, &ctype->media.type, "text");
- pj_strdup2(pool, &ctype->media.subtype, "html");
- pj_strdup2(pool, &ctype->media.param, ";charset=ISO-8859-4");
-
- /* "Route: <sip:bigbox3.site3.atlanta.com;lr>,\r\n" */
- routing = pjsip_route_hdr_create(pool);
- pjsip_msg_add_hdr(msg, (pjsip_hdr*)routing);
- url = pjsip_sip_uri_create(pool, 0);
- routing->name_addr.uri = (pjsip_uri*)url;
- pj_strdup2(pool, &url->host, "bigbox3.site3.atlanta.com");
- url->lr_param = 1;
-
- /* " <sip:server10.biloxi.com;lr>\r" */
- routing = pjsip_route_hdr_create(pool);
- pjsip_msg_add_hdr(msg, (pjsip_hdr*)routing);
- url = pjsip_sip_uri_create(pool, 0);
- routing->name_addr.uri = (pjsip_uri*)url;
- pj_strdup2(pool, &url->host, "server10.biloxi.com");
- url->lr_param = 1;
-
- /* "Record-Route: <sip:server10.biloxi.com>,\r\n" */
- routing = pjsip_rr_hdr_create(pool);
- pjsip_msg_add_hdr(msg, (pjsip_hdr*)routing);
- url = pjsip_sip_uri_create(pool, 0);
- routing->name_addr.uri = (pjsip_uri*)url;
- pj_strdup2(pool, &url->host, "server10.biloxi.com");
- url->lr_param = 0;
-
- /* " <sip:bigbox3.site3.atlanta.com;lr>\n" */
- routing = pjsip_rr_hdr_create(pool);
- pjsip_msg_add_hdr(msg, (pjsip_hdr*)routing);
- url = pjsip_sip_uri_create(pool, 0);
- routing->name_addr.uri = (pjsip_uri*)url;
- pj_strdup2(pool, &url->host, "bigbox3.site3.atlanta.com");
- url->lr_param = 1;
-
- /* "Via: SIP/2.0/SCTP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c230\n" */
- via = pjsip_via_hdr_create(pool);
- pjsip_msg_add_hdr(msg, (pjsip_hdr*)via);
- pj_strdup2(pool, &via->transport, "SCTP");
- pj_strdup2(pool, &via->sent_by.host, "bigbox3.site3.atlanta.com");
- pj_strdup2(pool, &via->branch_param, "z9hG4bK77ef4c230");
-
- /* "Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8\n"
- " ;received=192.0.2.1\r\n" */
- via = pjsip_via_hdr_create(pool);
- pjsip_msg_add_hdr(msg, (pjsip_hdr*)via);
- pj_strdup2(pool, &via->transport, "UDP");
- pj_strdup2(pool, &via->sent_by.host, "pc33.atlanta.com");
- pj_strdup2(pool, &via->branch_param, "z9hG4bKnashds8");
- pj_strdup2(pool, &via->recvd_param, "192.0.2.1");
-
-
- /* "Via: SIP/2.0/UDP 10.2.1.1, */
- via = pjsip_via_hdr_create(pool);
- pjsip_msg_add_hdr(msg, (pjsip_hdr*)via);
- pj_strdup2(pool, &via->transport, "UDP");
- pj_strdup2(pool, &via->sent_by.host, "10.2.1.1");
-
-
- /*SIP/2.0/TCP 192.168.1.1\n" */
- via = pjsip_via_hdr_create(pool);
- pjsip_msg_add_hdr(msg, (pjsip_hdr*)via);
- pj_strdup2(pool, &via->transport, "TCP");
- pj_strdup2(pool, &via->sent_by.host, "192.168.1.1");
-
- /* "Organization: \r" */
- str.ptr = "Organization";
- str.slen = 12;
- generic = pjsip_generic_string_hdr_create(pool, &str, NULL);
- pjsip_msg_add_hdr(msg, (pjsip_hdr*)generic);
- generic->hvalue.ptr = NULL;
- generic->hvalue.slen = 0;
-
- /* "Max-Forwards: 70\n" */
- str.ptr = "Max-Forwards";
- str.slen = 12;
- generic = pjsip_generic_string_hdr_create(pool, &str, NULL);
- pjsip_msg_add_hdr(msg, (pjsip_hdr*)generic);
- str.ptr = "70";
- str.slen = 2;
- generic->hvalue = str;
-
- /* "X-Header: \r\n" */
- str.ptr = "X-Header";
- str.slen = 8;
- generic = pjsip_generic_string_hdr_create(pool, &str, NULL);
- pjsip_msg_add_hdr(msg, (pjsip_hdr*)generic);
- str.ptr = NULL;
- str.slen = 0;
- generic->hvalue = str;
-
- /* P-Associated-URI:\r\n */
- str.ptr = "P-Associated-URI";
- str.slen = 16;
- generic = pjsip_generic_string_hdr_create(pool, &str, NULL);
- pjsip_msg_add_hdr(msg, (pjsip_hdr*)generic);
- str.ptr = NULL;
- str.slen = 0;
- generic->hvalue = str;
-
- return msg;
-}
-
-static pjsip_msg *create_msg1(pj_pool_t *pool)
-{
- pjsip_via_hdr *via;
- pjsip_route_hdr *route;
- pjsip_name_addr *name_addr;
- pjsip_sip_uri *url;
- pjsip_max_fwd_hdr *max_fwd;
- pjsip_to_hdr *to;
- pjsip_from_hdr *from;
- pjsip_contact_hdr *contact;
- pjsip_ctype_hdr *ctype;
- pjsip_cid_hdr *cid;
- pjsip_clen_hdr *clen;
- pjsip_cseq_hdr *cseq;
- pjsip_msg *msg = pjsip_msg_create(pool, PJSIP_RESPONSE_MSG);
- pjsip_msg_body *body;
-
- //"SIP/2.0 200 OK\r\n"
- msg->line.status.code = 200;
- msg->line.status.reason = pj_str("OK");
-
- //"Via: SIP/2.0/SCTP server10.biloxi.com;branch=z9hG4bKnashds8;rport;received=192.0.2.1\r\n"
- via = pjsip_via_hdr_create(pool);
- pjsip_msg_add_hdr(msg, (pjsip_hdr*)via);
- via->transport = pj_str("SCTP");
- via->sent_by.host = pj_str("server10.biloxi.com");
- via->branch_param = pj_str("z9hG4bKnashds8");
- via->rport_param = 0;
- via->recvd_param = pj_str("192.0.2.1");
-
- //"Via: SIP/2.0/UDP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1;received=192.0.2.2\r\n"
- via = pjsip_via_hdr_create(pool);
- pjsip_msg_add_hdr(msg, (pjsip_hdr*)via);
- via->transport = pj_str("UDP");
- via->sent_by.host = pj_str("bigbox3.site3.atlanta.com");
- via->branch_param = pj_str("z9hG4bK77ef4c2312983.1");
- via->recvd_param = pj_str("192.0.2.2");
-
- //"Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bK776asdhds ;received=192.0.2.3\r\n"
- via = pjsip_via_hdr_create(pool);
- pjsip_msg_add_hdr(msg, (pjsip_hdr*)via);
- via->transport = pj_str("UDP");
- via->sent_by.host = pj_str("pc33.atlanta.com");
- via->branch_param = pj_str("z9hG4bK776asdhds");
- via->recvd_param = pj_str("192.0.2.3");
-
- //"Route: <sip:proxy.sipprovider.com>\r\n"
- route = pjsip_route_hdr_create(pool);
- pjsip_msg_add_hdr(msg, (pjsip_hdr*)route);
- url = pjsip_sip_uri_create(pool, PJ_FALSE);
- route->name_addr.uri = (pjsip_uri*)url;
- url->host = pj_str("proxy.sipprovider.com");
-
- //"Route: <sip:proxy.supersip.com:5060>\r\n"
- route = pjsip_route_hdr_create(pool);
- pjsip_msg_add_hdr(msg, (pjsip_hdr*)route);
- url = pjsip_sip_uri_create(pool, PJ_FALSE);
- route->name_addr.uri = (pjsip_uri*)url;
- url->host = pj_str("proxy.supersip.com");
- url->port = 5060;
-
- //"Max-Forwards: 70\r\n"
- max_fwd = pjsip_max_fwd_hdr_create(pool, 70);
- pjsip_msg_add_hdr(msg, (pjsip_hdr*)max_fwd);
-
- //"To: Bob <sip:bob@biloxi.com>;tag=a6c85cf\r\n"
- to = pjsip_to_hdr_create(pool);
- pjsip_msg_add_hdr(msg, (pjsip_hdr*)to);
- name_addr = pjsip_name_addr_create(pool);
- name_addr->display = pj_str("Bob");
- to->uri = (pjsip_uri*)name_addr;
- url = pjsip_sip_uri_create(pool, PJ_FALSE);
- name_addr->uri = (pjsip_uri*)url;
- url->user = pj_str("bob");
- url->host = pj_str("biloxi.com");
- to->tag = pj_str("a6c85cf");
-
- //"From: Alice <sip:alice@atlanta.com>;tag=1928301774\r\n"
- from = pjsip_from_hdr_create(pool);
- pjsip_msg_add_hdr(msg, (pjsip_hdr*)from);
- name_addr = pjsip_name_addr_create(pool);
- name_addr->display = pj_str("Alice");
- from->uri = (pjsip_uri*)name_addr;
- url = pjsip_sip_uri_create(pool, PJ_FALSE);
- name_addr->uri = (pjsip_uri*)url;
- url->user = pj_str("alice");
- url->host = pj_str("atlanta.com");
- from->tag = pj_str("1928301774");
-
- //"Call-ID: a84b4c76e66710@pc33.atlanta.com\r\n"
- cid = pjsip_cid_hdr_create(pool);
- pjsip_msg_add_hdr(msg, (pjsip_hdr*)cid);
- cid->id = pj_str("a84b4c76e66710@pc33.atlanta.com");
-
- //"CSeq: 314159 INVITE\r\n"
- cseq = pjsip_cseq_hdr_create(pool);
- pjsip_msg_add_hdr(msg, (pjsip_hdr*)cseq);
- cseq->cseq = 314159;
- pjsip_method_set(&cseq->method, PJSIP_INVITE_METHOD);
-
- //"Contact: <sips:bob@192.0.2.4>\r\n"
- contact = pjsip_contact_hdr_create(pool);
- pjsip_msg_add_hdr(msg, (pjsip_hdr*)contact);
- name_addr = pjsip_name_addr_create(pool);
- contact->uri = (pjsip_uri*)name_addr;
- url = pjsip_sip_uri_create(pool, PJ_TRUE);
- name_addr->uri = (pjsip_uri*)url;
- url->user = pj_str("bob");
- url->host = pj_str("192.0.2.4");
-
- //"Content-Type: application/sdp\r\n"
- ctype = pjsip_ctype_hdr_create(pool);
- pjsip_msg_add_hdr(msg, (pjsip_hdr*)ctype);
- ctype->media.type = pj_str("application");
- ctype->media.subtype = pj_str("sdp");
-
- //"Content-Length: 150\r\n"
- clen = pjsip_clen_hdr_create(pool);
- pjsip_msg_add_hdr(msg, (pjsip_hdr*)clen);
- clen->len = 150;
-
- // Body
- body = PJ_POOL_ZALLOC_T(pool, pjsip_msg_body);
- msg->body = body;
- body->content_type.type = pj_str("application");
- body->content_type.subtype = pj_str("sdp");
- body->data = (void*)
- "v=0\r\n"
- "o=alice 53655765 2353687637 IN IP4 pc33.atlanta.com\r\n"
- "s=-\r\n"
- "t=0 0\r\n"
- "c=IN IP4 pc33.atlanta.com\r\n"
- "m=audio 3456 RTP/AVP 0 1 3 99\r\n"
- "a=rtpmap:0 PCMU/8000\r\n";
- body->len = pj_ansi_strlen((const char*) body->data);
- body->print_body = &pjsip_print_text_body;
-
- return msg;
-}
-
-/*****************************************************************************/
-
-static pj_status_t simple_test(void)
-{
- unsigned i;
- pj_status_t status;
-
- PJ_LOG(3,(THIS_FILE, " simple test.."));
- for (i=0; i<PJ_ARRAY_SIZE(test_array); ++i) {
- pj_pool_t *pool;
- pool = pjsip_endpt_create_pool(endpt, NULL, POOL_SIZE, POOL_SIZE);
- status = test_entry( pool, &test_array[i] );
- pjsip_endpt_release_pool(endpt, pool);
-
- if (status != PJ_SUCCESS)
- return status;
- }
-
- return PJ_SUCCESS;
-}
-
-
-#if INCLUDE_BENCHMARKS
-static int msg_benchmark(unsigned *p_detect, unsigned *p_parse,
- unsigned *p_print)
-{
- pj_status_t status;
- pj_pool_t *pool;
- int i, loop;
- pj_timestamp zero;
- pj_time_val elapsed;
- pj_highprec_t avg_detect, avg_parse, avg_print, kbytes;
-
-
- pj_bzero(&var, sizeof(var));
- zero.u64 = 0;
-
- for (loop=0; loop<LOOP; ++loop) {
- for (i=0; i<(int)PJ_ARRAY_SIZE(test_array); ++i) {
- pool = pjsip_endpt_create_pool(endpt, NULL, POOL_SIZE, POOL_SIZE);
- status = test_entry( pool, &test_array[i] );
- pjsip_endpt_release_pool(endpt, pool);
-
- if (status != PJ_SUCCESS)
- return status;
- }
- }
-
- kbytes = var.detect_len;
- pj_highprec_mod(kbytes, 1000000);
- pj_highprec_div(kbytes, 100000);
- elapsed = pj_elapsed_time(&zero, &var.detect_time);
- avg_detect = pj_elapsed_usec(&zero, &var.detect_time);
- pj_highprec_mul(avg_detect, AVERAGE_MSG_LEN);
- pj_highprec_div(avg_detect, var.detect_len);
- avg_detect = 1000000 / avg_detect;
-
- PJ_LOG(3,(THIS_FILE,
- " %u.%u MB detected in %d.%03ds (avg=%d msg detection/sec)",
- (unsigned)(var.detect_len/1000000), (unsigned)kbytes,
- elapsed.sec, elapsed.msec,
- (unsigned)avg_detect));
- *p_detect = (unsigned)avg_detect;
-
- kbytes = var.parse_len;
- pj_highprec_mod(kbytes, 1000000);
- pj_highprec_div(kbytes, 100000);
- elapsed = pj_elapsed_time(&zero, &var.parse_time);
- avg_parse = pj_elapsed_usec(&zero, &var.parse_time);
- pj_highprec_mul(avg_parse, AVERAGE_MSG_LEN);
- pj_highprec_div(avg_parse, var.parse_len);
- avg_parse = 1000000 / avg_parse;
-
- PJ_LOG(3,(THIS_FILE,
- " %u.%u MB parsed in %d.%03ds (avg=%d msg parsing/sec)",
- (unsigned)(var.parse_len/1000000), (unsigned)kbytes,
- elapsed.sec, elapsed.msec,
- (unsigned)avg_parse));
- *p_parse = (unsigned)avg_parse;
-
- kbytes = var.print_len;
- pj_highprec_mod(kbytes, 1000000);
- pj_highprec_div(kbytes, 100000);
- elapsed = pj_elapsed_time(&zero, &var.print_time);
- avg_print = pj_elapsed_usec(&zero, &var.print_time);
- pj_highprec_mul(avg_print, AVERAGE_MSG_LEN);
- pj_highprec_div(avg_print, var.print_len);
- avg_print = 1000000 / avg_print;
-
- PJ_LOG(3,(THIS_FILE,
- " %u.%u MB printed in %d.%03ds (avg=%d msg print/sec)",
- (unsigned)(var.print_len/1000000), (unsigned)kbytes,
- elapsed.sec, elapsed.msec,
- (unsigned)avg_print));
-
- *p_print = (unsigned)avg_print;
- return status;
-}
-#endif /* INCLUDE_BENCHMARKS */
-
-/*****************************************************************************/
-/* Test various header parsing and production */
-static int hdr_test_success(pjsip_hdr *h);
-static int hdr_test_accept0(pjsip_hdr *h);
-static int hdr_test_accept1(pjsip_hdr *h);
-static int hdr_test_accept2(pjsip_hdr *h);
-static int hdr_test_allow0(pjsip_hdr *h);
-static int hdr_test_authorization(pjsip_hdr *h);
-static int hdr_test_cid(pjsip_hdr *h);
-static int hdr_test_contact0(pjsip_hdr *h);
-static int hdr_test_contact1(pjsip_hdr *h);
-static int hdr_test_contact_q0(pjsip_hdr *h);
-static int hdr_test_contact_q1(pjsip_hdr *h);
-static int hdr_test_contact_q2(pjsip_hdr *h);
-static int hdr_test_contact_q3(pjsip_hdr *h);
-static int hdr_test_contact_q4(pjsip_hdr *h);
-static int hdr_test_content_length(pjsip_hdr *h);
-static int hdr_test_content_type(pjsip_hdr *h);
-static int hdr_test_from(pjsip_hdr *h);
-static int hdr_test_proxy_authenticate(pjsip_hdr *h);
-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);
-static int hdr_test_retry_after1(pjsip_hdr *h);
-static int hdr_test_subject_utf(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 SIMPLE_ADDR_SPEC "sip:host"
-#define ADDR_SPEC SIMPLE_ADDR_SPEC ";"PARAM_CHAR"="PARAM_CHAR ";p1=\";\""
-#define NAME_ADDR "<" ADDR_SPEC ">"
-
-#define HDR_FLAG_PARSE_FAIL 1
-#define HDR_FLAG_DONT_PRINT 2
-
-struct hdr_test_t
-{
- char *hname;
- char *hshort_name;
- char *hcontent;
- int (*test)(pjsip_hdr*);
- unsigned flags;
-} hdr_test_data[] =
-{
- {
- /* Empty Accept */
- "Accept", NULL,
- "",
- &hdr_test_accept0
- },
-
- {
- /* Overflowing generic string header */
- "Accept", NULL,
- "a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, " \
- "a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, " \
- "a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, " \
- "a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, " \
- "a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, " \
- "a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, " \
- "a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, " \
- "a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a",
- &hdr_test_success,
- HDR_FLAG_PARSE_FAIL
- },
-
- {
- /* Normal Accept */
- "Accept", NULL,
- "application/*, text/plain",
- &hdr_test_accept1
- },
-
- {
- /* Accept with params */
- "Accept", NULL,
- "application/*;p1=v1, text/plain",
- &hdr_test_accept2
- },
-
- {
- /* Empty Allow */
- "Allow", NULL,
- "",
- &hdr_test_allow0,
- },
-
- {
- /* Authorization, testing which params should be quoted */
- "Authorization", NULL,
- "Digest username=\"username\", realm=\"realm\", nonce=\"nonce\", " \
- "uri=\"sip:domain\", response=\"RESPONSE\", algorithm=MD5, " \
- "cnonce=\"CNONCE\", opaque=\"OPAQUE\", qop=auth, nc=00000001",
- &hdr_test_authorization
- },
-
- {
- /* Call ID */
- "Call-ID", "i",
- "-.!%*_+`'~()<>:\\\"/[]?{}",
- &hdr_test_cid,
- },
-
- {
- /* Parameter belong to hparam */
- "Contact", "m",
- SIMPLE_ADDR_SPEC ";p1=v1",
- &hdr_test_contact0,
- HDR_FLAG_DONT_PRINT
- },
-
- {
- /* generic-param in Contact header */
- "Contact", "m",
- NAME_ADDR ";" GENERIC_PARAM,
- &hdr_test_contact1
- },
-
- {
- /* q=0 parameter in Contact header */
- "Contact", "m",
- NAME_ADDR ";q=0",
- &hdr_test_contact_q0,
- HDR_FLAG_DONT_PRINT
- },
-
- {
- /* q=0.5 parameter in Contact header */
- "Contact", "m",
- NAME_ADDR ";q=0.5",
- &hdr_test_contact_q1
- },
-
- {
- /* q=1 parameter in Contact header */
- "Contact", "m",
- NAME_ADDR ";q=1",
- &hdr_test_contact_q2
- },
-
- {
- /* q=1.0 parameter in Contact header */
- "Contact", "m",
- NAME_ADDR ";q=1.0",
- &hdr_test_contact_q3,
- HDR_FLAG_DONT_PRINT
- },
-
- {
- /* q=1.1 parameter in Contact header */
- "Contact", "m",
- NAME_ADDR ";q=1.15",
- &hdr_test_contact_q4
- },
-
- {
- /* Content-Length */
- "Content-Length", "l",
- "10",
- &hdr_test_content_length
- },
-
- {
- /* Content-Type, with generic-param */
- "Content-Type", "c",
- "application/sdp" ";" GENERIC_PARAM,
- &hdr_test_content_type,
- HDR_FLAG_DONT_PRINT
- },
-
- {
- /* From, testing parameters and generic-param */
- "From", "f",
- NAME_ADDR ";" GENERIC_PARAM,
- &hdr_test_from
- },
-
- {
- /* Proxy-Authenticate, testing which params should be quoted */
- "Proxy-Authenticate", NULL,
- "Digest realm=\"realm\",domain=\"sip:domain\",nonce=\"nonce\"," \
- "opaque=\"opaque\",stale=true,algorithm=MD5,qop=\"auth\"",
- &hdr_test_proxy_authenticate
- },
-
- {
- /* Record-Route, param belong to header */
- "Record-Route", NULL,
- NAME_ADDR ";" GENERIC_PARAM,
- &hdr_test_record_route
- },
-
- {
- /* Empty Supported */
- "Supported", "k",
- "",
- &hdr_test_supported,
- },
-
- {
- /* To */
- "To", "t",
- NAME_ADDR ";" GENERIC_PARAM,
- &hdr_test_to
- },
-
- {
- /* Via */
- "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
- },
-
- {
- /* Retry-After header with comment */
- "Retry-After", NULL,
- "10(Already Pending Register)",
- &hdr_test_retry_after1
- },
-
- {
- /* Non-ASCII UTF-8 characters in Subject */
- "Subject", NULL,
- "\xC0\x81",
- &hdr_test_subject_utf
- }
-};
-
-static int hdr_test_success(pjsip_hdr *h)
-{
- PJ_UNUSED_ARG(h);
- return 0;
-}
-
-/* "" */
-static int hdr_test_accept0(pjsip_hdr *h)
-{
- pjsip_accept_hdr *hdr = (pjsip_accept_hdr*)h;
-
- if (h->type != PJSIP_H_ACCEPT)
- return -1010;
-
- if (hdr->count != 0)
- return -1020;
-
- return 0;
-}
-
-/* "application/ *, text/plain\r\n" */
-static int hdr_test_accept1(pjsip_hdr *h)
-{
- pjsip_accept_hdr *hdr = (pjsip_accept_hdr*)h;
-
- if (h->type != PJSIP_H_ACCEPT)
- return -1110;
-
- if (hdr->count != 2)
- return -1120;
-
- if (pj_strcmp2(&hdr->values[0], "application/*"))
- return -1130;
-
- if (pj_strcmp2(&hdr->values[1], "text/plain"))
- return -1140;
-
- return 0;
-}
-
-/* "application/ *;p1=v1, text/plain\r\n" */
-static int hdr_test_accept2(pjsip_hdr *h)
-{
- pjsip_accept_hdr *hdr = (pjsip_accept_hdr*)h;
-
- if (h->type != PJSIP_H_ACCEPT)
- return -1210;
-
- if (hdr->count != 2)
- return -1220;
-
- if (pj_strcmp2(&hdr->values[0], "application/*;p1=v1"))
- return -1230;
-
- if (pj_strcmp2(&hdr->values[1], "text/plain"))
- return -1240;
-
- return 0;
-}
-
-/* "" */
-static int hdr_test_allow0(pjsip_hdr *h)
-{
- pjsip_allow_hdr *hdr = (pjsip_allow_hdr*)h;
-
- if (h->type != PJSIP_H_ALLOW)
- return -1310;
-
- if (hdr->count != 0)
- return -1320;
-
- return 0;
-
-}
-
-
-/*
- "Digest username=\"username\", realm=\"realm\", nonce=\"nonce\", " \
- "uri=\"sip:domain\", response=\"RESPONSE\", algorithm=MD5, " \
- "cnonce=\"CNONCE\", opaque=\"OPAQUE\", qop=auth, nc=00000001",
- */
-static int hdr_test_authorization(pjsip_hdr *h)
-{
- pjsip_authorization_hdr *hdr = (pjsip_authorization_hdr*)h;
-
- if (h->type != PJSIP_H_AUTHORIZATION)
- return -1410;
-
- if (pj_strcmp2(&hdr->scheme, "Digest"))
- return -1420;
-
- if (pj_strcmp2(&hdr->credential.digest.username, "username"))
- return -1421;
-
- if (pj_strcmp2(&hdr->credential.digest.realm, "realm"))
- return -1422;
-
- if (pj_strcmp2(&hdr->credential.digest.nonce, "nonce"))
- return -1423;
-
- if (pj_strcmp2(&hdr->credential.digest.uri, "sip:domain"))
- return -1424;
-
- if (pj_strcmp2(&hdr->credential.digest.response, "RESPONSE"))
- return -1425;
-
- if (pj_strcmp2(&hdr->credential.digest.algorithm, "MD5"))
- return -1426;
-
- if (pj_strcmp2(&hdr->credential.digest.cnonce, "CNONCE"))
- return -1427;
-
- if (pj_strcmp2(&hdr->credential.digest.opaque, "OPAQUE"))
- return -1428;
-
- if (pj_strcmp2(&hdr->credential.digest.qop, "auth"))
- return -1429;
-
- if (pj_strcmp2(&hdr->credential.digest.nc, "00000001"))
- return -1430;
-
- return 0;
-}
-
-
-/*
- "-.!%*_+`'~()<>:\\\"/[]?{}\r\n"
- */
-static int hdr_test_cid(pjsip_hdr *h)
-{
- pjsip_cid_hdr *hdr = (pjsip_cid_hdr*)h;
-
- if (h->type != PJSIP_H_CALL_ID)
- return -1510;
-
- if (pj_strcmp2(&hdr->id, "-.!%*_+`'~()<>:\\\"/[]?{}"))
- return -1520;
-
- return 0;
-}
-
-/*
- #define SIMPLE_ADDR_SPEC "sip:host"
- */
-static int test_simple_addr_spec(pjsip_uri *uri)
-{
- pjsip_sip_uri *sip_uri = (pjsip_sip_uri *)pjsip_uri_get_uri(uri);
-
- if (!PJSIP_URI_SCHEME_IS_SIP(uri))
- return -900;
-
- if (pj_strcmp2(&sip_uri->host, "host"))
- return -910;
-
- if (sip_uri->port != 0)
- return -920;
-
- return 0;
-}
-
-/*
-#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 ">"
- */
-static int nameaddr_test(void *uri)
-{
- pjsip_sip_uri *sip_uri=(pjsip_sip_uri *)pjsip_uri_get_uri((pjsip_uri*)uri);
- pjsip_param *param;
- int rc;
-
- if (!PJSIP_URI_SCHEME_IS_SIP(uri))
- return -930;
-
- rc = test_simple_addr_spec((pjsip_uri*)sip_uri);
- if (rc != 0)
- return rc;
-
- if (pj_list_size(&sip_uri->other_param) != 2)
- return -940;
-
- param = sip_uri->other_param.next;
-
- if (pj_strcmp2(&param->name, PARAM_CHAR))
- return -942;
-
- if (pj_strcmp2(&param->value, PARAM_CHAR))
- return -943;
-
- param = param->next;
- if (pj_strcmp2(&param->name, "p1"))
- return -942;
- if (pj_strcmp2(&param->value, "\";\""))
- return -943;
-
- return 0;
-}
-
-/*
-#define GENERIC_PARAM "p0=a;p1=\"ab:;cd\";p2=ab%3acd;p3"
- */
-static int generic_param_test(pjsip_param *param_head)
-{
- pjsip_param *param;
-
- if (pj_list_size(param_head) != 4)
- return -950;
-
- param = param_head->next;
-
- if (pj_strcmp2(&param->name, "p0"))
- return -952;
- if (pj_strcmp2(&param->value, "a"))
- return -953;
-
- param = param->next;
- if (pj_strcmp2(&param->name, "p1"))
- return -954;
- if (pj_strcmp2(&param->value, "\"ab:;cd\""))
- return -955;
-
- param = param->next;
- if (pj_strcmp2(&param->name, "p2"))
- return -956;
- if (pj_strcmp2(&param->value, "ab:cd"))
- return -957;
-
- param = param->next;
- if (pj_strcmp2(&param->name, "p3"))
- return -958;
- if (pj_strcmp2(&param->value, ""))
- return -959;
-
- return 0;
-}
-
-
-
-/*
- SIMPLE_ADDR_SPEC ";p1=v1\r\n"
- */
-static int hdr_test_contact0(pjsip_hdr *h)
-{
- pjsip_contact_hdr *hdr = (pjsip_contact_hdr*)h;
- pjsip_param *param;
- int rc;
-
- if (h->type != PJSIP_H_CONTACT)
- return -1610;
-
- rc = test_simple_addr_spec(hdr->uri);
- if (rc != 0)
- return rc;
-
- if (pj_list_size(&hdr->other_param) != 1)
- return -1620;
-
- param = hdr->other_param.next;
-
- if (pj_strcmp2(&param->name, "p1"))
- return -1630;
-
- if (pj_strcmp2(&param->value, "v1"))
- return -1640;
-
- return 0;
-}
-
-/*
- NAME_ADDR GENERIC_PARAM "\r\n",
- */
-static int hdr_test_contact1(pjsip_hdr *h)
-{
- pjsip_contact_hdr *hdr = (pjsip_contact_hdr*)h;
- int rc;
-
- if (h->type != PJSIP_H_CONTACT)
- return -1710;
-
- rc = nameaddr_test(hdr->uri);
- if (rc != 0)
- return rc;
-
- rc = generic_param_test(&hdr->other_param);
- if (rc != 0)
- return rc;
-
- return 0;
-}
-
-/*
- NAME_ADDR ";q=0"
- */
-static int hdr_test_contact_q0(pjsip_hdr *h)
-{
- pjsip_contact_hdr *hdr = (pjsip_contact_hdr*)h;
- int rc;
-
- if (h->type != PJSIP_H_CONTACT)
- return -1710;
-
- rc = nameaddr_test(hdr->uri);
- if (rc != 0)
- return rc;
-
- if (hdr->q1000 != 0)
- return -1711;
-
- return 0;
-}
-
-/*
- NAME_ADDR ";q=0.5"
- */
-static int hdr_test_contact_q1(pjsip_hdr *h)
-{
- pjsip_contact_hdr *hdr = (pjsip_contact_hdr*)h;
- int rc;
-
- if (h->type != PJSIP_H_CONTACT)
- return -1710;
-
- rc = nameaddr_test(hdr->uri);
- if (rc != 0)
- return rc;
-
- if (hdr->q1000 != 500)
- return -1712;
-
- return 0;
-}
-
-/*
- NAME_ADDR ";q=1"
- */
-static int hdr_test_contact_q2(pjsip_hdr *h)
-{
- pjsip_contact_hdr *hdr = (pjsip_contact_hdr*)h;
- int rc;
-
- if (h->type != PJSIP_H_CONTACT)
- return -1710;
-
- rc = nameaddr_test(hdr->uri);
- if (rc != 0)
- return rc;
-
- if (hdr->q1000 != 1000)
- return -1713;
-
- return 0;
-}
-
-/*
- NAME_ADDR ";q=1.0"
- */
-static int hdr_test_contact_q3(pjsip_hdr *h)
-{
- pjsip_contact_hdr *hdr = (pjsip_contact_hdr*)h;
- int rc;
-
- if (h->type != PJSIP_H_CONTACT)
- return -1710;
-
- rc = nameaddr_test(hdr->uri);
- if (rc != 0)
- return rc;
-
- if (hdr->q1000 != 1000)
- return -1714;
-
- return 0;
-}
-
-/*
- NAME_ADDR ";q=1.15"
- */
-static int hdr_test_contact_q4(pjsip_hdr *h)
-{
- pjsip_contact_hdr *hdr = (pjsip_contact_hdr*)h;
- int rc;
-
- if (h->type != PJSIP_H_CONTACT)
- return -1710;
-
- rc = nameaddr_test(hdr->uri);
- if (rc != 0)
- return rc;
-
- if (hdr->q1000 != 1150)
- return -1715;
-
- return 0;
-}
-
-/*
- "10"
- */
-static int hdr_test_content_length(pjsip_hdr *h)
-{
- pjsip_clen_hdr *hdr = (pjsip_clen_hdr*)h;
-
- if (h->type != PJSIP_H_CONTENT_LENGTH)
- return -1810;
-
- if (hdr->len != 10)
- return -1820;
-
- return 0;
-}
-
-/*
- "application/sdp" GENERIC_PARAM,
- */
-static int hdr_test_content_type(pjsip_hdr *h)
-{
- pjsip_ctype_hdr *hdr = (pjsip_ctype_hdr*)h;
-
- if (h->type != PJSIP_H_CONTENT_TYPE)
- return -1910;
-
- if (pj_strcmp2(&hdr->media.type, "application"))
- return -1920;
-
- if (pj_strcmp2(&hdr->media.subtype, "sdp"))
- return -1930;
-
- /* Currently, if the media parameter contains escaped characters,
- * pjsip will print the parameter unescaped.
- */
- PJ_TODO(FIX_PARAMETER_IN_MEDIA_TYPE);
-
- if (pj_strcmp2(&hdr->media.param, ";" GENERIC_PARAM_PARSED))
- return -1940;
-
- return 0;
-}
-
-/*
- NAME_ADDR GENERIC_PARAM,
- */
-static int hdr_test_from(pjsip_hdr *h)
-{
- pjsip_from_hdr *hdr = (pjsip_from_hdr*)h;
- int rc;
-
- if (h->type != PJSIP_H_FROM)
- return -2010;
-
- rc = nameaddr_test(hdr->uri);
- if (rc != 0)
- return rc;
-
- rc = generic_param_test(&hdr->other_param);
- if (rc != 0)
- return rc;
-
- return 0;
-}
-
-/*
- "Digest realm=\"realm\", domain=\"sip:domain\", nonce=\"nonce\", " \
- "opaque=\"opaque\", stale=true, algorithm=MD5, qop=\"auth\"",
- */
-static int hdr_test_proxy_authenticate(pjsip_hdr *h)
-{
- pjsip_proxy_authenticate_hdr *hdr = (pjsip_proxy_authenticate_hdr*)h;
-
- if (h->type != PJSIP_H_PROXY_AUTHENTICATE)
- return -2110;
-
- if (pj_strcmp2(&hdr->scheme, "Digest"))
- return -2120;
-
- if (pj_strcmp2(&hdr->challenge.digest.realm, "realm"))
- return -2130;
-
- if (pj_strcmp2(&hdr->challenge.digest.domain, "sip:domain"))
- return -2140;
-
- if (pj_strcmp2(&hdr->challenge.digest.nonce, "nonce"))
- return -2150;
-
- if (pj_strcmp2(&hdr->challenge.digest.opaque, "opaque"))
- return -2160;
-
- if (hdr->challenge.digest.stale != 1)
- return -2170;
-
- if (pj_strcmp2(&hdr->challenge.digest.algorithm, "MD5"))
- return -2180;
-
- if (pj_strcmp2(&hdr->challenge.digest.qop, "auth"))
- return -2190;
-
- return 0;
-}
-
-/*
- NAME_ADDR GENERIC_PARAM,
- */
-static int hdr_test_record_route(pjsip_hdr *h)
-{
- pjsip_rr_hdr *hdr = (pjsip_rr_hdr*)h;
- int rc;
-
- if (h->type != PJSIP_H_RECORD_ROUTE)
- return -2210;
-
- rc = nameaddr_test(&hdr->name_addr);
- if (rc != 0)
- return rc;
-
- rc = generic_param_test(&hdr->other_param);
- if (rc != 0)
- return rc;
-
- return 0;
-
-}
-
-/*
- " \r\n"
- */
-static int hdr_test_supported(pjsip_hdr *h)
-{
- pjsip_supported_hdr *hdr = (pjsip_supported_hdr*)h;
-
- if (h->type != PJSIP_H_SUPPORTED)
- return -2310;
-
- if (hdr->count != 0)
- return -2320;
-
- return 0;
-}
-
-/*
- NAME_ADDR GENERIC_PARAM,
- */
-static int hdr_test_to(pjsip_hdr *h)
-{
- pjsip_to_hdr *hdr = (pjsip_to_hdr*)h;
- int rc;
-
- if (h->type != PJSIP_H_TO)
- return -2410;
-
- rc = nameaddr_test(hdr->uri);
- if (rc != 0)
- return rc;
-
- rc = generic_param_test(&hdr->other_param);
- if (rc != 0)
- return rc;
-
- return 0;
-}
-
-/*
- "SIP/2.0 host" GENERIC_PARAM
- */
-static int hdr_test_via(pjsip_hdr *h)
-{
- pjsip_via_hdr *hdr = (pjsip_via_hdr*)h;
- int rc;
-
- if (h->type != PJSIP_H_VIA)
- return -2510;
-
- if (pj_strcmp2(&hdr->transport, "XYZ"))
- return -2515;
-
- if (pj_strcmp2(&hdr->sent_by.host, "host"))
- return -2520;
-
- if (hdr->sent_by.port != 0)
- return -2530;
-
- rc = generic_param_test(&hdr->other_param);
- if (rc != 0)
- return rc;
-
- return 0;
-}
-
-
-/*
- "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;
-}
-
-/* "10(Already Pending Register)" */
-static int hdr_test_retry_after1(pjsip_hdr *h)
-{
- pjsip_retry_after_hdr *hdr = (pjsip_retry_after_hdr*)h;
-
- if (h->type != PJSIP_H_RETRY_AFTER)
- return -2910;
-
- if (hdr->ivalue != 10)
- return -2920;
-
- if (pj_strcmp2(&hdr->comment, "Already Pending Register"))
- return -2930;
-
- return 0;
-}
-
-/* Subject: \xC0\x81 */
-static int hdr_test_subject_utf(pjsip_hdr *h)
-{
- pjsip_subject_hdr *hdr = (pjsip_subject_hdr*)h;
-
- if (pj_strcmp2(&h->name, "Subject"))
- return -2950;
-
- if (pj_strcmp2(&hdr->hvalue, "\xC0\x81"))
- return -2960;
-
- return 0;
-}
-
-static int hdr_test(void)
-{
- unsigned i;
-
- PJ_LOG(3,(THIS_FILE, " testing header parsing.."));
-
- for (i=0; i<PJ_ARRAY_SIZE(hdr_test_data); ++i) {
- struct hdr_test_t *test = &hdr_test_data[i];
- pj_str_t hname;
- int len, parsed_len;
- pj_pool_t *pool;
- pjsip_hdr *parsed_hdr1=NULL, *parsed_hdr2=NULL;
- char *input, *output;
-#if defined(PJSIP_UNESCAPE_IN_PLACE) && PJSIP_UNESCAPE_IN_PLACE!=0
- static char hcontent[1024];
-#else
- char *hcontent;
-#endif
- int rc;
-
- pool = pjsip_endpt_create_pool(endpt, NULL, POOL_SIZE, POOL_SIZE);
-
- /* Parse the header */
- hname = pj_str(test->hname);
- len = strlen(test->hcontent);
-#if defined(PJSIP_UNESCAPE_IN_PLACE) && PJSIP_UNESCAPE_IN_PLACE!=0
- PJ_ASSERT_RETURN(len < sizeof(hcontent), PJSIP_EMSGTOOLONG);
- strcpy(hcontent, test->hcontent);
-#else
- hcontent = test->hcontent;
-#endif
-
- parsed_hdr1 = (pjsip_hdr*) pjsip_parse_hdr(pool, &hname,
- hcontent, len,
- &parsed_len);
- if (parsed_hdr1 == NULL) {
- if (test->flags & HDR_FLAG_PARSE_FAIL) {
- pj_pool_release(pool);
- continue;
- }
- PJ_LOG(3,(THIS_FILE, " error parsing header %s: %s", test->hname, test->hcontent));
- return -500;
- }
-
- /* Test the parsing result */
- if (test->test && (rc=test->test(parsed_hdr1)) != 0) {
- PJ_LOG(3,(THIS_FILE, " validation failed for header %s: %s", test->hname, test->hcontent));
- PJ_LOG(3,(THIS_FILE, " error code is %d", rc));
- return -502;
- }
-
-#if 1
- /* Parse with hshortname, if present */
- if (test->hshort_name) {
- hname = pj_str(test->hshort_name);
- len = strlen(test->hcontent);
-#if defined(PJSIP_UNESCAPE_IN_PLACE) && PJSIP_UNESCAPE_IN_PLACE!=0
- PJ_ASSERT_RETURN(len < sizeof(hcontent), PJSIP_EMSGTOOLONG);
- strcpy(hcontent, test->hcontent);
-#else
- hcontent = test->hcontent;
-#endif
-
- parsed_hdr2 = (pjsip_hdr*) pjsip_parse_hdr(pool, &hname, hcontent, len, &parsed_len);
- if (parsed_hdr2 == NULL) {
- PJ_LOG(3,(THIS_FILE, " error parsing header %s: %s", test->hshort_name, test->hcontent));
- return -510;
- }
- }
-#endif
-
- if (test->flags & HDR_FLAG_DONT_PRINT) {
- pj_pool_release(pool);
- continue;
- }
-
- /* Print the original header */
- input = (char*) pj_pool_alloc(pool, 1024);
- len = pj_ansi_snprintf(input, 1024, "%s: %s", test->hname, test->hcontent);
- if (len < 1 || len >= 1024)
- return -520;
-
- /* Print the parsed header*/
- output = (char*) pj_pool_alloc(pool, 1024);
- len = pjsip_hdr_print_on(parsed_hdr1, output, 1024);
- if (len < 1 || len >= 1024) {
- PJ_LOG(3,(THIS_FILE, " header too long: %s: %s", test->hname, test->hcontent));
- return -530;
- }
- output[len] = 0;
-
- if (strcmp(input, output) != 0) {
- PJ_LOG(3,(THIS_FILE, " header character by character comparison failed."));
- PJ_LOG(3,(THIS_FILE, " original header=|%s|", input));
- PJ_LOG(3,(THIS_FILE, " parsed header =|%s|", output));
- return -540;
- }
-
- pj_pool_release(pool);
- }
-
- return 0;
-}
-
-
-/*****************************************************************************/
-
-int msg_test(void)
-{
- enum { COUNT = 1, DETECT=0, PARSE=1, PRINT=2 };
- struct {
- unsigned detect;
- unsigned parse;
- unsigned print;
- } run[COUNT];
- unsigned i, max, avg_len;
- char desc[250];
- pj_status_t 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);
- if (status != PJ_SUCCESS)
- return status;
- }
-
- /* Calculate average message length */
- for (i=0, avg_len=0; i<PJ_ARRAY_SIZE(test_array); ++i) {
- avg_len += test_array[i].len;
- }
- avg_len /= PJ_ARRAY_SIZE(test_array);
-
-
- /* Print maximum detect/sec */
- for (i=0, max=0; i<COUNT; ++i)
- if (run[i].detect > max) max = run[i].detect;
-
- PJ_LOG(3,("", " Maximum message detection/sec=%u", max));
-
- pj_ansi_sprintf(desc, "Number of SIP messages "
- "can be pre-parse by <tt>pjsip_find_msg()</tt> "
- "per second (tested with %d message sets with "
- "average message length of "
- "%d bytes)", (int)PJ_ARRAY_SIZE(test_array), avg_len);
- report_ival("msg-detect-per-sec", max, "msg/sec", desc);
-
- /* Print maximum parse/sec */
- for (i=0, max=0; i<COUNT; ++i)
- if (run[i].parse > max) max = run[i].parse;
-
- PJ_LOG(3,("", " Maximum message parsing/sec=%u", max));
-
- pj_ansi_sprintf(desc, "Number of SIP messages "
- "can be <b>parsed</b> by <tt>pjsip_parse_msg()</tt> "
- "per second (tested with %d message sets with "
- "average message length of "
- "%d bytes)", (int)PJ_ARRAY_SIZE(test_array), avg_len);
- report_ival("msg-parse-per-sec", max, "msg/sec", desc);
-
- /* Msg parsing bandwidth */
- report_ival("msg-parse-bandwidth-mb", avg_len*max/1000000, "MB/sec",
- "Message parsing bandwidth in megabytes (number of megabytes"
- " worth of SIP messages that can be parsed per second). "
- "The value is derived from msg-parse-per-sec above.");
-
-
- /* Print maximum print/sec */
- for (i=0, max=0; i<COUNT; ++i)
- if (run[i].print > max) max = run[i].print;
-
- PJ_LOG(3,("", " Maximum message print/sec=%u", max));
-
- pj_ansi_sprintf(desc, "Number of SIP messages "
- "can be <b>printed</b> by <tt>pjsip_msg_print()</tt>"
- " per second (tested with %d message sets with "
- "average message length of "
- "%d bytes)", (int)PJ_ARRAY_SIZE(test_array), avg_len);
-
- report_ival("msg-print-per-sec", max, "msg/sec", desc);
-
- /* Msg print bandwidth */
- report_ival("msg-printed-bandwidth-mb", avg_len*max/1000000, "MB/sec",
- "Message print bandwidth in megabytes (total size of "
- "SIP messages printed per second). "
- "The value is derived from msg-print-per-sec above.");
-
-#endif /* INCLUDE_BENCHMARKS */
-
- return PJ_SUCCESS;
-}
-
-
-
-