summaryrefslogtreecommitdiff
path: root/pjnath
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2007-10-16 14:10:58 +0000
committerBenny Prijono <bennylp@teluu.com>2007-10-16 14:10:58 +0000
commit2ab98f7d75d9b16f493d9c89a6480a61c21ba3f4 (patch)
treef4a5137815ddd22942ea1912c736b9b5d7687b2a /pjnath
parente8cb0501f0c6f32ff49396e1d1b6603860cc0262 (diff)
Tolerate more ICMP errors in ICE media transport
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@1503 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjnath')
-rw-r--r--pjnath/src/pjnath/ice_strans.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/pjnath/src/pjnath/ice_strans.c b/pjnath/src/pjnath/ice_strans.c
index d44bec0c..f413b9c7 100644
--- a/pjnath/src/pjnath/ice_strans.c
+++ b/pjnath/src/pjnath/ice_strans.c
@@ -25,6 +25,7 @@
#include <pj/pool.h>
#include <pj/rand.h>
#include <pj/string.h>
+#include <pj/compat/socket.h>
#if 0
@@ -440,7 +441,7 @@ static void on_read_complete(pj_ioqueue_key_t *key,
pj_ioqueue_get_user_data(key);
pj_ice_strans *ice_st = comp->ice_st;
pj_ssize_t pkt_size;
- enum { RETRY = 4 };
+ enum { RETRY = 10 };
unsigned retry;
pj_status_t status;
@@ -515,13 +516,21 @@ static void on_read_complete(pj_ioqueue_key_t *key,
}
/* Read next packet */
- for (retry=0; retry<RETRY; ++retry) {
+ for (retry=0; retry<RETRY;) {
pkt_size = sizeof(comp->pkt);
comp->src_addr_len = sizeof(comp->src_addr);
status = pj_ioqueue_recvfrom(key, op_key, comp->pkt, &pkt_size,
PJ_IOQUEUE_ALWAYS_ASYNC,
&comp->src_addr, &comp->src_addr_len);
- if (status != PJ_SUCCESS && status != PJ_EPENDING) {
+ if (status == PJ_STATUS_FROM_OS(OSERR_EWOULDBLOCK) ||
+ status == PJ_STATUS_FROM_OS(OSERR_EINPROGRESS) ||
+ status == PJ_STATUS_FROM_OS(OSERR_ECONNRESET))
+ {
+ ice_st_perror(comp->ice_st, "ioqueue recvfrom() error", status);
+ ++retry;
+ continue;
+ } else if (status != PJ_SUCCESS && status != PJ_EPENDING) {
+ retry += 2;
ice_st_perror(comp->ice_st, "ioqueue recvfrom() error", status);
} else {
break;