diff options
author | Benny Prijono <bennylp@teluu.com> | 2007-11-03 22:44:14 +0000 |
---|---|---|
committer | Benny Prijono <bennylp@teluu.com> | 2007-11-03 22:44:14 +0000 |
commit | 1d54f22517d1c5c3a958dea0bb46734d8dc27513 (patch) | |
tree | 4ca7b62002f7bdf00f83406debaeba7eceefd8e4 | |
parent | 6545c53b3a859d5a64d1fb086c518676313bdfb8 (diff) |
Only do Test 1B if Test 2 failed
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@1546 74dad513-b988-da41-8d7b-12977e46ad98
-rw-r--r-- | pjnath/src/pjnath/nat_detect.c | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/pjnath/src/pjnath/nat_detect.c b/pjnath/src/pjnath/nat_detect.c index 364d89e3..7fe469d7 100644 --- a/pjnath/src/pjnath/nat_detect.c +++ b/pjnath/src/pjnath/nat_detect.c @@ -102,6 +102,7 @@ typedef struct nat_detect_session pj_status_t status; pj_sockaddr_in ma; pj_sockaddr_in ca; + pj_stun_tx_data *tdata; } result[ST_MAX]; } nat_detect_session; @@ -548,11 +549,19 @@ static void on_request_complete(pj_stun_session *stun_sess, sizeof(pj_sockaddr_in)); } - if (test_id == ST_TEST_1 && status == PJ_SUCCESS) { + /* Send Test 1B only when Test 2 completes. Must not send Test 1B + * before Test 2 completes to avoid creating mapping on the NAT. + */ + if (!sess->result[ST_TEST_1B].executed && + sess->result[ST_TEST_2].complete && + sess->result[ST_TEST_2].status != PJ_SUCCESS && + sess->result[ST_TEST_1].complete && + sess->result[ST_TEST_1].status == PJ_SUCCESS) + { cmp = pj_memcmp(&sess->local_addr, &sess->result[ST_TEST_1].ma, sizeof(pj_sockaddr_in)); if (cmp != 0) - send_test(sess, ST_TEST_1B, &sess->result[test_id].ca, 0); + send_test(sess, ST_TEST_1B, &sess->result[ST_TEST_1].ca, 0); } if (test_completed(sess)<3 || test_completed(sess)!=test_executed(sess)) @@ -759,7 +768,6 @@ static pj_status_t send_test(nat_detect_session *sess, const pj_sockaddr_in *alt_addr, pj_uint32_t change_flag) { - pj_stun_tx_data *tdata; pj_uint32_t magic, tsx_id[3]; pj_status_t status; @@ -777,12 +785,14 @@ static pj_status_t send_test(nat_detect_session *sess, /* Create BIND request */ status = pj_stun_session_create_req(sess->stun_sess, PJ_STUN_BINDING_REQUEST, magic, - (pj_uint8_t*)tsx_id, &tdata); + (pj_uint8_t*)tsx_id, + &sess->result[test_id].tdata); if (status != PJ_SUCCESS) goto on_error; /* Add CHANGE-REQUEST attribute */ - status = pj_stun_msg_add_uint_attr(sess->pool, tdata->msg, + status = pj_stun_msg_add_uint_attr(sess->pool, + sess->result[test_id].tdata->msg, PJ_STUN_ATTR_CHANGE_REQUEST, change_flag); if (status != PJ_SUCCESS) @@ -804,7 +814,7 @@ static pj_status_t send_test(nat_detect_session *sess, status = pj_stun_session_send_msg(sess->stun_sess, PJ_TRUE, sess->cur_server, sizeof(pj_sockaddr_in), - tdata); + sess->result[test_id].tdata); if (status != PJ_SUCCESS) goto on_error; |