Changeset 657


Ignore:
Timestamp:
Aug 6, 2006 11:07:25 PM (18 years ago)
Author:
bennylp
Message:

Fixed assertion error if ACK is received before INVITE transaction sends final response (malicious?). Also fixed misc warnings, and stress-tested on Quad Xeon

Location:
pjproject/trunk
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjsip-apps/src/pjsua/pjsua_app.c

    r651 r657  
    140140    puts  ("  --auto-answer=code  Automatically answer incoming calls with code (e.g. 200)"); 
    141141    puts  ("  --max-calls=N       Maximum number of concurrent calls (default:4, max:255)"); 
     142    puts  ("  --thread-cnt=N      Number of worker threads (default:1)"); 
    142143    /* 
    143144    puts  ("  --duration=SEC      Set maximum call duration (default:no limit)"); 
     
    265266           OPT_RX_DROP_PCT, OPT_TX_DROP_PCT, OPT_EC_TAIL, 
    266267           OPT_NEXT_ACCOUNT, OPT_NEXT_CRED, OPT_MAX_CALLS,  
    267            OPT_DURATION, OPT_NO_TCP, OPT_NO_UDP, 
     268           OPT_DURATION, OPT_NO_TCP, OPT_NO_UDP, OPT_THREAD_CNT, 
    268269    }; 
    269270    struct pj_getopt_option long_options[] = { 
     
    312313        { "next-cred",  0, 0, OPT_NEXT_CRED}, 
    313314        { "max-calls",  1, 0, OPT_MAX_CALLS}, 
    314         { "duration",1,0, OPT_DURATION}, 
     315        { "duration",   1, 0, OPT_DURATION}, 
     316        { "thread-cnt", 1, 0, OPT_THREAD_CNT}, 
    315317        { NULL, 0, 0, 0} 
    316318    }; 
     
    612614            break; 
    613615        */ 
     616 
     617        case OPT_THREAD_CNT: 
     618            cfg->cfg.thread_cnt = my_atoi(pj_optarg); 
     619            if (cfg->cfg.thread_cnt > 128) { 
     620                PJ_LOG(1,(THIS_FILE, 
     621                          "Error: invalid --thread-cnt option")); 
     622                return -1; 
     623            } 
     624            break; 
    614625 
    615626        case OPT_PTIME: 
  • pjproject/trunk/pjsip-apps/src/samples/pjsip-perf.c

    r624 r657  
    159159 
    160160    struct { 
     161        pj_bool_t send_trying; 
     162        pj_bool_t send_ringing; 
     163        unsigned delay; 
    161164        struct srv_state prev_state; 
    162165        struct srv_state cur_state; 
     
    169172{ 
    170173    pjsip_inv_session   *inv; 
    171     pj_timer_entry       timer; 
     174    pj_timer_entry       ans_timer; 
    172175}; 
    173176 
     
    344347 
    345348 
     349static pj_status_t send_response(pjsip_inv_session *inv,  
     350                                 pjsip_rx_data *rdata, 
     351                                 int code, 
     352                                 pj_bool_t *has_initial) 
     353{ 
     354    pjsip_tx_data *tdata; 
     355    pj_status_t status; 
     356 
     357    if (*has_initial) { 
     358        status = pjsip_inv_answer(inv, code, NULL, NULL, &tdata); 
     359    } else { 
     360        status = pjsip_inv_initial_answer(inv, rdata, code,  
     361                                          NULL, NULL, &tdata); 
     362    } 
     363 
     364    if (status != PJ_SUCCESS) { 
     365        if (*has_initial) { 
     366            status = pjsip_inv_answer(inv, PJSIP_SC_NOT_ACCEPTABLE,  
     367                                      NULL, NULL, &tdata); 
     368        } else { 
     369            status = pjsip_inv_initial_answer(inv, rdata,  
     370                                              PJSIP_SC_NOT_ACCEPTABLE, 
     371                                              NULL, NULL, &tdata); 
     372        } 
     373 
     374        if (status == PJ_SUCCESS) { 
     375            *has_initial = PJ_TRUE; 
     376            pjsip_inv_send_msg(inv, tdata);  
     377        } else { 
     378            pjsip_inv_terminate(inv, 500, PJ_FALSE); 
     379            return -1; 
     380        } 
     381    } else { 
     382        *has_initial = PJ_TRUE; 
     383 
     384        status = pjsip_inv_send_msg(inv, tdata);  
     385        if (status != PJ_SUCCESS) { 
     386            pjsip_tx_data_dec_ref(tdata); 
     387            return status; 
     388        } 
     389    } 
     390 
     391    return status; 
     392} 
     393 
     394static void answer_timer_cb(pj_timer_heap_t *h, pj_timer_entry *entry) 
     395{ 
     396    struct call *call = entry->user_data; 
     397    pj_bool_t has_initial = PJ_TRUE; 
     398 
     399    entry->id = 0; 
     400    send_response(call->inv, NULL, 200, &has_initial); 
     401} 
     402 
    346403static pj_bool_t mod_call_on_rx_request(pjsip_rx_data *rdata) 
    347404{ 
     
    353410    pjmedia_sdp_session *sdp; 
    354411    pjsip_tx_data *tdata; 
     412    pj_bool_t has_initial = PJ_FALSE; 
    355413    pj_status_t status; 
    356414 
     
    445503    } 
    446504     
    447  
    448     /* Create 200 response .*/ 
    449     status = pjsip_inv_initial_answer(call->inv, rdata, 200,  
    450                                       NULL, NULL, &tdata); 
    451     if (status != PJ_SUCCESS) { 
    452         status = pjsip_inv_initial_answer(call->inv, rdata,  
    453                                           PJSIP_SC_NOT_ACCEPTABLE, 
    454                                           NULL, NULL, &tdata); 
    455         if (status == PJ_SUCCESS) 
    456             pjsip_inv_send_msg(call->inv, tdata);  
    457         else 
    458             pjsip_inv_terminate(call->inv, 500, PJ_FALSE); 
    459         return PJ_TRUE; 
    460     } 
    461  
    462  
    463     /* Send the 200 response. */   
    464     status = pjsip_inv_send_msg(call->inv, tdata);  
    465     PJ_ASSERT_ON_FAIL(status == PJ_SUCCESS, return PJ_TRUE); 
    466  
     505    /* Send 100/Trying if needed */ 
     506    if (app.server.send_trying) { 
     507        status = send_response(call->inv, rdata, 100, &has_initial); 
     508        if (status != PJ_SUCCESS) 
     509            return PJ_TRUE; 
     510    } 
     511 
     512    /* Send 180/Ringing if needed */ 
     513    if (app.server.send_ringing) { 
     514        status = send_response(call->inv, rdata, 180, &has_initial); 
     515        if (status != PJ_SUCCESS) 
     516            return PJ_TRUE; 
     517    } 
     518 
     519    /* Simulate call processing delay */ 
     520    if (app.server.delay) { 
     521        pj_time_val delay; 
     522 
     523        call->ans_timer.id = 1; 
     524        call->ans_timer.user_data = call; 
     525        call->ans_timer.cb = &answer_timer_cb; 
     526         
     527        delay.sec = 0; 
     528        delay.msec = app.server.delay; 
     529        pj_time_val_normalize(&delay); 
     530 
     531        pjsip_endpt_schedule_timer(app.sip_endpt, &call->ans_timer, &delay); 
     532 
     533    } else { 
     534        /* Send the 200 response immediately . */   
     535        status = pjsip_inv_send_msg(call->inv, tdata);  
     536        PJ_ASSERT_ON_FAIL(status == PJ_SUCCESS, return PJ_TRUE); 
     537    } 
    467538 
    468539    /* Done */ 
     
    10631134        "                           [default: no]\n" 
    10641135        "   --thread-count=N        Set number of worker threads [default=1]\n" 
     1136        "   --trying                Send 100/Trying response (server, default no)\n" 
     1137        "   --ringing               Send 180/Ringing response (server, default no)\n" 
     1138        "   --delay=MS, -d          Delay answering call by MS (server, default no)\n" 
    10651139        "\n" 
    10661140        "Misc options:\n" 
     
    10851159static pj_status_t init_options(int argc, char *argv[]) 
    10861160{ 
    1087     enum { OPT_THREAD_COUNT = 1, OPT_REAL_SDP }; 
     1161    enum { OPT_THREAD_COUNT = 1, OPT_REAL_SDP, OPT_TRYING, OPT_RINGING }; 
    10881162    struct pj_getopt_option long_options[] = { 
    10891163        { "local-port",     1, 0, 'p' }, 
     
    10981172        { "use-tcp",        0, 0, 'T' }, 
    10991173        { "window",         1, 0, 'w' }, 
     1174        { "delay",          1, 0, 'd' }, 
     1175        { "trying",         0, 0, OPT_TRYING}, 
     1176        { "ringing",        0, 0, OPT_RINGING}, 
    11001177        { NULL, 0, 0, 0 }, 
    11011178    }; 
     
    11151192    /* Parse options */ 
    11161193    pj_optind = 0; 
    1117     while((c=pj_getopt_long(argc,argv, "p:c:m:t:w:hsv",  
     1194    while((c=pj_getopt_long(argc,argv, "p:c:m:t:w:d:hsv",  
    11181195                            long_options, &option_index))!=-1)  
    11191196    { 
     
    11891266        case 'T': 
    11901267            app.use_tcp = PJ_TRUE; 
     1268            break; 
     1269 
     1270        case 'd': 
     1271            app.server.delay = my_atoi(pj_optarg); 
     1272            if (app.server.delay > 3600) { 
     1273                PJ_LOG(3,(THIS_FILE, "I think --delay %s is too long",  
     1274                          pj_optarg)); 
     1275                return -1; 
     1276            } 
     1277            break; 
     1278 
     1279        case OPT_TRYING: 
     1280            app.server.send_trying = 1; 
     1281            break; 
     1282 
     1283        case OPT_RINGING: 
     1284            app.server.send_ringing = 1; 
    11911285            break; 
    11921286 
  • pjproject/trunk/pjsip-apps/src/samples/siprtp.c

    r639 r657  
    10621062{ 
    10631063#define POLICY  SCHED_FIFO 
    1064     pthread_t thread; 
    10651064    struct sched_param tp; 
    10661065    int max_prio; 
  • pjproject/trunk/pjsip-apps/src/samples/sndinfo.c

    r445 r657  
    118118 
    119119static pj_status_t rec_cb(void *user_data, pj_uint32_t timestamp, 
    120                           const void *input, unsigned size) 
     120                          void *input, unsigned size) 
    121121{ 
    122122 
  • pjproject/trunk/pjsip-apps/src/samples/sndtest.c

    r582 r657  
    199199 
    200200static pj_status_t rec_cb(void *user_data, pj_uint32_t timestamp, 
    201                           const void *input, unsigned size) 
     201                          void *input, unsigned size) 
    202202{ 
    203203 
  • pjproject/trunk/pjsip/src/pjsip-ua/sip_inv.c

    r612 r657  
    257257    if (method->id == PJSIP_ACK_METHOD && inv) { 
    258258 
     259        /* Ignore ACK if pending INVITE transaction has not finished. */ 
     260        if (inv->invite_tsx &&  
     261            inv->invite_tsx->state < PJSIP_TSX_STATE_COMPLETED) 
     262        { 
     263            return PJ_TRUE; 
     264        } 
     265 
    259266        /* Terminate INVITE transaction, if it's still present. */ 
    260267        if (inv->invite_tsx &&  
    261268            inv->invite_tsx->state <= PJSIP_TSX_STATE_COMPLETED) 
    262269        { 
     270            pj_assert(inv->invite_tsx->status_code >= 200); 
    263271            pjsip_tsx_terminate(inv->invite_tsx,  
    264272                                inv->invite_tsx->status_code); 
  • pjproject/trunk/pjsip/src/pjsip/sip_transaction.c

    r635 r657  
    10101010    pjsip_tsx_state_e prev_state = tsx->state; 
    10111011 
     1012    /* New state must be greater than previous state */ 
     1013    pj_assert(state >= tsx->state); 
     1014 
    10121015    PJ_LOG(5, (tsx->obj_name, "State changed from %s to %s, event=%s", 
    10131016               state_str[tsx->state], state_str[state],  
  • pjproject/trunk/pjsip/src/pjsua-lib/pjsua_core.c

    r637 r657  
    553553                goto on_error; 
    554554        } 
     555        PJ_LOG(4,(THIS_FILE, "%d SIP worker threads created",  
     556                  pjsua_var.ua_cfg.thread_cnt)); 
     557    } else { 
     558        PJ_LOG(4,(THIS_FILE, "No SIP worker threads created")); 
    555559    } 
    556560 
Note: See TracChangeset for help on using the changeset viewer.