summaryrefslogtreecommitdiff
path: root/pjnath/src/pjnath-test/stun_sock_test.c
diff options
context:
space:
mode:
Diffstat (limited to 'pjnath/src/pjnath-test/stun_sock_test.c')
-rw-r--r--pjnath/src/pjnath-test/stun_sock_test.c104
1 files changed, 68 insertions, 36 deletions
diff --git a/pjnath/src/pjnath-test/stun_sock_test.c b/pjnath/src/pjnath-test/stun_sock_test.c
index 3b090400..fff4fad2 100644
--- a/pjnath/src/pjnath-test/stun_sock_test.c
+++ b/pjnath/src/pjnath-test/stun_sock_test.c
@@ -89,15 +89,21 @@ static pj_bool_t srv_on_data_recvfrom(pj_activesock_t *asock,
/* Add MAPPED-ADDRESS or XOR-MAPPED-ADDRESS (or don't add) */
if (srv->flag & WITH_MAPPED) {
- pj_sockaddr_in addr;
+ pj_sockaddr addr;
+ pj_bool_t use_ipv6 = (srv->addr.addr.sa_family == pj_AF_INET6());
+
+ pj_sockaddr_init(GET_AF(use_ipv6), &addr, &srv->ip_to_send,
+ srv->port_to_send);
- pj_sockaddr_in_init(&addr, &srv->ip_to_send, srv->port_to_send);
pj_stun_msg_add_sockaddr_attr(pool, res_msg, PJ_STUN_ATTR_MAPPED_ADDR,
PJ_FALSE, &addr, sizeof(addr));
} else if (srv->flag & WITH_XOR_MAPPED) {
- pj_sockaddr_in addr;
+ pj_sockaddr addr;
+ pj_bool_t use_ipv6 = (srv->addr.addr.sa_family == pj_AF_INET6());
+
+ pj_sockaddr_init(GET_AF(use_ipv6), &addr, &srv->ip_to_send,
+ srv->port_to_send);
- pj_sockaddr_in_init(&addr, &srv->ip_to_send, srv->port_to_send);
pj_stun_msg_add_sockaddr_attr(pool, res_msg,
PJ_STUN_ATTR_XOR_MAPPED_ADDR,
PJ_TRUE, &addr, sizeof(addr));
@@ -133,6 +139,7 @@ static pj_bool_t srv_on_data_recvfrom(pj_activesock_t *asock,
static pj_status_t create_server(pj_pool_t *pool,
pj_ioqueue_t *ioqueue,
unsigned flag,
+ pj_bool_t use_ipv6,
struct stun_srv **p_srv)
{
struct stun_srv *srv;
@@ -141,10 +148,10 @@ static pj_status_t create_server(pj_pool_t *pool,
srv = PJ_POOL_ZALLOC_T(pool, struct stun_srv);
srv->flag = flag;
- srv->ip_to_send = pj_str("1.1.1.1");
+ srv->ip_to_send = (use_ipv6)?pj_str("2002:101:101::"):pj_str("1.1.1.1");
srv->port_to_send = 1000;
- status = pj_sockaddr_in_init(&srv->addr.ipv4, NULL, 0);
+ status = pj_sockaddr_init(GET_AF(use_ipv6), &srv->addr, NULL, 0);
if (status != PJ_SUCCESS)
return status;
@@ -230,7 +237,8 @@ static pj_bool_t stun_sock_on_rx_data(pj_stun_sock *stun_sock,
static pj_status_t create_client(pj_stun_config *cfg,
struct stun_client **p_client,
- pj_bool_t destroy_on_err)
+ pj_bool_t destroy_on_err,
+ pj_bool_t use_ipv6)
{
pj_pool_t *pool;
struct stun_client *client;
@@ -247,8 +255,8 @@ static pj_status_t create_client(pj_stun_config *cfg,
pj_bzero(&cb, sizeof(cb));
cb.on_status = &stun_sock_on_status;
cb.on_rx_data = &stun_sock_on_rx_data;
- status = pj_stun_sock_create(cfg, NULL, pj_AF_INET(), &cb,
- &sock_cfg, client, &client->sock);
+ status = pj_stun_sock_create(cfg, NULL, GET_AF(use_ipv6), &cb, &sock_cfg,
+ client, &client->sock);
if (status != PJ_SUCCESS) {
app_perror(" pj_stun_sock_create()", status);
pj_pool_release(pool);
@@ -292,7 +300,8 @@ static void handle_events(pj_stun_config *cfg, unsigned msec_delay)
/*
* Timeout test: scenario when no response is received from server
*/
-static int timeout_test(pj_stun_config *cfg, pj_bool_t destroy_on_err)
+static int timeout_test(pj_stun_config *cfg, pj_bool_t destroy_on_err,
+ pj_bool_t use_ipv6)
{
struct stun_srv *srv;
struct stun_client *client;
@@ -301,21 +310,23 @@ static int timeout_test(pj_stun_config *cfg, pj_bool_t destroy_on_err)
int i, ret = 0;
pj_status_t status;
- PJ_LOG(3,(THIS_FILE, " timeout test [%d]", destroy_on_err));
+ PJ_LOG(3,(THIS_FILE, " timeout test [%d] - (%s)", destroy_on_err,
+ (use_ipv6)?"IPv6":"IPv4"));
- status = create_client(cfg, &client, destroy_on_err);
+ status = create_client(cfg, &client, destroy_on_err, use_ipv6);
if (status != PJ_SUCCESS)
return -10;
- status = create_server(client->pool, cfg->ioqueue, 0, &srv);
+ status = create_server(client->pool, cfg->ioqueue, 0, use_ipv6, &srv);
if (status != PJ_SUCCESS) {
destroy_client(client);
return -20;
}
- srv_addr = pj_str("127.0.0.1");
+ srv_addr = (use_ipv6)?pj_str("::1"):pj_str("127.0.0.1");
+
status = pj_stun_sock_start(client->sock, &srv_addr,
- pj_ntohs(srv->addr.ipv4.sin_port), NULL);
+ pj_sockaddr_get_port(&srv->addr), NULL);
if (status != PJ_SUCCESS) {
destroy_server(srv);
destroy_client(client);
@@ -361,6 +372,10 @@ on_return:
destroy_client(client);
for (i=0; i<7; ++i)
handle_events(cfg, 100);
+
+ if ((ret == 0) && use_ipv6)
+ ret = timeout_test(cfg, destroy_on_err, 0);
+
return ret;
}
@@ -369,7 +384,8 @@ on_return:
* Invalid response scenario: when server returns no MAPPED-ADDRESS or
* XOR-MAPPED-ADDRESS attribute.
*/
-static int missing_attr_test(pj_stun_config *cfg, pj_bool_t destroy_on_err)
+static int missing_attr_test(pj_stun_config *cfg, pj_bool_t destroy_on_err,
+ pj_bool_t use_ipv6)
{
struct stun_srv *srv;
struct stun_client *client;
@@ -378,21 +394,23 @@ static int missing_attr_test(pj_stun_config *cfg, pj_bool_t destroy_on_err)
int i, ret = 0;
pj_status_t status;
- PJ_LOG(3,(THIS_FILE, " missing attribute test [%d]", destroy_on_err));
+ PJ_LOG(3,(THIS_FILE, " missing attribute test [%d] - (%s)",
+ destroy_on_err, (use_ipv6)?"IPv6":"IPv4"));
- status = create_client(cfg, &client, destroy_on_err);
+ status = create_client(cfg, &client, destroy_on_err, use_ipv6);
if (status != PJ_SUCCESS)
return -110;
- status = create_server(client->pool, cfg->ioqueue, RESPOND_STUN, &srv);
+ status = create_server(client->pool, cfg->ioqueue, RESPOND_STUN, use_ipv6,
+ &srv);
if (status != PJ_SUCCESS) {
destroy_client(client);
return -120;
}
+ srv_addr = (use_ipv6)?pj_str("::1"):pj_str("127.0.0.1");
- srv_addr = pj_str("127.0.0.1");
status = pj_stun_sock_start(client->sock, &srv_addr,
- pj_ntohs(srv->addr.ipv4.sin_port), NULL);
+ pj_sockaddr_get_port(&srv->addr), NULL);
if (status != PJ_SUCCESS) {
destroy_server(srv);
destroy_client(client);
@@ -430,30 +448,36 @@ on_return:
destroy_client(client);
for (i=0; i<7; ++i)
handle_events(cfg, 100);
+
+ if ((ret == 0) && use_ipv6)
+ ret = missing_attr_test(cfg, destroy_on_err, 0);
+
return ret;
}
/*
* Keep-alive test.
*/
-static int keep_alive_test(pj_stun_config *cfg)
+static int keep_alive_test(pj_stun_config *cfg, pj_bool_t use_ipv6)
{
struct stun_srv *srv;
struct stun_client *client;
- pj_sockaddr_in mapped_addr;
+ pj_sockaddr mapped_addr;
pj_stun_sock_info info;
pj_str_t srv_addr;
pj_time_val timeout, t;
int i, ret = 0;
pj_status_t status;
- PJ_LOG(3,(THIS_FILE, " normal operation"));
+ PJ_LOG(3,(THIS_FILE, " normal operation - (%s)",
+ (use_ipv6)?"IPv6":"IPv4"));
- status = create_client(cfg, &client, PJ_TRUE);
+ status = create_client(cfg, &client, PJ_TRUE, use_ipv6);
if (status != PJ_SUCCESS)
return -310;
- status = create_server(client->pool, cfg->ioqueue, RESPOND_STUN|WITH_XOR_MAPPED, &srv);
+ status = create_server(client->pool, cfg->ioqueue, RESPOND_STUN|WITH_XOR_MAPPED,
+ use_ipv6, &srv);
if (status != PJ_SUCCESS) {
destroy_client(client);
return -320;
@@ -463,9 +487,11 @@ static int keep_alive_test(pj_stun_config *cfg)
* Part 1: initial Binding resolution.
*/
PJ_LOG(3,(THIS_FILE, " initial Binding request"));
- srv_addr = pj_str("127.0.0.1");
+
+ srv_addr = (use_ipv6)?pj_str("::1"):pj_str("127.0.0.1");
+
status = pj_stun_sock_start(client->sock, &srv_addr,
- pj_ntohs(srv->addr.ipv4.sin_port), NULL);
+ pj_sockaddr_get_port(&srv->addr), NULL);
if (status != PJ_SUCCESS) {
destroy_server(srv);
destroy_client(client);
@@ -521,7 +547,8 @@ static int keep_alive_test(pj_stun_config *cfg)
goto on_return;
}
/* verify the mapped address */
- pj_sockaddr_in_init(&mapped_addr, &srv->ip_to_send, srv->port_to_send);
+ pj_sockaddr_init(GET_AF(use_ipv6), &mapped_addr,
+ &srv->ip_to_send, srv->port_to_send);
if (pj_sockaddr_cmp(&info.mapped_addr, &mapped_addr) != 0) {
PJ_LOG(3,(THIS_FILE, " error: mapped address mismatched"));
ret = -383;
@@ -658,7 +685,7 @@ static int keep_alive_test(pj_stun_config *cfg)
srv->flag = RESPOND_STUN | WITH_XOR_MAPPED;
/* Change mapped address in the response */
- srv->ip_to_send = pj_str("2.2.2.2");
+ srv->ip_to_send = (use_ipv6)?pj_str("2002:202:202::"):pj_str("2.2.2.2");
srv->port_to_send++;
/* Reset server */
@@ -729,7 +756,8 @@ static int keep_alive_test(pj_stun_config *cfg)
goto on_return;
}
/* verify the mapped address */
- pj_sockaddr_in_init(&mapped_addr, &srv->ip_to_send, srv->port_to_send);
+ pj_sockaddr_init(GET_AF(use_ipv6), &mapped_addr,
+ &srv->ip_to_send, srv->port_to_send);
if (pj_sockaddr_cmp(&info.mapped_addr, &mapped_addr) != 0) {
PJ_LOG(3,(THIS_FILE, " error: mapped address mismatched"));
ret = -520;
@@ -797,6 +825,10 @@ on_return:
destroy_client(client);
for (i=0; i<7; ++i)
handle_events(cfg, 100);
+
+ if ((ret == 0) && use_ipv6)
+ ret = keep_alive_test(cfg, 0);
+
return ret;
}
@@ -837,13 +869,13 @@ int stun_sock_test(void)
pj_stun_config_init(&stun_cfg, mem, 0, ioqueue, timer_heap);
- DO_TEST(timeout_test(&stun_cfg, PJ_FALSE));
- DO_TEST(timeout_test(&stun_cfg, PJ_TRUE));
+ DO_TEST(timeout_test(&stun_cfg, PJ_FALSE, USE_IPV6));
+ DO_TEST(timeout_test(&stun_cfg, PJ_TRUE, USE_IPV6));
- DO_TEST(missing_attr_test(&stun_cfg, PJ_FALSE));
- DO_TEST(missing_attr_test(&stun_cfg, PJ_TRUE));
+ DO_TEST(missing_attr_test(&stun_cfg, PJ_FALSE, USE_IPV6));
+ DO_TEST(missing_attr_test(&stun_cfg, PJ_TRUE, USE_IPV6));
- DO_TEST(keep_alive_test(&stun_cfg));
+ DO_TEST(keep_alive_test(&stun_cfg, USE_IPV6));
on_return:
if (timer_heap) pj_timer_heap_destroy(timer_heap);