⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 msg_test.c

📁 一个开源的sip源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
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_native_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;
}


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

/*****************************************************************************/
/* 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_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);



#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
    },

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

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"
 */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -