📄 test_nta.c
字号:
url->url_port = ag->ag_contact->m_url->url_port; ag->ag_expect_leg = ag->ag_default_leg; ctx->c_orq = nta_outgoing_tcreate(ag->ag_default_leg, outgoing_callback, ctx, ag->ag_obp, SIP_METHOD_MESSAGE, (url_string_t *)url, SIPTAG_SUBJECT_STR(ctx->c_name), SIPTAG_FROM(ag->ag_alice), SIPTAG_TO(ag->ag_bob), SIPTAG_CONTACT(ag->ag_m_alice), TAG_END()); TEST_1(!client_run(ctx, 503)); TEST_P(ag->ag_latest_leg, ag->ag_default_leg); } { /* Test 1.6.2 * Send a message to sip:a.example.org:$port * Test outgoing_make_a_aaaa_query() */ client_t ctx[1] = {{ ag, "Test 1.6.2: outgoing_make_a_aaaa_query()" }}; url->url_host = "a.example.org"; url->url_port = ag->ag_contact->m_url->url_port; ag->ag_expect_leg = ag->ag_default_leg; ctx->c_orq = nta_outgoing_tcreate(ag->ag_default_leg, outgoing_callback, ctx, ag->ag_obp, SIP_METHOD_MESSAGE, (url_string_t *)url, SIPTAG_SUBJECT_STR(ctx->c_name), SIPTAG_FROM(ag->ag_alice), SIPTAG_TO(ag->ag_bob), SIPTAG_CONTACT(ag->ag_m_alice), TAG_END()); TEST_1(!client_run(ctx, 200)); TEST_P(ag->ag_latest_leg, ag->ag_default_leg); url->url_port = NULL; }#if 0 /* This must be run on host *without* proxy */ { /* Test 1.6c * Send a message to sip:na.example.org * Test outgoing_query_all() with NAPTR "A" flag */ client_t ctx[1] = {{ ag, "Test 1.6c" }}; url->url_host = "na.example.org"; ag->ag_expect_leg = ag->ag_default_leg; TEST_1(ctx->c_orq = nta_outgoing_tcreate(ag->ag_default_leg, outgoing_callback, ctx, ag->ag_obp, SIP_METHOD_MESSAGE, (url_string_t *)url, SIPTAG_SUBJECT_STR(ctx->c_name), SIPTAG_FROM(ag->ag_alice), SIPTAG_TO(ag->ag_bob), SIPTAG_CONTACT(ag->ag_m_alice), TAG_END())); TEST_1(!client_run(ctx, 503)); TEST(ag->ag_latest_leg, ag->ag_default_leg); }#endif { /* Test 1.7 * Send a message to sip:down2.example.org:$port * Test A record failover. */ client_t ctx[1] = {{ ag, "Test 1.7: outgoing_make_a_aaaa_query()" }}; url->url_host = "down2.example.org"; url->url_port = ag->ag_contact->m_url->url_port; ag->ag_expect_leg = ag->ag_default_leg; ctx->c_orq = nta_outgoing_tcreate(ag->ag_default_leg, outgoing_callback, ctx, ag->ag_obp, SIP_METHOD_MESSAGE, (url_string_t *)url, SIPTAG_SUBJECT_STR(ctx->c_name), SIPTAG_FROM(ag->ag_alice), SIPTAG_TO(ag->ag_bob), SIPTAG_CONTACT(ag->ag_m_alice), TAG_END()); TEST_1(!client_run(ctx, 200)); TEST_P(ag->ag_latest_leg, ag->ag_default_leg); url->url_params = NULL; } nta_agent_set_params(ag->ag_agent, NTATAG_SIP_T1(500), NTATAG_SIP_T1X64(64 * 500), NTATAG_SIP_T2(NTA_SIP_T2), NTATAG_SIP_T4(NTA_SIP_T4), TAG_END()); END();}/* Test default routing */int test_routing(agent_t *ag){ url_t url[1]; *url = *ag->ag_aliases->m_url; url->url_user = "bob"; nta_leg_bind(ag->ag_default_leg, leg_callback_200, ag); nta_agent_set_params(ag->ag_agent, NTATAG_MAXSIZE(2 * 1024 * 1024), TAG_END()); BEGIN(); { /* * Send a message from default leg to default leg * * We are now using url with an explicit port that does not match with * our own port number. */ url_t url2[1]; client_t ctx[1] = {{ ag, "Test 1.2" }}; *url2 = *url; url2->url_port = "9"; /* discard service */ ag->ag_expect_leg = ag->ag_default_leg; ctx->c_orq = nta_outgoing_tcreate(ag->ag_default_leg, outgoing_callback, ctx, (url_string_t *)url, SIP_METHOD_MESSAGE, (url_string_t *)url2, SIPTAG_SUBJECT_STR(ctx->c_name), SIPTAG_FROM(ag->ag_alice), SIPTAG_TO(ag->ag_bob), SIPTAG_CONTACT(ag->ag_m_alice), TAG_END()); TEST_1(!client_run(ctx, 200)); TEST_P(ag->ag_latest_leg, ag->ag_default_leg); } END();}/* Test dialogs and the tag handling */int test_dialog(agent_t *ag){ BEGIN(); /* * Test establishing a dialog * * Alice sends a message to Bob, then Bob back to the Alice, and again * Alice to Bob. */ ag->ag_alice_leg = nta_leg_tcreate(ag->ag_agent, leg_callback_200, ag, SIPTAG_FROM(ag->ag_alice), SIPTAG_TO(ag->ag_bob), TAG_END()); TEST_1(ag->ag_alice_leg); TEST_1(nta_leg_tag(ag->ag_alice_leg, NULL)); { client_t ctx[1] = {{ ag, "Test 2.1" }}; nta_leg_bind(ag->ag_server_leg, new_leg_callback_200, ag); /* Send message from Alice to Bob establishing the dialog */ ag->ag_expect_leg = ag->ag_server_leg; ag->ag_tag_remote = ag->ag_alice_leg; ctx->c_orq = nta_outgoing_tcreate(ag->ag_alice_leg, outgoing_callback, ctx, ag->ag_obp, SIP_METHOD_MESSAGE, (url_string_t *)ag->ag_m_bob->m_url, SIPTAG_SUBJECT_STR(ctx->c_name), SIPTAG_FROM(ag->ag_alice), SIPTAG_TO(ag->ag_bob), SIPTAG_CONTACT(ag->ag_m_alice), TAG_END()); TEST_1(!client_run(ctx, 200)); TEST_P(ag->ag_latest_leg, ag->ag_server_leg); TEST_1(ag->ag_bob_leg != NULL); } { /* Send message from Bob to Alice */ client_t ctx[1] = {{ ag, "Test 2.2" }}; nta_leg_bind(ag->ag_server_leg, leg_callback_200, ag); ag->ag_expect_leg = ag->ag_alice_leg; ctx->c_orq = nta_outgoing_tcreate(ag->ag_bob_leg, outgoing_callback, ctx, NULL, SIP_METHOD_MESSAGE, (url_string_t *)ag->ag_m_alice->m_url, SIPTAG_SUBJECT_STR(ctx->c_name), TAG_END()); TEST_1(!client_run(ctx, 200)); TEST_P(ag->ag_latest_leg, ag->ag_alice_leg); } { /* Send again message from Alice to Bob */ client_t ctx[1] = {{ ag, "Test 2.3" }}; ag->ag_expect_leg = ag->ag_bob_leg; ctx->c_orq = nta_outgoing_tcreate(ag->ag_alice_leg, outgoing_callback, ctx, NULL, SIP_METHOD_MESSAGE, (url_string_t *)ag->ag_m_bob->m_url, SIPTAG_SUBJECT_STR(ctx->c_name), TAG_END()); TEST_1(!client_run(ctx, 200)); TEST_P(ag->ag_latest_leg, ag->ag_bob_leg); } { /* Send message from Bob to Alice * This time, however, specify request URI */ client_t ctx[1] = {{ ag, "Test 2.4" }}; ag->ag_expect_leg = ag->ag_alice_leg; ctx->c_orq = nta_outgoing_tcreate(ag->ag_bob_leg, outgoing_callback, ctx, NULL, SIP_METHOD_MESSAGE, (url_string_t *)ag->ag_m_alice->m_url, SIPTAG_SUBJECT_STR(ctx->c_name), TAG_END()); TEST_1(!client_run(ctx, 200)); TEST_P(ag->ag_latest_leg, ag->ag_alice_leg); } nta_leg_destroy(ag->ag_alice_leg), ag->ag_alice_leg = NULL; nta_leg_destroy(ag->ag_bob_leg), ag->ag_bob_leg = NULL; END();}#ifndef MSG_TRUNC#define MSG_TRUNC 0#endifstatic ssize_t recv_udp(agent_t *ag, void *b, size_t size){ ssize_t n; memset(b, 0, size); for (;;) { su_root_step(ag->ag_root, 10L); if (su_wait(ag->ag_sink_wait, 1, 0) == 0) { n = su_recv(ag->ag_sink_socket, b, size, MSG_TRUNC); if (n > 0) return n; } }}/* Test merging */int test_merging(agent_t *ag){ BEGIN(); /* * Test merging: send two messages with same * from tag/call-id/cseq number to nta, * expect 200 and 408. */ char const rfc3261prefix[] = "z9hG4bK"; char const template[] = "%s " URL_PRINT_FORMAT " SIP/2.0\r\n" "Via: SIP/2.0/UDP 127.0.0.1:%s;branch=%s.%p\r\n" "Via: SIP/2.0/TCP fake.address.for.via.example.net;branch=z9hG4bK.%p\r\n" "CSeq: %u %s\r\n" "Call-ID: dfsjfhsduifhsjfsfjkfsd.%p@dfsdhfsjkhsdjk\r\n" "From: Evil Forker <sip:evel@forker.com>;tag=test_nta-%s\r\n" "To: Bob the Builder <sip:bob@example.net>%s\r\n" "Content-Length: 0\r\n" "\r\n"; url_t u1[1], u2[2]; char m1[1024], m2[1024]; char r1[1024], r2[1024]; size_t len, l1, l2; su_sockaddr_t *su = ag->ag_su_nta; socklen_t sulen = ag->ag_su_nta_len; /* Empty sink socket */ su_setblocking(ag->ag_sink_socket, 0); while (su_recv(ag->ag_sink_socket, m1, sizeof m1, MSG_TRUNC) >= 0) ; su_wait(ag->ag_sink_wait, 1, 0); su_wait(ag->ag_sink_wait, 1, 0); { /* RFC 3261 8.2.2.2 Merged Requests: If the request has no tag in the To header field, the UAS core MUST check the request against ongoing transactions. If the From tag, Call-ID, and CSeq exactly match those associated with an ongoing transaction, but the request does not match that transaction (based on the matching rules in Section 17.2.3), the UAS core SHOULD generate a 482 (Loop Detected) response and pass it to the server transaction. */ nta_leg_bind(ag->ag_server_leg, leg_callback_200, ag); ag->ag_expect_leg = ag->ag_server_leg; ag->ag_latest_leg = NULL; *u1 = *ag->ag_m_bob->m_url; snprintf(m1, sizeof m1, template, "MESSAGE", URL_PRINT_ARGS(u1), /* Via */ ag->ag_sink_port, rfc3261prefix, (void *)m1, /* 2nd Via */ (void *)ag, /* CSeq */ 13, "MESSAGE", /* Call-ID */ (void *)ag, /* From tag */ "2.5.1", /* To tag */ ""); l1 = strlen(m1); *u2 = *ag->ag_m_bob->m_url; snprintf(m2, sizeof m2, template, "MESSAGE", URL_PRINT_ARGS(u2), /* Via */ ag->ag_sink_port, rfc3261prefix, (void *)m2, /* 2nd Via */ (void *)ag, /* CSeq */ 13, "MESSAGE", /* Call-ID */ (void *)ag, /* From tag */ "2.5.1", /* To tag */ ""); l2 = strlen(m2); TEST_1((size_t)su_sendto(ag->ag_sink_socket, m1, l1, 0, su, sulen) == l1); TEST_1((size_t)su_sendto(ag->ag_sink_socket, m2, l2, 0, su, sulen) == l2); recv_udp(ag, r1, sizeof r1); recv_udp(ag, r2, sizeof r2); len = strlen("SIP/2.0 200 "); TEST_1(memcmp(r1, "SIP/2.0 200 ", len) == 0); TEST_1(memcmp(r2, "SIP/2.0 482 ", len) == 0); TEST_P(ag->ag_latest_leg, ag->ag_server_leg); } while (su_recv(ag->ag_sink_socket, m1, sizeof m1, MSG_TRUNC) >= 0) ; { /* * Check that request with same call-id, cseq and from-tag * are not merged if the method is different. */ nta_leg_bind(ag->ag_server_leg, leg_callback_200, ag); ag->ag_expect_leg = ag->ag_server_leg; ag->ag_latest_leg = NULL; *u1 = *ag->ag_m_bob->m_url; snprintf(m1, sizeof m1, template, "MESSAGE", URL_PRINT_ARGS(u1), /* Via */ ag->ag_sink_port, rfc3261prefix, (void *)m1, /* 2nd Via */ (void *)ag, /* CSeq */ 14, "MESSAGE", /* Call-ID */ (void *)ag, /* From tag */ "2.5.2", /* To tag */ ""); l1 = strlen(m1); *u2 = *ag->ag_m_bob->m_url; snprintf(m2, sizeof m2, template, "OPTIONS", URL_PRINT_ARGS(u2), /* Via */ ag->ag_sink_port, rfc3261prefix, (void *)m2, /* 2nd Via */ (void *)ag, /* CSeq */ 14, "OPTIONS", /* Call-ID */ (void *)ag, /* From tag */ "2.5.2", /* To tag */ ""); l2 = strlen(m2); TEST_1((size_t)su_sendto(ag->ag_sink_socket, m1, l1, 0, su, sulen) == l1); TEST_1((size_t)su_sendto(ag->ag_sink_socket, m2, l2, 0, su, sulen) == l2); recv_udp(ag, r1, sizeof r1); recv_udp(ag, r2, sizeof r2); len = strlen("SIP/2.0 200 "); TEST_1(memcmp(r1, "SIP/2.0 200 ", len) == 0); TEST_1(memcmp(r2, "SIP/2.0 482 ", len) != 0); TEST_P(ag->ag_latest_leg, ag->ag_server_leg); } while (su_recv(ag->ag_sink_socket, m1, sizeof m1, MSG_TRUNC) >= 0) ; { /* test with rfc2543 */ snprintf(m1, sizeof m1, template, "MASSAGE", URL_PRINT_ARGS(u1), /* Via */ ag->ag_sink_port, "0.", (void *)0, /* 2nd Via */ (void *)ag, /* CSeq */ 14, "MASSAGE", /* Call-ID */ (void *)(ag + 1), /* From tag */ "2.5.3", /* To tag */ ""); l1 = strlen(m1); u2->url_user = "bob+2"; snprintf(m2, sizeof m2, template, "MASSAGE", URL_PRINT_ARGS(u2), /* Via */ ag->ag_sink_port, "0.", (void *)0, /* 2nd Via */ (void *)ag, /* CSeq */ 14, "MASSAGE", /* Call-ID */ (void *)(ag + 1), /* From tag */ "2.5.3", /* To tag */ ""); l2 = strlen(m2); TEST_1((size_t)su_sendto(ag->ag_sink_socket, m1, l1, 0, su, sulen) == l1); TEST_1((size_t)su_sendto(ag->ag_sink_socket, m2, l2, 0, su, sulen) == l2); recv_udp(ag, r1, sizeof r1); recv_udp(ag, r2, sizeof r2); l1 = strlen("SIP/2.0 200 "); TEST_1(memcmp(r1, "SIP/2.0 200 ", l1) == 0); TEST_1(memcmp(r2, "SIP/2.0 482 ", l1) == 0); TEST_P(ag->ag_latest_leg, ag->ag_server_leg); } while (su_recv(ag->ag_sink_socket, m1, sizeof m1, MSG_TRUNC) >= 0) ; { /* test with to-tag */ snprintf(m1, sizeof m1, template, "MESSAGE", URL_PRINT_ARGS(u1), /* Via */ ag->ag_sink_port, rfc3261prefix, (void *)m1, /* 2nd Via */ (void *)ag, /* CSeq */ 15, "MESSAGE", /* Call-ID */ (void *)(ag + 2), /* From tag */ "2.5.4", /* To tag */ ";tag=in-dialog"); l1 = strlen(m1); u2->url_user = "bob+2"; snprintf(m2, sizeof m2, template, "MESSAGE", URL_PRINT_ARGS(u2), /* Via */ ag->ag_sink_port, rfc3261prefix, (void *)m2, /* 2nd Via */ (void *)ag, /* CSeq */ 15, "MESSAGE", /* Call-ID */ (void *)(ag + 2), /* From tag */ "2.5.4", /* To tag */ ";tag=in-dialog"); l2 = strlen(m2); TEST_1((size_t)su_sendto(ag->ag_sink_socket, m1, l1, 0, su, sulen) == l1); TEST_1((size_t)su_sendto(ag->ag_sink_socket, m2, l2, 0, su, sulen) == l2); recv_udp(ag, r1, sizeof r1); recv_udp(ag, r2, sizeof r2); l1 = strlen("SIP/2.0 200 "); TEST_1(memcmp(r1, "SIP/2.0 200 ", l1) == 0); TEST_1(memcmp(r2, "SIP/2.0 482 ", l1) != 0); TEST_P(ag->ag_latest_leg, ag->ag_server_leg); } while (su_recv(ag->ag_sink_socket, m1, sizeof m1, MSG_TRUNC) >= 0) ; { /* test with rfc2543 and to-tag */ snprintf(m
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -