blob: 4a27ca844b93d2c346e6aa05e8df9426357d9fc9 [file] [log] [blame]
Benny Prijono5dcb38d2005-11-21 01:55:47 +00001/* $Id$ */
2/*
3 * Copyright (C) 2003-2006 Benny Prijono <benny@prijono.org>
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 */
19#include "test.h"
Benny Prijono40f2f642006-01-30 18:40:05 +000020#include <pjsip.h>
Benny Prijono5dcb38d2005-11-21 01:55:47 +000021#include <pjlib.h>
22
Benny Prijono3818c932005-11-22 01:06:33 +000023#define POOL_SIZE 8000
Benny Prijonoe93e2872006-06-28 16:46:49 +000024#if defined(PJ_DEBUG) && PJ_DEBUG!=0
25# define LOOP 10000
26#else
27# define LOOP 100000
28#endif
Benny Prijono3818c932005-11-22 01:06:33 +000029#define AVERAGE_MSG_LEN 800
Benny Prijono85598d92006-01-07 18:44:25 +000030#define THIS_FILE "msg_test.c"
Benny Prijono3818c932005-11-22 01:06:33 +000031
Benny Prijono5dcb38d2005-11-21 01:55:47 +000032static pjsip_msg *create_msg0(pj_pool_t *pool);
Benny Prijono3818c932005-11-22 01:06:33 +000033static pjsip_msg *create_msg1(pj_pool_t *pool);
34
35#define STATUS_PARTIAL 1
36#define STATUS_SYNTAX_ERROR 2
37
38#define FLAG_DETECT_ONLY 1
39#define FLAG_PARSE_ONLY 4
40#define FLAG_PRINT_ONLY 8
41
Benny Prijono5dcb38d2005-11-21 01:55:47 +000042struct test_msg
43{
44 char msg[1024];
45 pjsip_msg *(*creator)(pj_pool_t *pool);
46 pj_size_t len;
Benny Prijono3818c932005-11-22 01:06:33 +000047 int expected_status;
Benny Prijono5dcb38d2005-11-21 01:55:47 +000048} test_array[] =
49{
Benny Prijono3818c932005-11-22 01:06:33 +000050{
51 /* 'Normal' message with all headers. */
52 "INVITE sip:user@foo SIP/2.0\n"
Benny Prijonob6eab2c2006-07-03 22:08:47 +000053 "from: Hi I'm Joe <sip:joe.user@bar.otherdomain.com>;tag=123457890123456\r"
Benny Prijono3818c932005-11-22 01:06:33 +000054 "To: Fellow User <sip:user@foo.bar.domain.com>\r\n"
55 "Call-ID: 12345678901234567890@bar\r\n"
56 "Content-Length: 0\r\n"
57 "CSeq: 123456 INVITE\n"
58 "Contact: <sip:joe@bar> ; q=0.5;expires=3600,sip:user@host;q=0.500\r"
59 " ,sip:user2@host2\n"
60 "Content-Type: text/html ; charset=ISO-8859-4\r"
61 "Route: <sip:bigbox3.site3.atlanta.com;lr>,\r\n"
62 " <sip:server10.biloxi.com;lr>\r"
Benny Prijonofa73e3e2006-01-05 23:35:46 +000063 "Record-Route: <sip:server10.biloxi.com>,\r\n" /* multiple routes+folding*/
Benny Prijono3818c932005-11-22 01:06:33 +000064 " <sip:bigbox3.site3.atlanta.com;lr>\n"
Benny Prijonofa73e3e2006-01-05 23:35:46 +000065 "Via: SIP/2.0/SCTP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c230\n"
66 "Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8\n" /* folding. */
Benny Prijono3818c932005-11-22 01:06:33 +000067 " ;received=192.0.2.1\r\n"
68 "Via: SIP/2.0/UDP 10.2.1.1, SIP/2.0/TCP 192.168.1.1\n"
69 "Organization: \r"
70 "Max-Forwards: 70\n"
Benny Prijonofa73e3e2006-01-05 23:35:46 +000071 "X-Header: \r\n" /* empty header */
72 "P-Associated-URI:\r\n" /* empty header without space */
Benny Prijono3818c932005-11-22 01:06:33 +000073 "\r\n",
74 &create_msg0,
75 PJ_SUCCESS
76},
77{
78 /* Typical response message. */
79 "SIP/2.0 200 OK\r\n"
80 "Via: SIP/2.0/SCTP server10.biloxi.com;branch=z9hG4bKnashds8;rport;received=192.0.2.1\r\n"
81 "Via: SIP/2.0/UDP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1;received=192.0.2.2\r\n"
82 "Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bK776asdhds ;received=192.0.2.3\r\n"
83 "Route: <sip:proxy.sipprovider.com>\r\n"
84 "Route: <sip:proxy.supersip.com:5060>\r\n"
85 "Max-Forwards: 70\r\n"
86 "To: Bob <sip:bob@biloxi.com>;tag=a6c85cf\r\n"
87 "From: Alice <sip:alice@atlanta.com>;tag=1928301774\r\n"
88 "Call-ID: a84b4c76e66710@pc33.atlanta.com\r\n"
89 "CSeq: 314159 INVITE\r\n"
90 "Contact: <sips:bob@192.0.2.4>\r\n"
91 "Content-Type: application/sdp\r\n"
92 "Content-Length: 150\r\n"
93 "\r\n"
94 "v=0\r\n"
95 "o=alice 53655765 2353687637 IN IP4 pc33.atlanta.com\r\n"
96 "s=-\r\n"
97 "t=0 0\r\n"
98 "c=IN IP4 pc33.atlanta.com\r\n"
99 "m=audio 3456 RTP/AVP 0 1 3 99\r\n"
100 "a=rtpmap:0 PCMU/8000\r\n",
101 &create_msg1,
102 PJ_SUCCESS
103}
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000104};
105
Benny Prijonoe93e2872006-06-28 16:46:49 +0000106static struct
107{
108 int flag;
109 pj_highprec_t detect_len, parse_len, print_len;
110 pj_timestamp detect_time, parse_time, print_time;
111} var;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000112
113static pj_status_t test_entry( pj_pool_t *pool, struct test_msg *entry )
114{
Benny Prijonoe960bb52007-01-21 17:53:39 +0000115 pjsip_msg *parsed_msg, *ref_msg = NULL;
Benny Prijonocec5f4a2005-11-22 23:51:50 +0000116 static pjsip_msg *print_msg;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000117 pj_status_t status = PJ_SUCCESS;
118 int len;
119 pj_str_t str1, str2;
120 pjsip_hdr *hdr1, *hdr2;
121 pj_timestamp t1, t2;
Benny Prijono3818c932005-11-22 01:06:33 +0000122 pjsip_parser_err_report err_list;
123 pj_size_t msg_size;
124 char msgbuf1[PJSIP_MAX_PKT_LEN];
125 char msgbuf2[PJSIP_MAX_PKT_LEN];
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000126 enum { BUFLEN = 512 };
Benny Prijono3818c932005-11-22 01:06:33 +0000127
128 entry->len = pj_native_strlen(entry->msg);
129
Benny Prijonoe93e2872006-06-28 16:46:49 +0000130 if (var.flag & FLAG_PARSE_ONLY)
Benny Prijono3818c932005-11-22 01:06:33 +0000131 goto parse_msg;
Benny Prijonocec5f4a2005-11-22 23:51:50 +0000132
Benny Prijonoe93e2872006-06-28 16:46:49 +0000133 if (var.flag & FLAG_PRINT_ONLY) {
Benny Prijonocec5f4a2005-11-22 23:51:50 +0000134 if (print_msg == NULL)
135 print_msg = entry->creator(pool);
Benny Prijono3818c932005-11-22 01:06:33 +0000136 goto print_msg;
Benny Prijonocec5f4a2005-11-22 23:51:50 +0000137 }
Benny Prijono3818c932005-11-22 01:06:33 +0000138
139 /* Detect message. */
Benny Prijonoe93e2872006-06-28 16:46:49 +0000140 var.detect_len = var.detect_len + entry->len;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000141 pj_get_timestamp(&t1);
Benny Prijono3818c932005-11-22 01:06:33 +0000142 status = pjsip_find_msg(entry->msg, entry->len, PJ_FALSE, &msg_size);
143 if (status != PJ_SUCCESS) {
144 if (status!=PJSIP_EPARTIALMSG ||
145 entry->expected_status!=STATUS_PARTIAL)
146 {
147 app_perror(" error: unable to detect message", status);
148 return -5;
149 }
150 }
151 if (msg_size != entry->len) {
Benny Prijono85598d92006-01-07 18:44:25 +0000152 PJ_LOG(3,(THIS_FILE, " error: size mismatch"));
Benny Prijono3818c932005-11-22 01:06:33 +0000153 return -6;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000154 }
155 pj_get_timestamp(&t2);
Benny Prijono3818c932005-11-22 01:06:33 +0000156 pj_sub_timestamp(&t2, &t1);
Benny Prijonoe93e2872006-06-28 16:46:49 +0000157 pj_add_timestamp(&var.detect_time, &t2);
Benny Prijono3818c932005-11-22 01:06:33 +0000158
Benny Prijonoe93e2872006-06-28 16:46:49 +0000159 if (var.flag & FLAG_DETECT_ONLY)
Benny Prijono3818c932005-11-22 01:06:33 +0000160 return PJ_SUCCESS;
161
162 /* Parse message. */
163parse_msg:
Benny Prijonoe93e2872006-06-28 16:46:49 +0000164 var.parse_len = var.parse_len + entry->len;
Benny Prijono3818c932005-11-22 01:06:33 +0000165 pj_get_timestamp(&t1);
166 pj_list_init(&err_list);
167 parsed_msg = pjsip_parse_msg(pool, entry->msg, entry->len, &err_list);
168 if (parsed_msg == NULL) {
169 if (entry->expected_status != STATUS_SYNTAX_ERROR) {
170 status = -10;
171 if (err_list.next != &err_list) {
Benny Prijono85598d92006-01-07 18:44:25 +0000172 PJ_LOG(3,(THIS_FILE, " Syntax error in line %d col %d",
Benny Prijono3818c932005-11-22 01:06:33 +0000173 err_list.next->line, err_list.next->col));
174 }
175 goto on_return;
176 }
177 }
178 pj_get_timestamp(&t2);
179 pj_sub_timestamp(&t2, &t1);
Benny Prijonoe93e2872006-06-28 16:46:49 +0000180 pj_add_timestamp(&var.parse_time, &t2);
Benny Prijono3818c932005-11-22 01:06:33 +0000181
Benny Prijonoe93e2872006-06-28 16:46:49 +0000182 if (var.flag & FLAG_PARSE_ONLY)
Benny Prijono3818c932005-11-22 01:06:33 +0000183 return PJ_SUCCESS;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000184
185 /* Create reference message. */
186 ref_msg = entry->creator(pool);
187
188 /* Create buffer for comparison. */
189 str1.ptr = pj_pool_alloc(pool, BUFLEN);
190 str2.ptr = pj_pool_alloc(pool, BUFLEN);
191
192 /* Compare message type. */
193 if (parsed_msg->type != ref_msg->type) {
194 status = -20;
195 goto on_return;
196 }
197
198 /* Compare request or status line. */
199 if (parsed_msg->type == PJSIP_REQUEST_MSG) {
200 pjsip_method *m1 = &parsed_msg->line.req.method;
201 pjsip_method *m2 = &ref_msg->line.req.method;
202
Benny Prijono3818c932005-11-22 01:06:33 +0000203 if (pjsip_method_cmp(m1, m2) != 0) {
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000204 status = -30;
205 goto on_return;
206 }
Benny Prijono3818c932005-11-22 01:06:33 +0000207 status = pjsip_uri_cmp(PJSIP_URI_IN_REQ_URI,
208 parsed_msg->line.req.uri,
209 ref_msg->line.req.uri);
210 if (status != PJ_SUCCESS) {
211 app_perror(" error: request URI mismatch", status);
212 status = -31;
213 goto on_return;
214 }
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000215 } else {
Benny Prijono3818c932005-11-22 01:06:33 +0000216 if (parsed_msg->line.status.code != ref_msg->line.status.code) {
Benny Prijono85598d92006-01-07 18:44:25 +0000217 PJ_LOG(3,(THIS_FILE, " error: status code mismatch"));
Benny Prijono3818c932005-11-22 01:06:33 +0000218 status = -32;
219 goto on_return;
220 }
221 if (pj_strcmp(&parsed_msg->line.status.reason,
222 &ref_msg->line.status.reason) != 0)
223 {
Benny Prijono85598d92006-01-07 18:44:25 +0000224 PJ_LOG(3,(THIS_FILE, " error: status text mismatch"));
Benny Prijono3818c932005-11-22 01:06:33 +0000225 status = -33;
226 goto on_return;
227 }
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000228 }
229
230 /* Compare headers. */
231 hdr1 = parsed_msg->hdr.next;
232 hdr2 = ref_msg->hdr.next;
233
234 while (hdr1 != &parsed_msg->hdr && hdr2 != &ref_msg->hdr) {
235 len = hdr1->vptr->print_on(hdr1, str1.ptr, BUFLEN);
236 if (len < 1) {
237 status = -40;
238 goto on_return;
239 }
Benny Prijono3818c932005-11-22 01:06:33 +0000240 str1.ptr[len] = '\0';
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000241 str1.slen = len;
242
243 len = hdr2->vptr->print_on(hdr2, str2.ptr, BUFLEN);
244 if (len < 1) {
245 status = -50;
246 goto on_return;
247 }
Benny Prijono3818c932005-11-22 01:06:33 +0000248 str2.ptr[len] = '\0';
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000249 str2.slen = len;
250
251 if (pj_strcmp(&str1, &str2) != 0) {
252 status = -60;
Benny Prijono85598d92006-01-07 18:44:25 +0000253 PJ_LOG(3,(THIS_FILE, " error: header string mismatch:\n"
Benny Prijono3818c932005-11-22 01:06:33 +0000254 " h1='%s'\n"
255 " h2='%s'\n",
256 str1.ptr, str2.ptr));
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000257 goto on_return;
258 }
259
260 hdr1 = hdr1->next;
261 hdr2 = hdr2->next;
262 }
263
264 if (hdr1 != &parsed_msg->hdr || hdr2 != &ref_msg->hdr) {
265 status = -70;
266 goto on_return;
267 }
268
Benny Prijono3818c932005-11-22 01:06:33 +0000269 /* Compare body? */
270 if (parsed_msg->body==NULL && ref_msg->body==NULL)
271 goto print_msg;
272
273 /* Compare msg body length. */
274 if (parsed_msg->body->len != ref_msg->body->len) {
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000275 status = -80;
276 goto on_return;
277 }
Benny Prijono3818c932005-11-22 01:06:33 +0000278
279 /* Compare msg body content type. */
280 if (pj_strcmp(&parsed_msg->body->content_type.type,
281 &ref_msg->body->content_type.type) != 0) {
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000282 status = -90;
283 goto on_return;
284 }
Benny Prijono3818c932005-11-22 01:06:33 +0000285 if (pj_strcmp(&parsed_msg->body->content_type.subtype,
286 &ref_msg->body->content_type.subtype) != 0) {
287 status = -100;
288 goto on_return;
289 }
290
291 /* Compare body content. */
292 str1.slen = parsed_msg->body->print_body(parsed_msg->body,
293 msgbuf1, sizeof(msgbuf1));
294 if (str1.slen < 1) {
295 status = -110;
296 goto on_return;
297 }
298 str1.ptr = msgbuf1;
299
300 str2.slen = ref_msg->body->print_body(ref_msg->body,
301 msgbuf2, sizeof(msgbuf2));
302 if (str2.slen < 1) {
303 status = -120;
304 goto on_return;
305 }
306 str2.ptr = msgbuf2;
307
308 if (pj_strcmp(&str1, &str2) != 0) {
309 status = -140;
310 goto on_return;
311 }
312
313 /* Print message. */
314print_msg:
Benny Prijonoe93e2872006-06-28 16:46:49 +0000315 var.print_len = var.print_len + entry->len;
Benny Prijono3818c932005-11-22 01:06:33 +0000316 pj_get_timestamp(&t1);
Benny Prijonoe93e2872006-06-28 16:46:49 +0000317 if (var.flag && FLAG_PRINT_ONLY)
Benny Prijonocec5f4a2005-11-22 23:51:50 +0000318 ref_msg = print_msg;
319 len = pjsip_msg_print(ref_msg, msgbuf1, PJSIP_MAX_PKT_LEN);
Benny Prijono3818c932005-11-22 01:06:33 +0000320 if (len < 1) {
321 status = -150;
322 goto on_return;
323 }
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000324 pj_get_timestamp(&t2);
Benny Prijono3818c932005-11-22 01:06:33 +0000325 pj_sub_timestamp(&t2, &t1);
Benny Prijonoe93e2872006-06-28 16:46:49 +0000326 pj_add_timestamp(&var.print_time, &t2);
Benny Prijono3818c932005-11-22 01:06:33 +0000327
328
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000329 status = PJ_SUCCESS;
330
331on_return:
332 return status;
333}
334
335
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000336static pjsip_msg *create_msg0(pj_pool_t *pool)
337{
338
339 pjsip_msg *msg;
340 pjsip_name_addr *name_addr;
Benny Prijono0c2bc612006-01-10 13:31:40 +0000341 pjsip_sip_uri *url;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000342 pjsip_fromto_hdr *fromto;
343 pjsip_cid_hdr *cid;
344 pjsip_clen_hdr *clen;
345 pjsip_cseq_hdr *cseq;
346 pjsip_contact_hdr *contact;
347 pjsip_ctype_hdr *ctype;
348 pjsip_routing_hdr *routing;
349 pjsip_via_hdr *via;
350 pjsip_generic_string_hdr *generic;
351 pj_str_t str;
352
353 msg = pjsip_msg_create(pool, PJSIP_REQUEST_MSG);
354
355 /* "INVITE sip:user@foo SIP/2.0\n" */
356 pjsip_method_set(&msg->line.req.method, PJSIP_INVITE_METHOD);
Benny Prijono40f2f642006-01-30 18:40:05 +0000357 url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000358 msg->line.req.uri = (pjsip_uri*)url;
359 pj_strdup2(pool, &url->user, "user");
360 pj_strdup2(pool, &url->host, "foo");
361
Benny Prijonofa73e3e2006-01-05 23:35:46 +0000362 /* "From: Hi I'm Joe <sip:joe.user@bar.otherdomain.com>;tag=123457890123456\r" */
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000363 fromto = pjsip_from_hdr_create(pool);
364 pjsip_msg_add_hdr(msg, (pjsip_hdr*)fromto);
Benny Prijonofa73e3e2006-01-05 23:35:46 +0000365 pj_strdup2(pool, &fromto->tag, "123457890123456");
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000366 name_addr = pjsip_name_addr_create(pool);
367 fromto->uri = (pjsip_uri*)name_addr;
368 pj_strdup2(pool, &name_addr->display, "Hi I'm Joe");
Benny Prijono40f2f642006-01-30 18:40:05 +0000369 url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000370 name_addr->uri = (pjsip_uri*)url;
371 pj_strdup2(pool, &url->user, "joe.user");
372 pj_strdup2(pool, &url->host, "bar.otherdomain.com");
373
374 /* "To: Fellow User <sip:user@foo.bar.domain.com>\r\n" */
375 fromto = pjsip_to_hdr_create(pool);
376 pjsip_msg_add_hdr(msg, (pjsip_hdr*)fromto);
377 name_addr = pjsip_name_addr_create(pool);
378 fromto->uri = (pjsip_uri*)name_addr;
379 pj_strdup2(pool, &name_addr->display, "Fellow User");
Benny Prijono40f2f642006-01-30 18:40:05 +0000380 url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000381 name_addr->uri = (pjsip_uri*)url;
382 pj_strdup2(pool, &url->user, "user");
383 pj_strdup2(pool, &url->host, "foo.bar.domain.com");
384
385 /* "Call-ID: 12345678901234567890@bar\r\n" */
386 cid = pjsip_cid_hdr_create(pool);
387 pjsip_msg_add_hdr(msg, (pjsip_hdr*)cid);
388 pj_strdup2(pool, &cid->id, "12345678901234567890@bar");
389
390 /* "Content-Length: 0\r\n" */
391 clen = pjsip_clen_hdr_create(pool);
392 pjsip_msg_add_hdr(msg, (pjsip_hdr*)clen);
393 clen->len = 0;
394
395 /* "CSeq: 123456 INVITE\n" */
396 cseq = pjsip_cseq_hdr_create(pool);
397 pjsip_msg_add_hdr(msg, (pjsip_hdr*)cseq);
398 cseq->cseq = 123456;
399 pjsip_method_set(&cseq->method, PJSIP_INVITE_METHOD);
400
401 /* "Contact: <sip:joe@bar>;q=0.5;expires=3600*/
402 contact = pjsip_contact_hdr_create(pool);
403 pjsip_msg_add_hdr(msg, (pjsip_hdr*)contact);
404 contact->q1000 = 500;
405 contact->expires = 3600;
406 name_addr = pjsip_name_addr_create(pool);
407 contact->uri = (pjsip_uri*)name_addr;
Benny Prijono40f2f642006-01-30 18:40:05 +0000408 url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000409 name_addr->uri = (pjsip_uri*)url;
410 pj_strdup2(pool, &url->user, "joe");
411 pj_strdup2(pool, &url->host, "bar");
412
413 /*, sip:user@host;q=0.500\r" */
414 contact = pjsip_contact_hdr_create(pool);
415 pjsip_msg_add_hdr(msg, (pjsip_hdr*)contact);
416 contact->q1000 = 500;
Benny Prijono3818c932005-11-22 01:06:33 +0000417 name_addr = pjsip_name_addr_create(pool);
418 contact->uri = (pjsip_uri*)name_addr;
Benny Prijono40f2f642006-01-30 18:40:05 +0000419 url = pjsip_sip_uri_create(pool, 0);
Benny Prijono3818c932005-11-22 01:06:33 +0000420 name_addr->uri = (pjsip_uri*)url;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000421 pj_strdup2(pool, &url->user, "user");
422 pj_strdup2(pool, &url->host, "host");
423
424 /* " ,sip:user2@host2\n" */
425 contact = pjsip_contact_hdr_create(pool);
426 pjsip_msg_add_hdr(msg, (pjsip_hdr*)contact);
Benny Prijono3818c932005-11-22 01:06:33 +0000427 name_addr = pjsip_name_addr_create(pool);
428 contact->uri = (pjsip_uri*)name_addr;
Benny Prijono40f2f642006-01-30 18:40:05 +0000429 url = pjsip_sip_uri_create(pool, 0);
Benny Prijono3818c932005-11-22 01:06:33 +0000430 name_addr->uri = (pjsip_uri*)url;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000431 pj_strdup2(pool, &url->user, "user2");
432 pj_strdup2(pool, &url->host, "host2");
433
434 /* "Content-Type: text/html; charset=ISO-8859-4\r" */
435 ctype = pjsip_ctype_hdr_create(pool);
436 pjsip_msg_add_hdr(msg, (pjsip_hdr*)ctype);
437 pj_strdup2(pool, &ctype->media.type, "text");
438 pj_strdup2(pool, &ctype->media.subtype, "html");
439 pj_strdup2(pool, &ctype->media.param, ";charset=ISO-8859-4");
440
441 /* "Route: <sip:bigbox3.site3.atlanta.com;lr>,\r\n" */
442 routing = pjsip_route_hdr_create(pool);
443 pjsip_msg_add_hdr(msg, (pjsip_hdr*)routing);
Benny Prijono40f2f642006-01-30 18:40:05 +0000444 url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000445 routing->name_addr.uri = (pjsip_uri*)url;
446 pj_strdup2(pool, &url->host, "bigbox3.site3.atlanta.com");
447 url->lr_param = 1;
448
449 /* " <sip:server10.biloxi.com;lr>\r" */
450 routing = pjsip_route_hdr_create(pool);
451 pjsip_msg_add_hdr(msg, (pjsip_hdr*)routing);
Benny Prijono40f2f642006-01-30 18:40:05 +0000452 url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000453 routing->name_addr.uri = (pjsip_uri*)url;
454 pj_strdup2(pool, &url->host, "server10.biloxi.com");
455 url->lr_param = 1;
456
457 /* "Record-Route: <sip:server10.biloxi.com>,\r\n" */
458 routing = pjsip_rr_hdr_create(pool);
459 pjsip_msg_add_hdr(msg, (pjsip_hdr*)routing);
Benny Prijono40f2f642006-01-30 18:40:05 +0000460 url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000461 routing->name_addr.uri = (pjsip_uri*)url;
462 pj_strdup2(pool, &url->host, "server10.biloxi.com");
463 url->lr_param = 0;
464
465 /* " <sip:bigbox3.site3.atlanta.com;lr>\n" */
466 routing = pjsip_rr_hdr_create(pool);
467 pjsip_msg_add_hdr(msg, (pjsip_hdr*)routing);
Benny Prijono40f2f642006-01-30 18:40:05 +0000468 url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000469 routing->name_addr.uri = (pjsip_uri*)url;
470 pj_strdup2(pool, &url->host, "bigbox3.site3.atlanta.com");
471 url->lr_param = 1;
472
Benny Prijonofa73e3e2006-01-05 23:35:46 +0000473 /* "Via: SIP/2.0/SCTP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c230\n" */
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000474 via = pjsip_via_hdr_create(pool);
475 pjsip_msg_add_hdr(msg, (pjsip_hdr*)via);
476 pj_strdup2(pool, &via->transport, "SCTP");
477 pj_strdup2(pool, &via->sent_by.host, "bigbox3.site3.atlanta.com");
Benny Prijonofa73e3e2006-01-05 23:35:46 +0000478 pj_strdup2(pool, &via->branch_param, "z9hG4bK77ef4c230");
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000479
480 /* "Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8\n"
481 " ;received=192.0.2.1\r\n" */
482 via = pjsip_via_hdr_create(pool);
483 pjsip_msg_add_hdr(msg, (pjsip_hdr*)via);
484 pj_strdup2(pool, &via->transport, "UDP");
485 pj_strdup2(pool, &via->sent_by.host, "pc33.atlanta.com");
486 pj_strdup2(pool, &via->branch_param, "z9hG4bKnashds8");
487 pj_strdup2(pool, &via->recvd_param, "192.0.2.1");
488
489
490 /* "Via: SIP/2.0/UDP 10.2.1.1, */
491 via = pjsip_via_hdr_create(pool);
492 pjsip_msg_add_hdr(msg, (pjsip_hdr*)via);
493 pj_strdup2(pool, &via->transport, "UDP");
494 pj_strdup2(pool, &via->sent_by.host, "10.2.1.1");
495
496
497 /*SIP/2.0/TCP 192.168.1.1\n" */
498 via = pjsip_via_hdr_create(pool);
499 pjsip_msg_add_hdr(msg, (pjsip_hdr*)via);
500 pj_strdup2(pool, &via->transport, "TCP");
501 pj_strdup2(pool, &via->sent_by.host, "192.168.1.1");
502
503 /* "Organization: \r" */
504 str.ptr = "Organization";
505 str.slen = 12;
Benny Prijono40f2f642006-01-30 18:40:05 +0000506 generic = pjsip_generic_string_hdr_create(pool, &str, NULL);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000507 pjsip_msg_add_hdr(msg, (pjsip_hdr*)generic);
508 generic->hvalue.ptr = NULL;
509 generic->hvalue.slen = 0;
510
511 /* "Max-Forwards: 70\n" */
512 str.ptr = "Max-Forwards";
513 str.slen = 12;
Benny Prijono40f2f642006-01-30 18:40:05 +0000514 generic = pjsip_generic_string_hdr_create(pool, &str, NULL);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000515 pjsip_msg_add_hdr(msg, (pjsip_hdr*)generic);
516 str.ptr = "70";
517 str.slen = 2;
518 generic->hvalue = str;
519
520 /* "X-Header: \r\n" */
521 str.ptr = "X-Header";
522 str.slen = 8;
Benny Prijono40f2f642006-01-30 18:40:05 +0000523 generic = pjsip_generic_string_hdr_create(pool, &str, NULL);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000524 pjsip_msg_add_hdr(msg, (pjsip_hdr*)generic);
525 str.ptr = NULL;
526 str.slen = 0;
527 generic->hvalue = str;
528
Benny Prijonofa73e3e2006-01-05 23:35:46 +0000529 /* P-Associated-URI:\r\n */
530 str.ptr = "P-Associated-URI";
531 str.slen = 16;
Benny Prijono40f2f642006-01-30 18:40:05 +0000532 generic = pjsip_generic_string_hdr_create(pool, &str, NULL);
Benny Prijonofa73e3e2006-01-05 23:35:46 +0000533 pjsip_msg_add_hdr(msg, (pjsip_hdr*)generic);
534 str.ptr = NULL;
535 str.slen = 0;
536 generic->hvalue = str;
537
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000538 return msg;
539}
Benny Prijono3818c932005-11-22 01:06:33 +0000540
541static pjsip_msg *create_msg1(pj_pool_t *pool)
542{
543 pjsip_via_hdr *via;
544 pjsip_route_hdr *route;
545 pjsip_name_addr *name_addr;
Benny Prijono0c2bc612006-01-10 13:31:40 +0000546 pjsip_sip_uri *url;
Benny Prijono40f2f642006-01-30 18:40:05 +0000547 pjsip_max_fwd_hdr *max_fwd;
Benny Prijono3818c932005-11-22 01:06:33 +0000548 pjsip_to_hdr *to;
549 pjsip_from_hdr *from;
550 pjsip_contact_hdr *contact;
551 pjsip_ctype_hdr *ctype;
552 pjsip_cid_hdr *cid;
553 pjsip_clen_hdr *clen;
554 pjsip_cseq_hdr *cseq;
555 pjsip_msg *msg = pjsip_msg_create(pool, PJSIP_RESPONSE_MSG);
556 pjsip_msg_body *body;
557
558 //"SIP/2.0 200 OK\r\n"
559 msg->line.status.code = 200;
560 msg->line.status.reason = pj_str("OK");
561
562 //"Via: SIP/2.0/SCTP server10.biloxi.com;branch=z9hG4bKnashds8;rport;received=192.0.2.1\r\n"
563 via = pjsip_via_hdr_create(pool);
564 pjsip_msg_add_hdr(msg, (pjsip_hdr*)via);
565 via->transport = pj_str("SCTP");
566 via->sent_by.host = pj_str("server10.biloxi.com");
567 via->branch_param = pj_str("z9hG4bKnashds8");
568 via->rport_param = 0;
569 via->recvd_param = pj_str("192.0.2.1");
570
571 //"Via: SIP/2.0/UDP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1;received=192.0.2.2\r\n"
572 via = pjsip_via_hdr_create(pool);
573 pjsip_msg_add_hdr(msg, (pjsip_hdr*)via);
574 via->transport = pj_str("UDP");
575 via->sent_by.host = pj_str("bigbox3.site3.atlanta.com");
576 via->branch_param = pj_str("z9hG4bK77ef4c2312983.1");
577 via->recvd_param = pj_str("192.0.2.2");
578
579 //"Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bK776asdhds ;received=192.0.2.3\r\n"
580 via = pjsip_via_hdr_create(pool);
581 pjsip_msg_add_hdr(msg, (pjsip_hdr*)via);
582 via->transport = pj_str("UDP");
583 via->sent_by.host = pj_str("pc33.atlanta.com");
584 via->branch_param = pj_str("z9hG4bK776asdhds");
585 via->recvd_param = pj_str("192.0.2.3");
586
587 //"Route: <sip:proxy.sipprovider.com>\r\n"
588 route = pjsip_route_hdr_create(pool);
589 pjsip_msg_add_hdr(msg, (pjsip_hdr*)route);
Benny Prijono40f2f642006-01-30 18:40:05 +0000590 url = pjsip_sip_uri_create(pool, PJ_FALSE);
Benny Prijono3818c932005-11-22 01:06:33 +0000591 route->name_addr.uri = (pjsip_uri*)url;
592 url->host = pj_str("proxy.sipprovider.com");
593
594 //"Route: <sip:proxy.supersip.com:5060>\r\n"
595 route = pjsip_route_hdr_create(pool);
596 pjsip_msg_add_hdr(msg, (pjsip_hdr*)route);
Benny Prijono40f2f642006-01-30 18:40:05 +0000597 url = pjsip_sip_uri_create(pool, PJ_FALSE);
Benny Prijono3818c932005-11-22 01:06:33 +0000598 route->name_addr.uri = (pjsip_uri*)url;
599 url->host = pj_str("proxy.supersip.com");
600 url->port = 5060;
601
602 //"Max-Forwards: 70\r\n"
Benny Prijono40f2f642006-01-30 18:40:05 +0000603 max_fwd = pjsip_max_fwd_hdr_create(pool, 70);
Benny Prijono3818c932005-11-22 01:06:33 +0000604 pjsip_msg_add_hdr(msg, (pjsip_hdr*)max_fwd);
Benny Prijono3818c932005-11-22 01:06:33 +0000605
606 //"To: Bob <sip:bob@biloxi.com>;tag=a6c85cf\r\n"
607 to = pjsip_to_hdr_create(pool);
608 pjsip_msg_add_hdr(msg, (pjsip_hdr*)to);
609 name_addr = pjsip_name_addr_create(pool);
610 name_addr->display = pj_str("Bob");
611 to->uri = (pjsip_uri*)name_addr;
Benny Prijono40f2f642006-01-30 18:40:05 +0000612 url = pjsip_sip_uri_create(pool, PJ_FALSE);
Benny Prijono3818c932005-11-22 01:06:33 +0000613 name_addr->uri = (pjsip_uri*)url;
614 url->user = pj_str("bob");
615 url->host = pj_str("biloxi.com");
616 to->tag = pj_str("a6c85cf");
617
618 //"From: Alice <sip:alice@atlanta.com>;tag=1928301774\r\n"
619 from = pjsip_from_hdr_create(pool);
620 pjsip_msg_add_hdr(msg, (pjsip_hdr*)from);
621 name_addr = pjsip_name_addr_create(pool);
622 name_addr->display = pj_str("Alice");
623 from->uri = (pjsip_uri*)name_addr;
Benny Prijono40f2f642006-01-30 18:40:05 +0000624 url = pjsip_sip_uri_create(pool, PJ_FALSE);
Benny Prijono3818c932005-11-22 01:06:33 +0000625 name_addr->uri = (pjsip_uri*)url;
626 url->user = pj_str("alice");
627 url->host = pj_str("atlanta.com");
628 from->tag = pj_str("1928301774");
629
630 //"Call-ID: a84b4c76e66710@pc33.atlanta.com\r\n"
631 cid = pjsip_cid_hdr_create(pool);
632 pjsip_msg_add_hdr(msg, (pjsip_hdr*)cid);
633 cid->id = pj_str("a84b4c76e66710@pc33.atlanta.com");
634
635 //"CSeq: 314159 INVITE\r\n"
636 cseq = pjsip_cseq_hdr_create(pool);
637 pjsip_msg_add_hdr(msg, (pjsip_hdr*)cseq);
638 cseq->cseq = 314159;
639 pjsip_method_set(&cseq->method, PJSIP_INVITE_METHOD);
640
641 //"Contact: <sips:bob@192.0.2.4>\r\n"
642 contact = pjsip_contact_hdr_create(pool);
643 pjsip_msg_add_hdr(msg, (pjsip_hdr*)contact);
644 name_addr = pjsip_name_addr_create(pool);
645 contact->uri = (pjsip_uri*)name_addr;
Benny Prijono40f2f642006-01-30 18:40:05 +0000646 url = pjsip_sip_uri_create(pool, PJ_TRUE);
Benny Prijono3818c932005-11-22 01:06:33 +0000647 name_addr->uri = (pjsip_uri*)url;
648 url->user = pj_str("bob");
649 url->host = pj_str("192.0.2.4");
650
651 //"Content-Type: application/sdp\r\n"
652 ctype = pjsip_ctype_hdr_create(pool);
653 pjsip_msg_add_hdr(msg, (pjsip_hdr*)ctype);
654 ctype->media.type = pj_str("application");
655 ctype->media.subtype = pj_str("sdp");
656
657 //"Content-Length: 150\r\n"
658 clen = pjsip_clen_hdr_create(pool);
659 pjsip_msg_add_hdr(msg, (pjsip_hdr*)clen);
660 clen->len = 150;
661
662 // Body
663 body = pj_pool_zalloc(pool, sizeof(*body));
664 msg->body = body;
665 body->content_type.type = pj_str("application");
666 body->content_type.subtype = pj_str("sdp");
667 body->data =
668 "v=0\r\n"
669 "o=alice 53655765 2353687637 IN IP4 pc33.atlanta.com\r\n"
670 "s=-\r\n"
671 "t=0 0\r\n"
672 "c=IN IP4 pc33.atlanta.com\r\n"
673 "m=audio 3456 RTP/AVP 0 1 3 99\r\n"
674 "a=rtpmap:0 PCMU/8000\r\n";
675 body->len = pj_native_strlen(body->data);
676 body->print_body = &pjsip_print_text_body;
677
678 return msg;
679}
680
681/*****************************************************************************/
682
Benny Prijonoe93e2872006-06-28 16:46:49 +0000683static pj_status_t simple_test(void)
Benny Prijono3818c932005-11-22 01:06:33 +0000684{
Benny Prijonoe93e2872006-06-28 16:46:49 +0000685 unsigned i;
Benny Prijono3818c932005-11-22 01:06:33 +0000686 pj_status_t status;
Benny Prijono3818c932005-11-22 01:06:33 +0000687
Benny Prijono85598d92006-01-07 18:44:25 +0000688 PJ_LOG(3,(THIS_FILE, " simple test.."));
Benny Prijono3818c932005-11-22 01:06:33 +0000689 for (i=0; i<PJ_ARRAY_SIZE(test_array); ++i) {
Benny Prijonoe93e2872006-06-28 16:46:49 +0000690 pj_pool_t *pool;
Benny Prijono3818c932005-11-22 01:06:33 +0000691 pool = pjsip_endpt_create_pool(endpt, NULL, POOL_SIZE, POOL_SIZE);
692 status = test_entry( pool, &test_array[i] );
Benny Prijonofa73e3e2006-01-05 23:35:46 +0000693 pjsip_endpt_release_pool(endpt, pool);
Benny Prijono3818c932005-11-22 01:06:33 +0000694
695 if (status != PJ_SUCCESS)
696 return status;
697 }
698
Benny Prijonoe93e2872006-06-28 16:46:49 +0000699 return PJ_SUCCESS;
700}
701
702
703static int msg_benchmark(unsigned *p_detect, unsigned *p_parse,
704 unsigned *p_print)
705{
706 pj_status_t status;
707 pj_pool_t *pool;
708 int i, loop;
709 pj_timestamp zero;
710 pj_time_val elapsed;
711 pj_highprec_t avg_detect, avg_parse, avg_print, kbytes;
712
713
Benny Prijonoac623b32006-07-03 15:19:31 +0000714 pj_bzero(&var, sizeof(var));
Benny Prijonoe93e2872006-06-28 16:46:49 +0000715 zero.u64 = 0;
716
Benny Prijono3818c932005-11-22 01:06:33 +0000717 for (loop=0; loop<LOOP; ++loop) {
718 for (i=0; i<PJ_ARRAY_SIZE(test_array); ++i) {
719 pool = pjsip_endpt_create_pool(endpt, NULL, POOL_SIZE, POOL_SIZE);
720 status = test_entry( pool, &test_array[i] );
Benny Prijonofa73e3e2006-01-05 23:35:46 +0000721 pjsip_endpt_release_pool(endpt, pool);
Benny Prijono3818c932005-11-22 01:06:33 +0000722
723 if (status != PJ_SUCCESS)
724 return status;
725 }
726 }
727
Benny Prijonoe93e2872006-06-28 16:46:49 +0000728 kbytes = var.detect_len;
Benny Prijono3818c932005-11-22 01:06:33 +0000729 pj_highprec_mod(kbytes, 1000000);
730 pj_highprec_div(kbytes, 100000);
Benny Prijonoe93e2872006-06-28 16:46:49 +0000731 elapsed = pj_elapsed_time(&zero, &var.detect_time);
732 avg_detect = pj_elapsed_usec(&zero, &var.detect_time);
Benny Prijono3818c932005-11-22 01:06:33 +0000733 pj_highprec_mul(avg_detect, AVERAGE_MSG_LEN);
Benny Prijonoe93e2872006-06-28 16:46:49 +0000734 pj_highprec_div(avg_detect, var.detect_len);
Benny Prijono3818c932005-11-22 01:06:33 +0000735 avg_detect = 1000000 / avg_detect;
736
Benny Prijono85598d92006-01-07 18:44:25 +0000737 PJ_LOG(3,(THIS_FILE,
738 " %u.%u MB detected in %d.%03ds (avg=%d msg detection/sec)",
Benny Prijonoe93e2872006-06-28 16:46:49 +0000739 (unsigned)(var.detect_len/1000000), (unsigned)kbytes,
Benny Prijono85598d92006-01-07 18:44:25 +0000740 elapsed.sec, elapsed.msec,
741 (unsigned)avg_detect));
Benny Prijonoe93e2872006-06-28 16:46:49 +0000742 *p_detect = (unsigned)avg_detect;
Benny Prijono3818c932005-11-22 01:06:33 +0000743
Benny Prijonoe93e2872006-06-28 16:46:49 +0000744 kbytes = var.parse_len;
Benny Prijono3818c932005-11-22 01:06:33 +0000745 pj_highprec_mod(kbytes, 1000000);
746 pj_highprec_div(kbytes, 100000);
Benny Prijonoe93e2872006-06-28 16:46:49 +0000747 elapsed = pj_elapsed_time(&zero, &var.parse_time);
748 avg_parse = pj_elapsed_usec(&zero, &var.parse_time);
Benny Prijono3818c932005-11-22 01:06:33 +0000749 pj_highprec_mul(avg_parse, AVERAGE_MSG_LEN);
Benny Prijonoe93e2872006-06-28 16:46:49 +0000750 pj_highprec_div(avg_parse, var.parse_len);
Benny Prijono3818c932005-11-22 01:06:33 +0000751 avg_parse = 1000000 / avg_parse;
752
Benny Prijono85598d92006-01-07 18:44:25 +0000753 PJ_LOG(3,(THIS_FILE,
754 " %u.%u MB parsed in %d.%03ds (avg=%d msg parsing/sec)",
Benny Prijonoe93e2872006-06-28 16:46:49 +0000755 (unsigned)(var.parse_len/1000000), (unsigned)kbytes,
Benny Prijono85598d92006-01-07 18:44:25 +0000756 elapsed.sec, elapsed.msec,
757 (unsigned)avg_parse));
Benny Prijonoe93e2872006-06-28 16:46:49 +0000758 *p_parse = (unsigned)avg_parse;
Benny Prijono3818c932005-11-22 01:06:33 +0000759
Benny Prijonoe93e2872006-06-28 16:46:49 +0000760 kbytes = var.print_len;
Benny Prijono3818c932005-11-22 01:06:33 +0000761 pj_highprec_mod(kbytes, 1000000);
762 pj_highprec_div(kbytes, 100000);
Benny Prijonoe93e2872006-06-28 16:46:49 +0000763 elapsed = pj_elapsed_time(&zero, &var.print_time);
764 avg_print = pj_elapsed_usec(&zero, &var.print_time);
Benny Prijono3818c932005-11-22 01:06:33 +0000765 pj_highprec_mul(avg_print, AVERAGE_MSG_LEN);
Benny Prijonoe93e2872006-06-28 16:46:49 +0000766 pj_highprec_div(avg_print, var.print_len);
Benny Prijono3818c932005-11-22 01:06:33 +0000767 avg_print = 1000000 / avg_print;
768
Benny Prijono85598d92006-01-07 18:44:25 +0000769 PJ_LOG(3,(THIS_FILE,
770 " %u.%u MB printed in %d.%03ds (avg=%d msg print/sec)",
Benny Prijonoe93e2872006-06-28 16:46:49 +0000771 (unsigned)(var.print_len/1000000), (unsigned)kbytes,
Benny Prijono85598d92006-01-07 18:44:25 +0000772 elapsed.sec, elapsed.msec,
773 (unsigned)avg_print));
Benny Prijono3818c932005-11-22 01:06:33 +0000774
Benny Prijonoe93e2872006-06-28 16:46:49 +0000775 *p_print = (unsigned)avg_print;
Benny Prijono3818c932005-11-22 01:06:33 +0000776 return status;
777}
778
779/*****************************************************************************/
Benny Prijonoe93e2872006-06-28 16:46:49 +0000780
781int msg_test(void)
782{
783 enum { COUNT = 4, DETECT=0, PARSE=1, PRINT=2 };
784 struct {
785 unsigned detect;
786 unsigned parse;
787 unsigned print;
788 } run[COUNT];
789 unsigned i, max, avg_len;
790 char desc[250];
791 pj_status_t status;
792
Benny Prijonoe93e2872006-06-28 16:46:49 +0000793 status = simple_test();
794 if (status != PJ_SUCCESS)
795 return status;
796
797 for (i=0; i<COUNT; ++i) {
798 PJ_LOG(3,(THIS_FILE, " benchmarking (%d of %d)..", i+1, COUNT));
799 status = msg_benchmark(&run[i].detect, &run[i].parse, &run[i].print);
800 if (status != PJ_SUCCESS)
801 return status;
802 }
803
804 /* Calculate average message length */
805 for (i=0, avg_len=0; i<PJ_ARRAY_SIZE(test_array); ++i) {
806 avg_len += test_array[i].len;
807 }
808 avg_len /= PJ_ARRAY_SIZE(test_array);
809
810
811 /* Print maximum detect/sec */
812 for (i=0, max=0; i<COUNT; ++i)
813 if (run[i].detect > max) max = run[i].detect;
814
815 PJ_LOG(3,("", " Maximum message detection/sec=%u", max));
816
817 pj_ansi_sprintf(desc, "Number of SIP messages "
818 "can be pre-parse by <tt>pjsip_find_msg()</tt> "
819 "per second (tested with %d message sets with "
820 "average message length of "
Benny Prijono7db431e2006-07-23 14:38:49 +0000821 "%d bytes)", (int)PJ_ARRAY_SIZE(test_array), avg_len);
Benny Prijonoe93e2872006-06-28 16:46:49 +0000822 report_ival("msg-detect-per-sec", max, "msg/sec", desc);
823
824 /* Print maximum parse/sec */
825 for (i=0, max=0; i<COUNT; ++i)
826 if (run[i].parse > max) max = run[i].parse;
827
828 PJ_LOG(3,("", " Maximum message parsing/sec=%u", max));
829
830 pj_ansi_sprintf(desc, "Number of SIP messages "
831 "can be <b>parsed</b> by <tt>pjsip_parse_msg()</tt> "
832 "per second (tested with %d message sets with "
833 "average message length of "
Benny Prijono7db431e2006-07-23 14:38:49 +0000834 "%d bytes)", (int)PJ_ARRAY_SIZE(test_array), avg_len);
Benny Prijonoe93e2872006-06-28 16:46:49 +0000835 report_ival("msg-parse-per-sec", max, "msg/sec", desc);
836
837 /* Msg parsing bandwidth */
838 report_ival("msg-parse-bandwidth-mb", avg_len*max/1000000, "MB/sec",
839 "Message parsing bandwidth in megabytes (number of megabytes"
840 " worth of SIP messages that can be parsed per second). "
841 "The value is derived from msg-parse-per-sec above.");
842
843
844 /* Print maximum print/sec */
845 for (i=0, max=0; i<COUNT; ++i)
846 if (run[i].print > max) max = run[i].print;
847
848 PJ_LOG(3,("", " Maximum message print/sec=%u", max));
849
850 pj_ansi_sprintf(desc, "Number of SIP messages "
851 "can be <b>printed</b> by <tt>pjsip_msg_print()</tt>"
852 " per second (tested with %d message sets with "
853 "average message length of "
Benny Prijono7db431e2006-07-23 14:38:49 +0000854 "%d bytes)", (int)PJ_ARRAY_SIZE(test_array), avg_len);
Benny Prijonoe93e2872006-06-28 16:46:49 +0000855
856 report_ival("msg-print-per-sec", max, "msg/sec", desc);
857
858 /* Msg print bandwidth */
859 report_ival("msg-printed-bandwidth-mb", avg_len*max/1000000, "MB/sec",
860 "Message print bandwidth in megabytes (total size of "
861 "SIP messages printed per second). "
862 "The value is derived from msg-print-per-sec above.");
863
864
865 return PJ_SUCCESS;
866}
867