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

📄 test_nta.c

📁 Sofia SIP is an open-source SIP User-Agent library, compliant with the IETF RFC3261 specification.
💻 C
📖 第 1 页 / 共 5 页
字号:
    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 + -