summaryrefslogtreecommitdiff
path: root/pjlib-util
diff options
context:
space:
mode:
authorNanang Izzuddin <nanang@teluu.com>2012-08-09 05:21:25 +0000
committerNanang Izzuddin <nanang@teluu.com>2012-08-09 05:21:25 +0000
commitbb8aad5e9fd0c6ab5f5129a82936c47c667cf7f8 (patch)
tree0b6ebcd9d0865d55b76a319c1a0d9b61548e02a4 /pjlib-util
parent77baafe3eee3d31051a39d4c43ece5a63e0bffbc (diff)
Close #1567: Added option to use STUN2 format for resolving mapped address in pjsua_config.
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@4224 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjlib-util')
-rw-r--r--pjlib-util/include/pjlib-util/stun_simple.h75
-rw-r--r--pjlib-util/src/pjlib-util/stun_simple_client.c31
2 files changed, 106 insertions, 0 deletions
diff --git a/pjlib-util/include/pjlib-util/stun_simple.h b/pjlib-util/include/pjlib-util/stun_simple.h
index 773548d2..87a10110 100644
--- a/pjlib-util/include/pjlib-util/stun_simple.h
+++ b/pjlib-util/include/pjlib-util/stun_simple.h
@@ -199,6 +199,81 @@ PJ_DECL(pj_status_t) pjstun_get_mapped_addr( pj_pool_factory *pf,
const pj_str_t *srv2, int port2,
pj_sockaddr_in mapped_addr[]);
+
+/*
+ * This structre describes configurable setting for requesting mapped address.
+ */
+typedef struct pjstun_setting
+{
+ /**
+ * Specifies whether STUN request generated by old STUN library should
+ * insert magic cookie (specified in RFC 5389) in the transaction ID.
+ */
+ pj_bool_t use_stun2;
+
+ /**
+ * Host name or IP address string of the first STUN server.
+ */
+ pj_str_t srv1;
+
+ /**
+ * The port number of the first STUN server.
+ */
+ int port1;
+
+ /**
+ * Host name or IP address string of the second STUN server.
+ */
+ pj_str_t srv2;
+
+ /**
+ * The port number of the second STUN server.
+ */
+ int port2;
+
+} pjstun_setting;
+
+
+/**
+ * Another version of mapped address resolution of local sockets to multiple
+ * STUN servers configured in #pjstun_setting. This function is able to find
+ * the mapped addresses of multiple sockets simultaneously, and for each
+ * socket, two requests will be sent to two different STUN servers to see if
+ * both servers get the same public address for the same socket. (Note that
+ * application can specify the same address for the two servers, but still
+ * two requests will be sent for each server).
+ *
+ * This function will perform necessary retransmissions of the requests if
+ * response is not received within a predetermined period. When all responses
+ * have been received, the function will compare the mapped addresses returned
+ * by the servers, and when both are equal, the address will be returned in
+ * \a mapped_addr argument.
+ *
+ * @param pf The pool factory where memory will be allocated from.
+ * @param opt The STUN settings.
+ * @param sock_cnt Number of sockets in the socket array.
+ * @param sock Array of local UDP sockets which public addresses are
+ * to be queried from the STUN servers.
+ * @param mapped_addr Array to receive the mapped public address of the local
+ * UDP sockets, when the function returns PJ_SUCCESS.
+ *
+ * @return This functions returns PJ_SUCCESS if responses are
+ * received from all servers AND all servers returned the
+ * same mapped public address. Otherwise this function may
+ * return one of the following error codes:
+ * - PJLIB_UTIL_ESTUNNOTRESPOND: no respons from servers.
+ * - PJLIB_UTIL_ESTUNSYMMETRIC: different mapped addresses
+ * are returned by servers.
+ * - etc.
+ *
+ */
+PJ_DECL(pj_status_t) pjstun_get_mapped_addr2( pj_pool_factory *pf,
+ const pjstun_setting *opt,
+ int sock_cnt,
+ pj_sock_t sock[],
+ pj_sockaddr_in mapped_addr[]);
+
+
PJ_END_DECL
/**
diff --git a/pjlib-util/src/pjlib-util/stun_simple_client.c b/pjlib-util/src/pjlib-util/stun_simple_client.c
index dc13fe1a..109a49cd 100644
--- a/pjlib-util/src/pjlib-util/stun_simple_client.c
+++ b/pjlib-util/src/pjlib-util/stun_simple_client.c
@@ -42,7 +42,27 @@ PJ_DEF(pj_status_t) pjstun_get_mapped_addr( pj_pool_factory *pf,
const pj_str_t *srv2, int port2,
pj_sockaddr_in mapped_addr[])
{
+ pjstun_setting opt;
+
+ pj_bzero(&opt, sizeof(opt));
+ opt.use_stun2 = PJ_FALSE;
+ opt.srv1 = *srv1;
+ opt.port1 = port1;
+ opt.srv2 = *srv2;
+ opt.port2 = port2;
+
+ return pjstun_get_mapped_addr2(pf, &opt, sock_cnt, sock, mapped_addr);
+}
+
+PJ_DEF(pj_status_t) pjstun_get_mapped_addr2(pj_pool_factory *pf,
+ const pjstun_setting *opt,
+ int sock_cnt,
+ pj_sock_t sock[],
+ pj_sockaddr_in mapped_addr[])
+{
unsigned srv_cnt;
+ const pj_str_t *srv1, *srv2;
+ int port1, port2;
pj_sockaddr_in srv_addr[2];
int i, send_cnt = 0, nfds;
pj_pool_t *pool;
@@ -59,6 +79,11 @@ PJ_DEF(pj_status_t) pjstun_get_mapped_addr( pj_pool_factory *pf,
PJ_CHECK_STACK();
+ srv1 = &opt->srv1;
+ port1 = opt->port1;
+ srv2 = &opt->srv1;
+ port2 = opt->port2;
+
TRACE_((THIS_FILE, "Entering pjstun_get_mapped_addr()"));
/* Create pool. */
@@ -82,6 +107,12 @@ PJ_DEF(pj_status_t) pjstun_get_mapped_addr( pj_pool_factory *pf,
if (status != PJ_SUCCESS)
goto on_error;
+ /* Insert magic cookie (specified in RFC 5389) when requested to. */
+ if (opt->use_stun2) {
+ pjstun_msg_hdr *hdr = (pjstun_msg_hdr*)out_msg;
+ hdr->tsx[0] = pj_htonl(STUN_MAGIC);
+ }
+
TRACE_((THIS_FILE, " Binding request created."));
/* Resolve servers. */