diff options
author | Nanang Izzuddin <nanang@teluu.com> | 2010-07-06 08:11:04 +0000 |
---|---|---|
committer | Nanang Izzuddin <nanang@teluu.com> | 2010-07-06 08:11:04 +0000 |
commit | e96bece6bdc9ccdff04632d7e15f3eb5c6d7d8e2 (patch) | |
tree | f5b7e918a082c8e0626f059dae2b1718b36d7b48 /pjlib-util/src/pjlib-util/stun_simple_client.c | |
parent | 328097bf3f6ac7538e8573ee2770d55c67924a79 (diff) |
Fix #1078: added XOR_MAPPED_ADDRESS parsing capability to the resolver.
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@3235 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjlib-util/src/pjlib-util/stun_simple_client.c')
-rw-r--r-- | pjlib-util/src/pjlib-util/stun_simple_client.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/pjlib-util/src/pjlib-util/stun_simple_client.c b/pjlib-util/src/pjlib-util/stun_simple_client.c index cd21f7f0..fa4fb966 100644 --- a/pjlib-util/src/pjlib-util/stun_simple_client.c +++ b/pjlib-util/src/pjlib-util/stun_simple_client.c @@ -29,6 +29,7 @@ enum { MAX_REQUEST = 4 }; static int stun_timer[] = {1000, 1000, 1000, 1000 }; +#define STUN_MAGIC 0x2112A442 #define THIS_FILE "stun_client.c" #define LOG_ADDR(addr) pj_inet_ntoa(addr.sin_addr), pj_ntohs(addr.sin_port) @@ -223,12 +224,20 @@ PJ_DEF(pj_status_t) pjstun_get_mapped_addr( pj_pool_factory *pf, attr = (pjstun_mapped_addr_attr*) pjstun_msg_find_attr(&msg, PJSTUN_ATTR_MAPPED_ADDR); if (!attr) { - status = PJLIB_UTIL_ESTUNNOMAP; - continue; + attr = (pjstun_mapped_addr_attr*) + pjstun_msg_find_attr(&msg, PJSTUN_ATTR_XOR_MAPPED_ADDR); + if (!attr || attr->family != 1) { + status = PJLIB_UTIL_ESTUNNOMAP; + continue; + } } rec[sock_idx].srv[srv_idx].mapped_addr = attr->addr; rec[sock_idx].srv[srv_idx].mapped_port = attr->port; + if (pj_ntohs(attr->hdr.type) == PJSTUN_ATTR_XOR_MAPPED_ADDR) { + rec[sock_idx].srv[srv_idx].mapped_addr ^= pj_htonl(STUN_MAGIC); + rec[sock_idx].srv[srv_idx].mapped_port ^= pj_htons(STUN_MAGIC >> 16); + } } } |