diff options
author | Benny Prijono <bennylp@teluu.com> | 2007-10-16 14:10:58 +0000 |
---|---|---|
committer | Benny Prijono <bennylp@teluu.com> | 2007-10-16 14:10:58 +0000 |
commit | 2ab98f7d75d9b16f493d9c89a6480a61c21ba3f4 (patch) | |
tree | f4a5137815ddd22942ea1912c736b9b5d7687b2a /pjnath | |
parent | e8cb0501f0c6f32ff49396e1d1b6603860cc0262 (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.c | 15 |
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; |