Ignore:
Timestamp:
Jun 28, 2006 4:46:49 PM (18 years ago)
Author:
bennylp
Message:

Major improvements in PJSIP to support TCP. The changes fall into these categories: (1) the TCP transport implementation itself (*.[hc]), (2) bug-fix in SIP transaction when using reliable transports, (3) support for TCP transport in PJSUA-LIB/PJSUA, and (4) changes in PJSIP-TEST to support TCP testing.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjsip/src/test-pjsip/tsx_uas_test.c

    r555 r563  
    3636 **     Test that non-INVITE transaction returns 2xx response to the correct 
    3737 **     transport and correctly terminates the transaction. 
     38 **     This also checks that transaction is destroyed immediately after 
     39 **     it sends final response when reliable transport is used. 
    3840 ** 
    3941 ** TEST2_BRANCH_ID 
     
    5456 ** TEST6_BRANCH_ID 
    5557 **     As above, in COMPLETED state, with first sending provisional response. 
     58 **     (Only applicable for non-reliable transports). 
    5659 ** 
    5760 ** TEST7_BRANCH_ID 
     
    6669 **     until it's terminated by user). 
    6770 **     Transaction also MUST terminate in T4 seconds. 
     71 **     (Only applicable for non-reliable transports). 
    6872 ** 
    6973 ** TEST11_BRANCH_ID 
     
    129133 
    130134 
     135static char TARGET_URI[128]; 
     136static char FROM_URI[128]; 
     137static struct tsx_test_param *test_param; 
     138static unsigned tp_flag; 
     139 
     140 
    131141#define TEST_TIMEOUT_ERROR      -30 
    132142#define MAX_ALLOWED_DIFF        150 
     
    522532            /* Check that status code is status_code. */ 
    523533            if (tsx->status_code != TEST6_STATUS_CODE) { 
    524                 PJ_LOG(3,(THIS_FILE, "    error: incorrect status code")); 
     534                PJ_LOG(3,(THIS_FILE, "    error: incorrect status code %d " 
     535                          "(expecting %d)", tsx->status_code,  
     536                          TEST6_STATUS_CODE)); 
    525537                test_complete = -140; 
    526538            } 
     
    576588                PJ_LOG(3,(THIS_FILE, "    error: incorrect prev_state")); 
    577589                test_complete = -151; 
     590            } 
     591 
     592            /* Check the number of retransmissions */ 
     593            if (tp_flag & PJSIP_TRANSPORT_RELIABLE) { 
     594 
     595                if (tsx->retransmit_count != 0) { 
     596                    PJ_LOG(3,(THIS_FILE, "    error: should not retransmit")); 
     597                    test_complete = -1510; 
     598                } 
     599 
     600            } else { 
     601 
     602                if (tsx->retransmit_count != 10) { 
     603                    PJ_LOG(3,(THIS_FILE,  
     604                              "    error: incorrect retransmit count %d " 
     605                              "(expecting 10)", 
     606                              tsx->retransmit_count)); 
     607                    test_complete = -1510; 
     608                } 
     609 
    578610            } 
    579611 
     
    815847            pjsip_transaction *tsx; 
    816848 
     849            PJ_LOG(4,(THIS_FILE, "    received request (probably retransmission)")); 
     850 
    817851            status = pjsip_tsx_create_uas(&tsx_user, rdata, &tsx); 
    818852            if (status != PJ_SUCCESS) { 
     
    831865 
    832866            } else if (pj_strcmp2(&branch_param, TEST6_BRANCH_ID) == 0) { 
     867                PJ_LOG(4,(THIS_FILE, "    sending provisional response")); 
    833868                send_response(rdata, tsx, TEST6_PROVISIONAL_CODE); 
     869                PJ_LOG(4,(THIS_FILE, "    sending final response")); 
    834870                send_response(rdata, tsx, TEST6_STATUS_CODE); 
    835871            } 
     
    838874            /* Verify the response received. */ 
    839875             
     876            PJ_LOG(4,(THIS_FILE, "    received response number %d", recv_count)); 
     877 
    840878            ++recv_count; 
    841879 
     
    870908                case 3: 
    871909                    if (code != TEST6_STATUS_CODE) { 
    872                         PJ_LOG(3,(THIS_FILE, "    error: invalid code!")); 
     910                        PJ_LOG(3,(THIS_FILE, "    error: invalid code %d " 
     911                                  "(expecting %d)", code, TEST6_STATUS_CODE)); 
    873912                        test_complete = -136; 
    874913                    } 
     
    11841223 
    11851224            /* (Re)Send the request. */ 
     1225            PJ_LOG(4,(THIS_FILE, "    (re)sending request %d", sent_cnt)); 
     1226 
    11861227            status = pjsip_endpt_send_request_stateless(endpt, tdata, 0, 0); 
    11871228            if (status != PJ_SUCCESS) { 
     
    12561297static int tsx_basic_final_response_test(void) 
    12571298{ 
     1299    unsigned duration; 
    12581300    int status; 
    12591301 
    12601302    PJ_LOG(3,(THIS_FILE,"  test1: basic sending 2xx final response")); 
    12611303 
    1262     status = perform_test("sip:129.0.0.1;transport=loop-dgram", 
    1263                           "sip:129.0.0.1;transport=loop-dgram", 
    1264                           TEST1_BRANCH_ID, 
    1265                           33, /* Test duration must be greater than 32 secs */ 
    1266                           &pjsip_options_method, 1, 0, 0); 
     1304    /* Test duration must be greater than 32 secs if unreliable transport 
     1305     * is used. 
     1306     */ 
     1307    duration = (tp_flag & PJSIP_TRANSPORT_RELIABLE) ? 1 : 33; 
     1308 
     1309    status = perform_test(TARGET_URI, FROM_URI, TEST1_BRANCH_ID, 
     1310                          duration,  &pjsip_options_method, 1, 0, 0); 
    12671311    if (status != 0) 
    12681312        return status; 
     
    12701314    PJ_LOG(3,(THIS_FILE,"  test2: basic sending non-2xx final response")); 
    12711315 
    1272     status = perform_test("sip:129.0.0.1;transport=loop-dgram", 
    1273                           "sip:129.0.0.1;transport=loop-dgram", 
    1274                           TEST2_BRANCH_ID, 
    1275                           33, /* Test duration must be greater than 32 secs */ 
    1276                           &pjsip_options_method, 1, 0, 0); 
     1316    status = perform_test(TARGET_URI, FROM_URI, TEST2_BRANCH_ID, 
     1317                          duration, &pjsip_options_method, 1, 0, 0); 
    12771318    if (status != 0) 
    12781319        return status; 
     
    12901331static int tsx_basic_provisional_response_test(void) 
    12911332{ 
     1333    unsigned duration; 
    12921334    int status; 
    12931335 
    12941336    PJ_LOG(3,(THIS_FILE,"  test3: basic sending 2xx final response")); 
    12951337 
    1296     status = perform_test("sip:129.0.0.1;transport=loop-dgram", 
    1297                           "sip:129.0.0.1;transport=loop-dgram", 
    1298                           TEST3_BRANCH_ID, 
    1299                           35, 
     1338    duration = (tp_flag & PJSIP_TRANSPORT_RELIABLE) ? 1 : 33; 
     1339    duration += 2; 
     1340 
     1341    status = perform_test(TARGET_URI, FROM_URI, TEST3_BRANCH_ID, duration, 
    13001342                          &pjsip_options_method, 1, 0, 0); 
    13011343 
     
    13211363    PJ_LOG(3,(THIS_FILE,"  %s", title)); 
    13221364 
    1323     status = perform_test("sip:129.0.0.1;transport=loop-dgram", 
    1324                           "sip:129.0.0.1;transport=loop-dgram", 
    1325                           branch_id, 
    1326                           5, 
     1365    status = perform_test(TARGET_URI, FROM_URI, branch_id, 5, 
    13271366                          &pjsip_options_method,  
    13281367                          request_cnt, 1000, 1); 
     
    13581397              "  test7: INVITE non-2xx final response retransmission")); 
    13591398 
    1360     status = perform_test("sip:129.0.0.1;transport=loop-dgram", 
    1361                           "sip:129.0.0.1;transport=loop-dgram", 
    1362                           TEST7_BRANCH_ID, 
     1399    status = perform_test(TARGET_URI, FROM_URI, TEST7_BRANCH_ID, 
    13631400                          33, /* Test duration must be greater than 32 secs */ 
    13641401                          &pjsip_invite_method, 1, 0, 0); 
     
    13691406              "  test8: INVITE 2xx final response retransmission")); 
    13701407 
    1371     status = perform_test("sip:129.0.0.1;transport=loop-dgram", 
    1372                           "sip:129.0.0.1;transport=loop-dgram", 
    1373                           TEST8_BRANCH_ID, 
     1408    status = perform_test(TARGET_URI, FROM_URI, TEST8_BRANCH_ID, 
    13741409                          33, /* Test duration must be greater than 32 secs */ 
    13751410                          &pjsip_invite_method, 1, 0, 0); 
     
    13951430              "  test9: receiving ACK for non-2xx final response")); 
    13961431 
    1397     status = perform_test("sip:129.0.0.1;transport=loop-dgram", 
    1398                           "sip:129.0.0.1;transport=loop-dgram", 
    1399                           TEST9_BRANCH_ID, 
     1432    status = perform_test(TARGET_URI, FROM_URI, TEST9_BRANCH_ID, 
    14001433                          20, /* allow 5 retransmissions */ 
    14011434                          &pjsip_invite_method, 1, 0, 0); 
     
    14441477        pjsip_loop_set_delay(loop, tests[i].transport_delay); 
    14451478 
    1446         status = perform_test("sip:129.0.0.1;transport=loop-dgram", 
    1447                               "sip:129.0.0.1;transport=loop-dgram", 
    1448                               tests[i].branch_id, 
    1449                               0, 
    1450                               &pjsip_invite_method, 1, 0, 1); 
     1479        status = perform_test(TARGET_URI, FROM_URI, tests[i].branch_id, 
     1480                              0, &pjsip_invite_method, 1, 0, 1); 
    14511481        if (status && status != TEST_TIMEOUT_ERROR) 
    14521482            return status; 
     
    14951525 ***************************************************************************** 
    14961526 */ 
    1497 int tsx_uas_test(void) 
     1527int tsx_uas_test(struct tsx_test_param *param) 
    14981528{ 
    14991529    pj_sockaddr_in addr; 
    15001530    pj_status_t status; 
     1531 
     1532    test_param = param; 
     1533    tp_flag = pjsip_transport_get_flag_from_type(param->type); 
     1534 
     1535    pj_ansi_sprintf(TARGET_URI, "sip:bob@127.0.0.1:%d;transport=%s",  
     1536                    param->port, param->tp_type); 
     1537    pj_ansi_sprintf(FROM_URI, "sip:alice@127.0.0.1:%d;transport=%s",  
     1538                    param->port, param->tp_type); 
    15011539 
    15021540    /* Check if loop transport is configured. */ 
     
    15051543    if (status != PJ_SUCCESS) { 
    15061544        PJ_LOG(3,(THIS_FILE, "  Error: loop transport is not configured!")); 
    1507         return -1; 
    1508     } 
    1509  
     1545        return -10; 
     1546    } 
    15101547    /* Register modules. */ 
    15111548    status = pjsip_endpt_register_module(endpt, &tsx_user); 
     
    15511588        return status; 
    15521589 
    1553     /* TEST6_BRANCH_ID: retransmit last response in PROCEEDING state 
     1590    /* TEST6_BRANCH_ID: retransmit last response in COMPLETED state 
     1591     *                  This only applies to non-reliable transports, 
     1592     *                  since UAS transaction is destroyed as soon 
     1593     *                  as final response is sent for reliable transports. 
    15541594     */ 
    1555     status = tsx_retransmit_last_response_test(TEST6_TITLE, 
    1556                                                TEST6_BRANCH_ID,  
    1557                                                TEST6_REQUEST_COUNT, 
    1558                                                TEST6_STATUS_CODE); 
    1559     if (status != 0) 
    1560         return status; 
     1595    if ((tp_flag & PJSIP_TRANSPORT_RELIABLE) == 0) { 
     1596        status = tsx_retransmit_last_response_test(TEST6_TITLE, 
     1597                                                   TEST6_BRANCH_ID,  
     1598                                                   TEST6_REQUEST_COUNT, 
     1599                                                   TEST6_STATUS_CODE); 
     1600        if (status != 0) 
     1601            return status; 
     1602    } 
    15611603 
    15621604    /* TEST7_BRANCH_ID: INVITE non-2xx final response retransmission test 
    15631605     * TEST8_BRANCH_ID: INVITE 2xx final response retransmission test 
    15641606     */ 
    1565  
    15661607    status = tsx_final_response_retransmission_test(); 
    15671608    if (status != 0) 
     
    15701611    /* TEST9_BRANCH_ID: retransmission of non-2xx INVITE final response must  
    15711612     * cease when ACK is received 
     1613     * Only applicable for non-reliable transports. 
    15721614     */ 
    1573     status = tsx_ack_test(); 
    1574     if (status != 0) 
    1575         return status; 
     1615    if ((tp_flag & PJSIP_TRANSPORT_RELIABLE) == 0) { 
     1616        status = tsx_ack_test(); 
     1617        if (status != 0) 
     1618            return status; 
     1619    } 
     1620 
    15761621 
    15771622    /* TEST10_BRANCH_ID: test transport failure in TRYING state. 
     
    15801625     * TEST13_BRANCH_ID: test transport failure in CONFIRMED state. 
    15811626     */ 
    1582     status = tsx_transport_failure_test(); 
    1583     if (status != 0) 
    1584         return status; 
    1585  
    1586  
    1587     pjsip_transport_dec_ref(loop); 
     1627    /* Only valid for loop-dgram */ 
     1628    if (param->type == PJSIP_TRANSPORT_LOOP_DGRAM) { 
     1629        status = tsx_transport_failure_test(); 
     1630        if (status != 0) 
     1631            return status; 
     1632    } 
     1633 
     1634 
     1635    /* Register modules. */ 
     1636    status = pjsip_endpt_unregister_module(endpt, &tsx_user); 
     1637    if (status != PJ_SUCCESS) { 
     1638        app_perror("   Error: unable to unregister module", status); 
     1639        return -8; 
     1640    } 
     1641    status = pjsip_endpt_unregister_module(endpt, &msg_sender); 
     1642    if (status != PJ_SUCCESS) { 
     1643        app_perror("   Error: unable to unregister module", status); 
     1644        return -9; 
     1645    } 
     1646 
     1647 
     1648    if (loop) 
     1649        pjsip_transport_dec_ref(loop); 
     1650 
    15881651    return 0; 
    1589  
    15901652} 
    15911653 
Note: See TracChangeset for help on using the changeset viewer.