From 328eaad9d79e2f20eb3dbe90ea781ad1352a9b9f Mon Sep 17 00:00:00 2001 From: Riza Sulistyo Date: Wed, 27 Feb 2013 15:02:03 +0000 Subject: Re #1620: backported to 1.x git-svn-id: http://svn.pjsip.org/repos/pjproject/branches/1.x@4407 74dad513-b988-da41-8d7b-12977e46ad98 --- pjnath/include/pjnath/stun_session.h | 5 ++++- pjnath/include/pjnath/stun_transaction.h | 5 ++++- pjnath/src/pjnath/ice_session.c | 2 +- pjnath/src/pjnath/stun_session.c | 5 +++-- pjnath/src/pjnath/stun_transaction.c | 19 +++++++++++-------- 5 files changed, 23 insertions(+), 13 deletions(-) diff --git a/pjnath/include/pjnath/stun_session.h b/pjnath/include/pjnath/stun_session.h index 9e608376..22551a8f 100644 --- a/pjnath/include/pjnath/stun_session.h +++ b/pjnath/include/pjnath/stun_session.h @@ -682,6 +682,8 @@ PJ_DECL(pj_status_t) pj_stun_session_cancel_req(pj_stun_session *sess, * * @param sess The STUN session instance. * @param tdata The request message previously sent. + * @param mod_count Boolean flag to indicate whether transmission count + * needs to be incremented. * * @return PJ_SUCCESS on success, or the appropriate error. * This function will return PJNATH_ESTUNDESTROYED if @@ -689,7 +691,8 @@ PJ_DECL(pj_status_t) pj_stun_session_cancel_req(pj_stun_session *sess, * callback. */ PJ_DECL(pj_status_t) pj_stun_session_retransmit_req(pj_stun_session *sess, - pj_stun_tx_data *tdata); + pj_stun_tx_data *tdata, + pj_bool_t mod_count); /** diff --git a/pjnath/include/pjnath/stun_transaction.h b/pjnath/include/pjnath/stun_transaction.h index 61d563ea..1f10fb7d 100644 --- a/pjnath/include/pjnath/stun_transaction.h +++ b/pjnath/include/pjnath/stun_transaction.h @@ -234,13 +234,16 @@ PJ_DECL(pj_status_t) pj_stun_client_tsx_send_msg(pj_stun_client_tsx *tsx, * but this functionality is needed by ICE. * * @param tsx The STUN client transaction instance. + * @param mod_count Boolean flag to indicate whether transmission count + * needs to be incremented. * * @return PJ_SUCCESS on success, or PJNATH_ESTUNDESTROYED * when the user has destroyed the transaction in * \a on_send_msg() callback, or any other error code * as returned by \a on_send_msg() callback. */ -PJ_DECL(pj_status_t) pj_stun_client_tsx_retransmit(pj_stun_client_tsx *tsx); +PJ_DECL(pj_status_t) pj_stun_client_tsx_retransmit(pj_stun_client_tsx *tsx, + pj_bool_t mod_count); /** diff --git a/pjnath/src/pjnath/ice_session.c b/pjnath/src/pjnath/ice_session.c index 8725ce12..ff0172bb 100644 --- a/pjnath/src/pjnath/ice_session.c +++ b/pjnath/src/pjnath/ice_session.c @@ -2709,7 +2709,7 @@ static void handle_incoming_check(pj_ice_sess *ice, */ LOG5((ice->obj_name, "Triggered check for check %d not performed " "because it's in progress. Retransmitting", i)); - pj_stun_session_retransmit_req(comp->stun_sess, c->tdata); + pj_stun_session_retransmit_req(comp->stun_sess, c->tdata, PJ_FALSE); } else if (c->state == PJ_ICE_SESS_CHECK_STATE_SUCCEEDED) { /* Check complete for this component. diff --git a/pjnath/src/pjnath/stun_session.c b/pjnath/src/pjnath/stun_session.c index 6825c06c..27d7c5b8 100644 --- a/pjnath/src/pjnath/stun_session.c +++ b/pjnath/src/pjnath/stun_session.c @@ -1052,7 +1052,8 @@ PJ_DEF(pj_status_t) pj_stun_session_cancel_req( pj_stun_session *sess, * Explicitly request retransmission of the request. */ PJ_DEF(pj_status_t) pj_stun_session_retransmit_req(pj_stun_session *sess, - pj_stun_tx_data *tdata) + pj_stun_tx_data *tdata, + pj_bool_t mod_count) { pj_status_t status; @@ -1063,7 +1064,7 @@ PJ_DEF(pj_status_t) pj_stun_session_retransmit_req(pj_stun_session *sess, pj_atomic_inc(sess->busy); pj_lock_acquire(sess->lock); - status = pj_stun_client_tsx_retransmit(tdata->client_tsx); + status = pj_stun_client_tsx_retransmit(tdata->client_tsx, mod_count); pj_lock_release(sess->lock); diff --git a/pjnath/src/pjnath/stun_transaction.c b/pjnath/src/pjnath/stun_transaction.c index 991f8487..96fdd25e 100644 --- a/pjnath/src/pjnath/stun_transaction.c +++ b/pjnath/src/pjnath/stun_transaction.c @@ -180,14 +180,15 @@ PJ_DEF(void*) pj_stun_client_tsx_get_data(pj_stun_client_tsx *tsx) /* * Transmit message. */ -static pj_status_t tsx_transmit_msg(pj_stun_client_tsx *tsx) +static pj_status_t tsx_transmit_msg(pj_stun_client_tsx *tsx, + pj_bool_t mod_count) { pj_status_t status; PJ_ASSERT_RETURN(tsx->retransmit_timer.id == 0 || !tsx->require_retransmit, PJ_EBUSY); - if (tsx->require_retransmit) { + if (tsx->require_retransmit && mod_count) { /* Calculate retransmit/timeout delay */ if (tsx->transmit_count == 0) { tsx->retransmit_time.sec = 0; @@ -221,7 +222,8 @@ static pj_status_t tsx_transmit_msg(pj_stun_client_tsx *tsx) } - tsx->transmit_count++; + if (mod_count) + tsx->transmit_count++; PJ_LOG(5,(tsx->obj_name, "STUN sending message (transmit count=%d)", tsx->transmit_count)); @@ -232,7 +234,7 @@ static pj_status_t tsx_transmit_msg(pj_stun_client_tsx *tsx) if (status == PJNATH_ESTUNDESTROYED) { /* We've been destroyed, don't access the object. */ } else if (status != PJ_SUCCESS) { - if (tsx->retransmit_timer.id != 0) { + if (tsx->retransmit_timer.id != 0 && mod_count) { pj_timer_heap_cancel(tsx->timer_heap, &tsx->retransmit_timer); tsx->retransmit_timer.id = 0; @@ -294,7 +296,7 @@ PJ_DEF(pj_status_t) pj_stun_client_tsx_send_msg(pj_stun_client_tsx *tsx, } /* Send the message */ - status = tsx_transmit_msg(tsx); + status = tsx_transmit_msg(tsx, PJ_TRUE); if (status != PJ_SUCCESS) { if (tsx->retransmit_timer.id != 0) { pj_timer_heap_cancel(tsx->timer_heap, @@ -332,7 +334,7 @@ static void retransmit_timer_callback(pj_timer_heap_t *timer_heap, } tsx->retransmit_timer.id = 0; - status = tsx_transmit_msg(tsx); + status = tsx_transmit_msg(tsx, PJ_TRUE); if (status == PJNATH_ESTUNDESTROYED) { /* We've been destroyed, don't try to access the object */ } else if (status != PJ_SUCCESS) { @@ -350,7 +352,8 @@ static void retransmit_timer_callback(pj_timer_heap_t *timer_heap, /* * Request to retransmit the request. */ -PJ_DEF(pj_status_t) pj_stun_client_tsx_retransmit(pj_stun_client_tsx *tsx) +PJ_DEF(pj_status_t) pj_stun_client_tsx_retransmit(pj_stun_client_tsx *tsx, + pj_bool_t mod_count) { if (tsx->destroy_timer.id != 0) { return PJ_SUCCESS; @@ -361,7 +364,7 @@ PJ_DEF(pj_status_t) pj_stun_client_tsx_retransmit(pj_stun_client_tsx *tsx) tsx->retransmit_timer.id = 0; } - return tsx_transmit_msg(tsx); + return tsx_transmit_msg(tsx, mod_count); } /* Timer callback to destroy transaction */ -- cgit v1.2.3