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

📄 tsx_uas_test.c

📁 基于sip协议的网络电话源码
💻 C
📖 第 1 页 / 共 4 页
字号:
		}	    } else {		PJ_LOG(3,(THIS_FILE, "    error: retransmission received"));		test_complete = -125;	    }	}	return PJ_TRUE;    } else if (pj_strcmp2(&branch_param, TEST4_BRANCH_ID) == 0 ||	       pj_strcmp2(&branch_param, TEST5_BRANCH_ID) == 0 ||	       pj_strcmp2(&branch_param, TEST6_BRANCH_ID) == 0)     {	/* TEST4_BRANCH_ID: absorbs retransmissions in TRYING state. */	/* TEST5_BRANCH_ID: retransmit last response in PROCEEDING state. */	/* TEST6_BRANCH_ID: retransmit last response in COMPLETED state. */	if (msg->type == PJSIP_REQUEST_MSG) {	    /* On received request, create UAS. */	    pjsip_transaction *tsx;	    PJ_LOG(4,(THIS_FILE, "    received request (probably retransmission)"));	    status = pjsip_tsx_create_uas(&tsx_user, rdata, &tsx);	    if (status != PJ_SUCCESS) {		app_perror("    error: unable to create transaction", status);		test_complete = -130;		return PJ_TRUE;	    }	    pjsip_tsx_recv_msg(tsx, rdata);	    save_key(tsx);	    if (pj_strcmp2(&branch_param, TEST4_BRANCH_ID) == 0) {	    } else if (pj_strcmp2(&branch_param, TEST5_BRANCH_ID) == 0) {		send_response(rdata, tsx, TEST5_PROVISIONAL_CODE);	    } else if (pj_strcmp2(&branch_param, TEST6_BRANCH_ID) == 0) {		PJ_LOG(4,(THIS_FILE, "    sending provisional response"));		send_response(rdata, tsx, TEST6_PROVISIONAL_CODE);		PJ_LOG(4,(THIS_FILE, "    sending final response"));		send_response(rdata, tsx, TEST6_STATUS_CODE);	    }	} else {	    /* Verify the response received. */	    	    PJ_LOG(4,(THIS_FILE, "    received response number %d", recv_count));	    ++recv_count;	    if (pj_strcmp2(&branch_param, TEST4_BRANCH_ID) == 0) {		PJ_LOG(3,(THIS_FILE, "    error: not expecting response!"));		test_complete = -132;	    } else if (pj_strcmp2(&branch_param, TEST5_BRANCH_ID) == 0) {		if (rdata->msg_info.msg->line.status.code!=TEST5_PROVISIONAL_CODE) {		    PJ_LOG(3,(THIS_FILE, "    error: incorrect status code!"));		    test_complete = -133;		} 		if (recv_count > TEST5_RESPONSE_COUNT) {		    PJ_LOG(3,(THIS_FILE, "    error: not expecting response!"));		    test_complete = -134;		}	    } else if (pj_strcmp2(&branch_param, TEST6_BRANCH_ID) == 0) {		int code = rdata->msg_info.msg->line.status.code;		switch (recv_count) {		case 1:		    if (code != TEST6_PROVISIONAL_CODE) {			PJ_LOG(3,(THIS_FILE, "    error: invalid code!"));			test_complete = -135;		    }		    break;		case 2:		case 3:		    if (code != TEST6_STATUS_CODE) {			PJ_LOG(3,(THIS_FILE, "    error: invalid code %d "				  "(expecting %d)", code, TEST6_STATUS_CODE));			test_complete = -136;		    }		    break;		default:		    PJ_LOG(3,(THIS_FILE, "    error: not expecting response"));		    test_complete = -137;		    break;		}	    }	}	return PJ_TRUE;    } else if (pj_strcmp2(&branch_param, TEST7_BRANCH_ID) == 0 ||	       pj_strcmp2(&branch_param, TEST8_BRANCH_ID) == 0)     {	/*	 * TEST7_BRANCH_ID and TEST8_BRANCH_ID test the retransmission	 * of INVITE final response	 */	if (msg->type == PJSIP_REQUEST_MSG) {	    /* On received request, create UAS. */	    pjsip_transaction *tsx;	    status = pjsip_tsx_create_uas(&tsx_user, rdata, &tsx);	    if (status != PJ_SUCCESS) {		app_perror("    error: unable to create transaction", status);		test_complete = -140;		return PJ_TRUE;	    }	    pjsip_tsx_recv_msg(tsx, rdata);	    save_key(tsx);	    if (pj_strcmp2(&branch_param, TEST7_BRANCH_ID) == 0) {		send_response(rdata, tsx, TEST7_STATUS_CODE);	    } else {		send_response(rdata, tsx, TEST8_STATUS_CODE);	    }	} else {	    int code;	    ++recv_count;	    if (pj_strcmp2(&branch_param, TEST7_BRANCH_ID) == 0)		code = TEST7_STATUS_CODE;	    else		code = TEST8_STATUS_CODE;	    if (recv_count==1) {				if (rdata->msg_info.msg->line.status.code != code) {		    PJ_LOG(3,(THIS_FILE,"    error: invalid status code"));		    test_complete = -141;		}		recv_last = rdata->pkt_info.timestamp;	    } else {		pj_time_val now;		unsigned msec, msec_expected;		now = rdata->pkt_info.timestamp;		PJ_TIME_VAL_SUB(now, recv_last);	    		msec = now.sec*1000 + now.msec;		msec_expected = (1 << (recv_count-2)) * PJSIP_T1_TIMEOUT;		if (msec_expected > PJSIP_T2_TIMEOUT)		    msec_expected = PJSIP_T2_TIMEOUT;		if (DIFF(msec, msec_expected) > MAX_ALLOWED_DIFF) {		    PJ_LOG(3,(THIS_FILE,			      "    error: incorrect retransmission "			      "time (%d ms expected, %d ms received",			      msec_expected, msec));		    test_complete = -142;		}		if (recv_count > 11) {		    PJ_LOG(3,(THIS_FILE,"    error: too many responses (%d)",					recv_count));		    test_complete = -143;		}		recv_last = rdata->pkt_info.timestamp;	    }	}	return PJ_TRUE;    } else if (pj_strcmp2(&branch_param, TEST9_BRANCH_ID) == 0) {	/*	 * TEST9_BRANCH_ID tests that the retransmission of INVITE final 	 * response should cease when ACK is received. Transaction also MUST	 * terminate in T4 seconds.	 */	if (msg->type == PJSIP_REQUEST_MSG) {	    /* On received request, create UAS. */	    pjsip_transaction *tsx;	    status = pjsip_tsx_create_uas(&tsx_user, rdata, &tsx);	    if (status != PJ_SUCCESS) {		app_perror("    error: unable to create transaction", status);		test_complete = -150;		return PJ_TRUE;	    }	    pjsip_tsx_recv_msg(tsx, rdata);	    save_key(tsx);	    send_response(rdata, tsx, TEST9_STATUS_CODE);	} else {	    ++recv_count;	    if (rdata->msg_info.msg->line.status.code != TEST9_STATUS_CODE) {		PJ_LOG(3,(THIS_FILE,"    error: invalid status code"));		test_complete = -151;	    }	    if (recv_count==1) {		recv_last = rdata->pkt_info.timestamp;	    } else if (recv_count < 5) {		/* Let UAS retransmit some messages before we send ACK. */		pj_time_val now;		unsigned msec, msec_expected;		now = rdata->pkt_info.timestamp;		PJ_TIME_VAL_SUB(now, recv_last);	    		msec = now.sec*1000 + now.msec;		msec_expected = (1 << (recv_count-2)) * PJSIP_T1_TIMEOUT;		if (msec_expected > PJSIP_T2_TIMEOUT)		    msec_expected = PJSIP_T2_TIMEOUT;		if (DIFF(msec, msec_expected) > MAX_ALLOWED_DIFF) {		    PJ_LOG(3,(THIS_FILE,			      "    error: incorrect retransmission "			      "time (%d ms expected, %d ms received",			      msec_expected, msec));		    test_complete = -152;		}		recv_last = rdata->pkt_info.timestamp;	    } else if (recv_count == 5) {		pjsip_tx_data *tdata;		pjsip_sip_uri *uri;		pjsip_via_hdr *via;		status = pjsip_endpt_create_request_from_hdr(			    endpt, &pjsip_ack_method, 			    rdata->msg_info.to->uri,			    rdata->msg_info.from,			    rdata->msg_info.to,			    NULL, 			    rdata->msg_info.cid,			    rdata->msg_info.cseq->cseq,			    NULL,			    &tdata);		if (status != PJ_SUCCESS) {		    app_perror("    error: unable to create ACK", status);		    test_complete = -153;		    return PJ_TRUE;		}		uri=(pjsip_sip_uri*)pjsip_uri_get_uri(tdata->msg->line.req.uri);		uri->transport_param = pj_str("loop-dgram");		via = pjsip_msg_find_hdr(tdata->msg, PJSIP_H_VIA, NULL);		via->branch_param = pj_str(TEST9_BRANCH_ID);		status = pjsip_endpt_send_request_stateless(endpt, tdata,							    NULL, NULL);		if (status != PJ_SUCCESS) {		    app_perror("    error: unable to send ACK", status);		    test_complete = -154;		}	    } else {		PJ_LOG(3,(THIS_FILE,"    error: too many responses (%d)",				    recv_count));		test_complete = -155;	    }	}	return PJ_TRUE;    } else if (pj_strcmp2(&branch_param, TEST10_BRANCH_ID) == 0 ||	       pj_strcmp2(&branch_param, TEST11_BRANCH_ID) == 0 ||	       pj_strcmp2(&branch_param, TEST12_BRANCH_ID) == 0)     {	int test_num, code1, code2;	if (pj_strcmp2(&branch_param, TEST10_BRANCH_ID) == 0)	    test_num=10, code1 = 100, code2 = 0;	else if (pj_strcmp2(&branch_param, TEST11_BRANCH_ID) == 0)	    test_num=11, code1 = 100, code2 = 200;	else	    test_num=12, code1 = 200, code2 = 0;	if (rdata->msg_info.msg->type == PJSIP_REQUEST_MSG) {	    /* On received response, create UAS. */	    pjsip_transaction *tsx;	    status = pjsip_tsx_create_uas(&tsx_user, rdata, &tsx);	    if (status != PJ_SUCCESS) {		app_perror("    error: unable to create transaction", status);		test_complete = -150;		return PJ_TRUE;	    }	    pjsip_tsx_recv_msg(tsx, rdata);	    save_key(tsx);	    	    schedule_send_response(rdata, &tsx_key, code1, 1000);	    if (code2)		schedule_send_response(rdata, &tsx_key, code2, 2000);	} else {	}	return PJ_TRUE;    }    return PJ_FALSE;}/*  * The generic test framework, used by most of the tests.  */static int perform_test( char *target_uri, char *from_uri, 			 char *branch_param, int test_time, 			 const pjsip_method *method,			 int request_cnt, int request_interval_msec,			 int expecting_timeout){    pjsip_tx_data *tdata;    pj_str_t target, from;    pjsip_via_hdr *via;    pj_time_val timeout, next_send;    int sent_cnt;    pj_status_t status;    PJ_LOG(3,(THIS_FILE, 	      "   please standby, this will take at most %d seconds..",	      test_time));    /* Reset test. */    recv_count = 0;    test_complete = 0;    tsx_key.slen = 0;    /* Init headers. */    target = pj_str(target_uri);    from = pj_str(from_uri);    /* Create request. */    status = pjsip_endpt_create_request( endpt, method, &target,					 &from, &target, NULL, NULL, -1, 					 NULL, &tdata);    if (status != PJ_SUCCESS) {	app_perror("   Error: unable to create request", status);	return -10;    }    /* Set the branch param for test 1. */    via = pjsip_msg_find_hdr(tdata->msg, PJSIP_H_VIA, NULL);    via->branch_param = pj_str(branch_param);    /* Schedule first send. */    sent_cnt = 0;    pj_gettimeofday(&next_send);    pj_time_val_normalize(&next_send);    /* Set test completion time. */    pj_gettimeofday(&timeout);    timeout.sec += test_time;    /* Wait until test complete. */    while (!test_complete) {	pj_time_val now, poll_delay = {0, 10};	pjsip_endpt_handle_events(endpt, &poll_delay);	pj_gettimeofday(&now);	if (sent_cnt < request_cnt && PJ_TIME_VAL_GTE(now, next_send)) {	    /* Add additional reference to tdata to prevent transaction from	     * deleting it.	     */	    pjsip_tx_data_add_ref(tdata);	    /* (Re)Send the request. */	    PJ_LOG(4,(THIS_FILE, "    (re)sending request %d", sent_cnt));	    status = pjsip_endpt_send_request_stateless(endpt, tdata, 0, 0);	    if (status != PJ_SUCCESS) {		app_perror("   Error: unable to send request", status);		pjsip_tx_data_dec_ref(tdata);		return -20;	    }	    /* Schedule next send, if any. */	    sent_cnt++;	    if (sent_cnt < request_cnt) {		pj_gettimeofday(&next_send);		next_send.msec += request_interval_msec;		pj_time_val_normalize(&next_send);	    }

⌨️ 快捷键说明

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