From e96bece6bdc9ccdff04632d7e15f3eb5c6d7d8e2 Mon Sep 17 00:00:00 2001 From: Nanang Izzuddin Date: Tue, 6 Jul 2010 08:11:04 +0000 Subject: 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 --- pjlib-util/src/pjlib-util/stun_simple_client.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) (limited to 'pjlib-util/src/pjlib-util/stun_simple_client.c') 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); + } } } -- cgit v1.2.3