summaryrefslogtreecommitdiff
path: root/pjnath
diff options
context:
space:
mode:
authorRiza Sulistyo <riza@teluu.com>2016-06-21 06:55:10 +0000
committerRiza Sulistyo <riza@teluu.com>2016-06-21 06:55:10 +0000
commit2fb94652ccf7a0ea85e267cfe1d652db0a98893c (patch)
tree3b73db74746aa536da94e7439715626864b1492c /pjnath
parentb80242b94843137edd58e9075a892c7971b7bf55 (diff)
Re #1933: Update pjnath-test for IPv6 support.
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@5350 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjnath')
-rw-r--r--pjnath/src/pjnath-test/ice_test.c357
-rw-r--r--pjnath/src/pjnath-test/server.c58
-rw-r--r--pjnath/src/pjnath-test/server.h10
-rw-r--r--pjnath/src/pjnath-test/sess_auth.c55
-rw-r--r--pjnath/src/pjnath-test/stun_sock_test.c104
-rw-r--r--pjnath/src/pjnath-test/test.h8
-rw-r--r--pjnath/src/pjnath-test/turn_sock_test.c60
-rw-r--r--pjnath/src/pjnath/stun_msg_dump.c14
8 files changed, 470 insertions, 196 deletions
diff --git a/pjnath/src/pjnath-test/ice_test.c b/pjnath/src/pjnath-test/ice_test.c
index 4317cc7a..dfd7b84d 100644
--- a/pjnath/src/pjnath-test/ice_test.c
+++ b/pjnath/src/pjnath-test/ice_test.c
@@ -39,12 +39,14 @@ enum
{
WRONG_TURN = 1,
DEL_ON_ERR = 2,
+ CLIENT_IPV4 = 4,
+ CLIENT_IPV6 = 8
};
-
/* Test results */
struct test_result
{
+ pj_status_t start_status; /* start ice successful? */
pj_status_t init_status; /* init successful? */
pj_status_t nego_status; /* negotiation successful? */
unsigned rx_cnt[4]; /* Number of data received */
@@ -101,7 +103,8 @@ struct test_sess
struct sess_param *param;
- test_server *server;
+ test_server *server1; /* Test server for IPv4. */
+ test_server *server2; /* Test server for IPv6. */
pj_thread_t *worker_threads[MAX_THREADS];
@@ -121,23 +124,89 @@ static void ice_on_ice_complete(pj_ice_strans *ice_st,
pj_status_t status);
static void destroy_sess(struct test_sess *sess, unsigned wait_msec);
+static void set_stun_turn_cfg(struct ice_ept *ept,
+ pj_ice_strans_cfg *ice_cfg,
+ char *serverip,
+ pj_bool_t use_ipv6)
+{
+ if (ept->cfg.enable_stun & YES) {
+ unsigned stun_idx = ice_cfg->stun_tp_cnt++;
+ pj_ice_strans_stun_cfg_default(&ice_cfg->stun_tp[stun_idx]);
+
+ if ((ept->cfg.enable_stun & SRV) == SRV) {
+ ice_cfg->stun_tp[stun_idx].server = pj_str(SRV_DOMAIN);
+ } else {
+ ice_cfg->stun_tp[stun_idx].server = pj_str(serverip);
+ }
+ ice_cfg->stun_tp[stun_idx].port = STUN_SERVER_PORT;
+
+ ice_cfg->stun_tp[stun_idx].af = GET_AF(use_ipv6);
+ }
+ ice_cfg->stun.af = GET_AF(use_ipv6);
+ if (ept->cfg.enable_host == 0) {
+ ice_cfg->stun.max_host_cands = 0;
+ } else {
+ //ice_cfg.stun.no_host_cands = PJ_FALSE;
+ ice_cfg->stun.loop_addr = PJ_TRUE;
+ }
+
+ if (ept->cfg.enable_turn & YES) {
+ unsigned turn_idx = ice_cfg->turn_tp_cnt++;
+ pj_ice_strans_turn_cfg_default(&ice_cfg->turn_tp[turn_idx]);
+
+ if ((ept->cfg.enable_turn & SRV) == SRV) {
+ ice_cfg->turn_tp[turn_idx].server = pj_str(SRV_DOMAIN);
+ } else {
+ ice_cfg->turn_tp[turn_idx].server = pj_str(serverip);
+ }
+ ice_cfg->turn_tp[turn_idx].port = TURN_SERVER_PORT;
+ ice_cfg->turn_tp[turn_idx].conn_type = PJ_TURN_TP_UDP;
+ ice_cfg->turn_tp[turn_idx].auth_cred.type = PJ_STUN_AUTH_CRED_STATIC;
+ ice_cfg->turn_tp[turn_idx].auth_cred.data.static_cred.realm =
+ pj_str(SRV_DOMAIN);
+ if (ept->cfg.client_flag & WRONG_TURN)
+ ice_cfg->turn_tp[turn_idx].auth_cred.data.static_cred.username =
+ pj_str("xxx");
+ else
+ ice_cfg->turn_tp[turn_idx].auth_cred.data.static_cred.username =
+ pj_str(TURN_USERNAME);
+
+ ice_cfg->turn_tp[turn_idx].auth_cred.data.static_cred.data_type =
+ PJ_STUN_PASSWD_PLAIN;
+ ice_cfg->turn_tp[turn_idx].auth_cred.data.static_cred.data =
+ pj_str(TURN_PASSWD);
+
+ ice_cfg->turn_tp[turn_idx].af = GET_AF(use_ipv6);
+ }
+}
+
/* Create ICE stream transport */
static int create_ice_strans(struct test_sess *test_sess,
- struct ice_ept *ept,
+ struct ice_ept *ept,
pj_ice_strans **p_ice)
{
pj_ice_strans *ice;
pj_ice_strans_cb ice_cb;
pj_ice_strans_cfg ice_cfg;
pj_sockaddr hostip;
- char serverip[PJ_INET6_ADDRSTRLEN];
+ char serveripv4[PJ_INET6_ADDRSTRLEN];
+ char serveripv6[PJ_INET6_ADDRSTRLEN];
pj_status_t status;
+ unsigned flag = (ept->cfg.client_flag)?ept->cfg.client_flag:CLIENT_IPV4;
status = pj_gethostip(pj_AF_INET(), &hostip);
if (status != PJ_SUCCESS)
return -1030;
- pj_sockaddr_print(&hostip, serverip, sizeof(serverip), 0);
+ pj_sockaddr_print(&hostip, serveripv4, sizeof(serveripv4), 0);
+
+ if (flag & CLIENT_IPV6) {
+ status = pj_gethostip(pj_AF_INET6(), &hostip);
+ if (status != PJ_SUCCESS)
+ return -1031;
+
+ pj_sockaddr_print(&hostip, serveripv6, sizeof(serveripv6), 0);
+ }
/* Init callback structure */
pj_bzero(&ice_cb, sizeof(ice_cb));
@@ -150,39 +219,12 @@ static int create_ice_strans(struct test_sess *test_sess,
if ((ept->cfg.enable_stun & SRV)==SRV || (ept->cfg.enable_turn & SRV)==SRV)
ice_cfg.resolver = test_sess->resolver;
- if (ept->cfg.enable_stun & YES) {
- if ((ept->cfg.enable_stun & SRV) == SRV) {
- ice_cfg.stun.server = pj_str(SRV_DOMAIN);
- } else {
- ice_cfg.stun.server = pj_str(serverip);
- }
- ice_cfg.stun.port = STUN_SERVER_PORT;
+ if (flag & CLIENT_IPV4) {
+ set_stun_turn_cfg(ept, &ice_cfg, serveripv4, PJ_FALSE);
}
- if (ept->cfg.enable_host == 0) {
- ice_cfg.stun.max_host_cands = 0;
- } else {
- //ice_cfg.stun.no_host_cands = PJ_FALSE;
- ice_cfg.stun.loop_addr = PJ_TRUE;
- }
-
-
- if (ept->cfg.enable_turn & YES) {
- if ((ept->cfg.enable_turn & SRV) == SRV) {
- ice_cfg.turn.server = pj_str(SRV_DOMAIN);
- } else {
- ice_cfg.turn.server = pj_str(serverip);
- }
- ice_cfg.turn.port = TURN_SERVER_PORT;
- ice_cfg.turn.conn_type = PJ_TURN_TP_UDP;
- ice_cfg.turn.auth_cred.type = PJ_STUN_AUTH_CRED_STATIC;
- ice_cfg.turn.auth_cred.data.static_cred.realm = pj_str(SRV_DOMAIN);
- if (ept->cfg.client_flag & WRONG_TURN)
- ice_cfg.turn.auth_cred.data.static_cred.username = pj_str("xxx");
- else
- ice_cfg.turn.auth_cred.data.static_cred.username = pj_str(TURN_USERNAME);
- ice_cfg.turn.auth_cred.data.static_cred.data_type = PJ_STUN_PASSWD_PLAIN;
- ice_cfg.turn.auth_cred.data.static_cred.data = pj_str(TURN_PASSWD);
+ if (flag & CLIENT_IPV6) {
+ set_stun_turn_cfg(ept, &ice_cfg, serveripv6, PJ_TRUE);
}
/* Create ICE stream transport */
@@ -215,7 +257,7 @@ static int create_sess(pj_stun_config *stun_cfg,
pj_str_t ns_ip;
pj_uint16_t ns_port;
unsigned flags;
- pj_status_t status;
+ pj_status_t status = PJ_SUCCESS;
/* Create session structure */
pool = pj_pool_create(mem, "testsess", 512, 512, NULL);
@@ -232,31 +274,53 @@ static int create_sess(pj_stun_config *stun_cfg,
/* Create server */
flags = server_flag;
- status = create_test_server(stun_cfg, flags, SRV_DOMAIN, &sess->server);
+ if (flags & SERVER_IPV4) {
+ status = create_test_server(stun_cfg, (flags & ~SERVER_IPV6),
+ SRV_DOMAIN, &sess->server1);
+ }
+
+ if ((status == PJ_SUCCESS) && (flags & SERVER_IPV6)) {
+ status = create_test_server(stun_cfg, (flags & ~SERVER_IPV4),
+ SRV_DOMAIN, &sess->server2);
+ }
+
if (status != PJ_SUCCESS) {
app_perror(INDENT "error: create_test_server()", status);
destroy_sess(sess, 500);
return -10;
}
- sess->server->turn_respond_allocate =
- sess->server->turn_respond_refresh = PJ_TRUE;
+ if (flags & SERVER_IPV4) {
+ sess->server1->turn_respond_allocate =
+ sess->server1->turn_respond_refresh = PJ_TRUE;
+ }
- /* Create resolver */
- status = pj_dns_resolver_create(mem, NULL, 0, stun_cfg->timer_heap,
- stun_cfg->ioqueue, &sess->resolver);
- if (status != PJ_SUCCESS) {
- app_perror(INDENT "error: pj_dns_resolver_create()", status);
- destroy_sess(sess, 500);
- return -20;
+ if (flags & SERVER_IPV6) {
+ sess->server2->turn_respond_allocate =
+ sess->server2->turn_respond_refresh = PJ_TRUE;
}
- ns_ip = pj_str("127.0.0.1");
- ns_port = (pj_uint16_t)DNS_SERVER_PORT;
- status = pj_dns_resolver_set_ns(sess->resolver, 1, &ns_ip, &ns_port);
- if (status != PJ_SUCCESS) {
- app_perror( INDENT "error: pj_dns_resolver_set_ns()", status);
- destroy_sess(sess, 500);
- return -21;
+ /* Create resolver */
+ if ((sess->callee.cfg.enable_stun & SRV)==SRV ||
+ (sess->callee.cfg.enable_turn & SRV)==SRV ||
+ (sess->caller.cfg.enable_stun & SRV)==SRV ||
+ (sess->caller.cfg.enable_turn & SRV)==SRV)
+ {
+ status = pj_dns_resolver_create(mem, NULL, 0, stun_cfg->timer_heap,
+ stun_cfg->ioqueue, &sess->resolver);
+ if (status != PJ_SUCCESS) {
+ app_perror(INDENT "error: pj_dns_resolver_create()", status);
+ destroy_sess(sess, 500);
+ return -20;
+ }
+
+ ns_ip = (flags & SERVER_IPV6)?pj_str("::1"):pj_str("127.0.0.1");
+ ns_port = (pj_uint16_t)DNS_SERVER_PORT;
+ status = pj_dns_resolver_set_ns(sess->resolver, 1, &ns_ip, &ns_port);
+ if (status != PJ_SUCCESS) {
+ app_perror(INDENT "error: pj_dns_resolver_set_ns()", status);
+ destroy_sess(sess, 500);
+ return -21;
+ }
}
/* Create caller ICE stream transport */
@@ -305,9 +369,14 @@ static void destroy_sess(struct test_sess *sess, unsigned wait_msec)
sess->resolver = NULL;
}
- if (sess->server) {
- destroy_test_server(sess->server);
- sess->server = NULL;
+ if (sess->server1) {
+ destroy_test_server(sess->server1);
+ sess->server1 = NULL;
+ }
+
+ if (sess->server2) {
+ destroy_test_server(sess->server2);
+ sess->server2 = NULL;
}
if (sess->pool) {
@@ -384,12 +453,13 @@ static pj_status_t start_ice(struct ice_ept *ept, const struct ice_ept *remote)
status = pj_ice_strans_start_ice(ept->ice, &remote->ufrag, &remote->pass,
rcand_cnt, rcand);
- if (status != PJ_SUCCESS) {
+
+ if (status != ept->cfg.expected.start_status) {
app_perror(INDENT "err: pj_ice_strans_start_ice()", status);
return status;
}
- return PJ_SUCCESS;
+ return status;
}
@@ -498,12 +568,25 @@ static int perform_test2(const char *title,
struct test_sess *sess;
unsigned i;
int rc;
+ char add_title1[16];
+ char add_title2[16];
+ pj_bool_t client_mix_test = ((callee_cfg->client_flag &
+ (CLIENT_IPV4+CLIENT_IPV6)) !=
+ (caller_cfg->client_flag &
+ (CLIENT_IPV4+CLIENT_IPV6)));
- PJ_LOG(3,(THIS_FILE, INDENT "%s", title));
+ sprintf(add_title1, "%s%s%s", (server_flag & SERVER_IPV4)?"IPv4":"",
+ ((server_flag & SERVER_IPV4)&&(server_flag & SERVER_IPV6))?"+":"",
+ (server_flag & SERVER_IPV6)?"IPv6":"");
+
+ sprintf(add_title2, "%s", client_mix_test?"Mix test":"");
+
+ PJ_LOG(3,(THIS_FILE, INDENT "%s (%s) %s", title, add_title1, add_title2));
capture_pjlib_state(stun_cfg, &pjlib_state);
- rc = create_sess(stun_cfg, server_flag, caller_cfg, callee_cfg, test_param, &sess);
+ rc = create_sess(stun_cfg, server_flag, caller_cfg, callee_cfg, test_param,
+ &sess);
if (rc != 0)
return rc;
@@ -557,16 +640,18 @@ static int perform_test2(const char *title,
/* Start ICE on callee */
rc = start_ice(&sess->callee, &sess->caller);
if (rc != PJ_SUCCESS) {
- destroy_sess(sess, 500);
- return -120;
+ int retval = (rc == sess->callee.cfg.expected.start_status)?0:-120;
+ destroy_sess(sess, 500);
+ return retval;
}
/* Wait for callee's answer_delay */
poll_events(stun_cfg, sess->callee.cfg.answer_delay, PJ_FALSE);
/* Start ICE on caller */
rc = start_ice(&sess->caller, &sess->callee);
if (rc != PJ_SUCCESS) {
+ int retval = (rc == sess->caller.cfg.expected.start_status)?0:-130;
destroy_sess(sess, 500);
- return -130;
+ return retval;
}
for (i=0; i<sess->param->worker_cnt; ++i) {
@@ -663,6 +748,23 @@ on_return:
return rc;
}
+static void set_client_server_flag(unsigned server_flag,
+ unsigned caller_flag,
+ unsigned callee_flag,
+ unsigned *res_server_flag,
+ unsigned *res_caller_flag,
+ unsigned *res_callee_flag)
+{
+ enum {
+ RST_CLT_FLAG = CLIENT_IPV4+CLIENT_IPV6,
+ RST_SRV_FLAG = SERVER_IPV4+SERVER_IPV6
+ };
+
+ *res_server_flag = (*res_server_flag & ~RST_SRV_FLAG) | server_flag;
+ *res_caller_flag = (*res_caller_flag & ~RST_CLT_FLAG) | caller_flag;
+ *res_callee_flag = (*res_callee_flag & ~RST_CLT_FLAG) | callee_flag;
+}
+
static int perform_test(const char *title,
pj_stun_config *stun_cfg,
unsigned server_flag,
@@ -670,10 +772,67 @@ static int perform_test(const char *title,
struct test_cfg *callee_cfg)
{
struct sess_param test_param;
+ int rc;
+ int expected_caller_start_ice = caller_cfg->expected.start_status;
+ int expected_callee_start_ice = callee_cfg->expected.start_status;
+
+ set_client_server_flag(SERVER_IPV4, CLIENT_IPV4, CLIENT_IPV4,
+ &server_flag, &caller_cfg->client_flag,
+ &callee_cfg->client_flag);
+
pj_bzero(&test_param, sizeof(test_param));
- return perform_test2(title, stun_cfg, server_flag, caller_cfg,
- callee_cfg, &test_param);
+
+ rc = perform_test2(title, stun_cfg, server_flag, caller_cfg,
+ callee_cfg, &test_param);
+
+#if USE_IPV6
+ /* Test for IPV6. */
+ if (rc == PJ_SUCCESS) {
+ pj_bzero(&test_param, sizeof(test_param));
+ set_client_server_flag(SERVER_IPV6, CLIENT_IPV6, CLIENT_IPV6,
+ &server_flag, &caller_cfg->client_flag,
+ &callee_cfg->client_flag);
+
+ rc = perform_test2(title, stun_cfg, server_flag, caller_cfg,
+ callee_cfg, &test_param);
+ }
+
+ /* Test for IPV4+IPV6. */
+ if (rc == PJ_SUCCESS) {
+ pj_bzero(&test_param, sizeof(test_param));
+ set_client_server_flag(SERVER_IPV4+SERVER_IPV6,
+ CLIENT_IPV4+CLIENT_IPV6,
+ CLIENT_IPV4+CLIENT_IPV6,
+ &server_flag,
+ &caller_cfg->client_flag,
+ &callee_cfg->client_flag);
+
+ rc = perform_test2(title, stun_cfg, server_flag, caller_cfg,
+ callee_cfg, &test_param);
+ }
+
+ /* Test controller(IPV4) vs controlled(IPV6). */
+ if (rc == PJ_SUCCESS) {
+ pj_bzero(&test_param, sizeof(test_param));
+ set_client_server_flag(SERVER_IPV4+SERVER_IPV6,
+ CLIENT_IPV4,
+ CLIENT_IPV6,
+ &server_flag,
+ &caller_cfg->client_flag,
+ &callee_cfg->client_flag);
+ caller_cfg->expected.start_status = PJ_ENOTFOUND;
+ callee_cfg->expected.start_status = PJ_ENOTFOUND;
+
+ rc = perform_test2(title, stun_cfg, server_flag, caller_cfg,
+ callee_cfg, &test_param);
+ }
+
+#endif
+ callee_cfg->expected.start_status = expected_callee_start_ice;
+ caller_cfg->expected.start_status = expected_caller_start_ice;
+
+ return rc;
}
#define ROLE1 PJ_ICE_SESS_ROLE_CONTROLLED
@@ -695,39 +854,39 @@ int ice_test(void)
/* Role comp# host? stun? turn? flag? ans_del snd_del des_del */
{
"hosts candidates only",
- 0xFFFF,
- {ROLE1, 1, YES, NO, NO, NO, 0, 0, 0, {PJ_SUCCESS, PJ_SUCCESS}},
- {ROLE2, 1, YES, NO, NO, NO, 0, 0, 0, {PJ_SUCCESS, PJ_SUCCESS}}
+ 0x1FFF,
+ {ROLE1, 1, YES, NO, NO, NO, 0, 0, 0, {PJ_SUCCESS, PJ_SUCCESS, PJ_SUCCESS}},
+ {ROLE2, 1, YES, NO, NO, NO, 0, 0, 0, {PJ_SUCCESS, PJ_SUCCESS, PJ_SUCCESS}}
},
{
"host and srflxes",
- 0xFFFF,
- {ROLE1, 1, YES, YES, NO, NO, 0, 0, 0, {PJ_SUCCESS, PJ_SUCCESS}},
- {ROLE2, 1, YES, YES, NO, NO, 0, 0, 0, {PJ_SUCCESS, PJ_SUCCESS}}
+ 0x1FFF,
+ {ROLE1, 1, YES, YES, NO, NO, 0, 0, 0, {PJ_SUCCESS, PJ_SUCCESS, PJ_SUCCESS}},
+ {ROLE2, 1, YES, YES, NO, NO, 0, 0, 0, {PJ_SUCCESS, PJ_SUCCESS, PJ_SUCCESS}}
},
{
"host vs relay",
- 0xFFFF,
- {ROLE1, 1, YES, NO, NO, NO, 0, 0, 0, {PJ_SUCCESS, PJ_SUCCESS}},
- {ROLE2, 1, NO, NO, YES, NO, 0, 0, 0, {PJ_SUCCESS, PJ_SUCCESS}}
+ 0x1FFF,
+ {ROLE1, 1, YES, NO, NO, NO, 0, 0, 0, {PJ_SUCCESS, PJ_SUCCESS, PJ_SUCCESS}},
+ {ROLE2, 1, NO, NO, YES, NO, 0, 0, 0, {PJ_SUCCESS, PJ_SUCCESS, PJ_SUCCESS}}
},
{
"relay vs host",
- 0xFFFF,
- {ROLE1, 1, NO, NO, YES, NO, 0, 0, 0, {PJ_SUCCESS, PJ_SUCCESS}},
- {ROLE2, 1, YES, NO, NO, NO, 0, 0, 0, {PJ_SUCCESS, PJ_SUCCESS}}
+ 0x1FFF,
+ {ROLE1, 1, NO, NO, YES, NO, 0, 0, 0, {PJ_SUCCESS, PJ_SUCCESS, PJ_SUCCESS}},
+ {ROLE2, 1, YES, NO, NO, NO, 0, 0, 0, {PJ_SUCCESS, PJ_SUCCESS, PJ_SUCCESS}}
},
{
"relay vs relay",
- 0xFFFF,
- {ROLE1, 1, NO, NO, YES, NO, 0, 0, 0, {PJ_SUCCESS, PJ_SUCCESS}},
- {ROLE2, 1, NO, NO, YES, NO, 0, 0, 0, {PJ_SUCCESS, PJ_SUCCESS}}
+ 0x1FFF,
+ {ROLE1, 1, NO, NO, YES, NO, 0, 0, 0, {PJ_SUCCESS, PJ_SUCCESS, PJ_SUCCESS}},
+ {ROLE2, 1, NO, NO, YES, NO, 0, 0, 0, {PJ_SUCCESS, PJ_SUCCESS, PJ_SUCCESS}}
},
{
"all candidates",
- 0xFFFF,
- {ROLE1, 1, YES, YES, YES, NO, 0, 0, 0, {PJ_SUCCESS, PJ_SUCCESS}},
- {ROLE2, 1, YES, YES, YES, NO, 0, 0, 0, {PJ_SUCCESS, PJ_SUCCESS}}
+ 0x1FFF,
+ {ROLE1, 1, YES, YES, YES, NO, 0, 0, 0, {PJ_SUCCESS, PJ_SUCCESS, PJ_SUCCESS}},
+ {ROLE2, 1, YES, YES, YES, NO, 0, 0, 0, {PJ_SUCCESS, PJ_SUCCESS, PJ_SUCCESS}}
},
};
@@ -745,8 +904,8 @@ int ice_test(void)
"Basic with host candidates",
0x0,
/* Role comp# host? stun? turn? flag? ans_del snd_del des_del */
- {ROLE1, 1, YES, NO, NO, 0, 0, 0, 0, {PJ_SUCCESS, PJ_SUCCESS}},
- {ROLE2, 1, YES, NO, NO, 0, 0, 0, 0, {PJ_SUCCESS, PJ_SUCCESS}}
+ {ROLE1, 1, YES, NO, NO, 0, 0, 0, 0, {PJ_SUCCESS, PJ_SUCCESS, PJ_SUCCESS}},
+ {ROLE2, 1, YES, NO, NO, 0, 0, 0, 0, {PJ_SUCCESS, PJ_SUCCESS, PJ_SUCCESS}}
};
rc = perform_test(cfg.title, &stun_cfg, cfg.server_flag,
@@ -770,8 +929,8 @@ int ice_test(void)
"Basic with srflx candidates",
0xFFFF,
/* Role comp# host? stun? turn? flag? ans_del snd_del des_del */
- {ROLE1, 1, YES, YES, NO, 0, 0, 0, 0, {PJ_SUCCESS, PJ_SUCCESS}},
- {ROLE2, 1, YES, YES, NO, 0, 0, 0, 0, {PJ_SUCCESS, PJ_SUCCESS}}
+ {ROLE1, 1, YES, YES, NO, 0, 0, 0, 0, {PJ_SUCCESS, PJ_SUCCESS, PJ_SUCCESS}},
+ {ROLE2, 1, YES, YES, NO, 0, 0, 0, 0, {PJ_SUCCESS, PJ_SUCCESS, PJ_SUCCESS}}
};
rc = perform_test(cfg.title, &stun_cfg, cfg.server_flag,
@@ -796,8 +955,8 @@ int ice_test(void)
"Basic with relay candidates",
0xFFFF,
/* Role comp# host? stun? turn? flag? ans_del snd_del des_del */
- {ROLE1, 1, NO, NO, YES, 0, 0, 0, 0, {PJ_SUCCESS, PJ_SUCCESS}},
- {ROLE2, 1, NO, NO, YES, 0, 0, 0, 0, {PJ_SUCCESS, PJ_SUCCESS}}
+ {ROLE1, 1, NO, NO, YES, 0, 0, 0, 0, {PJ_SUCCESS, PJ_SUCCESS, PJ_SUCCESS}},
+ {ROLE2, 1, NO, NO, YES, 0, 0, 0, 0, {PJ_SUCCESS, PJ_SUCCESS, PJ_SUCCESS}}
};
rc = perform_test(cfg.title, &stun_cfg, cfg.server_flag,
@@ -822,8 +981,8 @@ int ice_test(void)
"STUN resolution failure",
0x0,
/* Role comp# host? stun? turn? flag? ans_del snd_del des_del */
- {ROLE1, 2, NO, YES, NO, 0, 0, 0, 0, {PJNATH_ESTUNTIMEDOUT, -1}},
- {ROLE2, 2, NO, YES, NO, 0, 0, 0, 0, {PJNATH_ESTUNTIMEDOUT, -1}}
+ {ROLE1, 2, NO, YES, NO, 0, 0, 0, 0, {PJ_SUCCESS, PJNATH_ESTUNTIMEDOUT, -1}},
+ {ROLE2, 2, NO, YES, NO, 0, 0, 0, 0, {PJ_SUCCESS, PJNATH_ESTUNTIMEDOUT, -1}}
};
rc = perform_test(cfg.title, &stun_cfg, cfg.server_flag,
@@ -848,8 +1007,8 @@ int ice_test(void)
"TURN allocation failure",
0xFFFF,
/* Role comp# host? stun? turn? flag? ans_del snd_del des_del */
- {ROLE1, 2, NO, NO, YES, WRONG_TURN, 0, 0, 0, {PJ_STATUS_FROM_STUN_CODE(401), -1}},
- {ROLE2, 2, NO, NO, YES, WRONG_TURN, 0, 0, 0, {PJ_STATUS_FROM_STUN_CODE(401), -1}}
+ {ROLE1, 2, NO, NO, YES, WRONG_TURN, 0, 0, 0, {PJ_SUCCESS, PJ_STATUS_FROM_STUN_CODE(401), -1}},
+ {ROLE2, 2, NO, NO, YES, WRONG_TURN, 0, 0, 0, {PJ_SUCCESS, PJ_STATUS_FROM_STUN_CODE(401), -1}}
};
rc = perform_test(cfg.title, &stun_cfg, cfg.server_flag,
@@ -875,8 +1034,8 @@ int ice_test(void)
"STUN failure, testing TURN deallocation",
0xFFFF & (~(CREATE_STUN_SERVER)),
/* Role comp# host? stun? turn? flag? ans_del snd_del des_del */
- {ROLE1, 1, YES, YES, YES, 0, 0, 0, 0, {PJNATH_ESTUNTIMEDOUT, -1}},
- {ROLE2, 1, YES, YES, YES, 0, 0, 0, 0, {PJNATH_ESTUNTIMEDOUT, -1}}
+ {ROLE1, 1, YES, YES, YES, 0, 0, 0, 0, {PJ_SUCCESS, PJNATH_ESTUNTIMEDOUT, -1}},
+ {ROLE2, 1, YES, YES, YES, 0, 0, 0, 0, {PJ_SUCCESS, PJNATH_ESTUNTIMEDOUT, -1}}
};
rc = perform_test(cfg.title, &stun_cfg, cfg.server_flag,
@@ -969,10 +1128,10 @@ int ice_one_conc_test(pj_stun_config *stun_cfg, int err_quit)
} cfg =
{
"Concurrency test",
- 0xFFFF,
+ 0x1FFF,
/* Role comp# host? stun? turn? flag? ans_del snd_del des_del */
- {ROLE1, 1, YES, YES, YES, 0, 0, 0, 0, {PJ_SUCCESS, PJ_SUCCESS}},
- {ROLE2, 1, YES, YES, YES, 0, 0, 0, 0, {PJ_SUCCESS, PJ_SUCCESS}}
+ {ROLE1, 1, YES, YES, YES, CLIENT_IPV4, 0, 0, 0, {PJ_SUCCESS, PJ_SUCCESS, PJ_SUCCESS}},
+ {ROLE2, 1, YES, YES, YES, CLIENT_IPV4, 0, 0, 0, {PJ_SUCCESS, PJ_SUCCESS, PJ_SUCCESS}}
};
struct sess_param test_param;
int rc;
diff --git a/pjnath/src/pjnath-test/server.c b/pjnath/src/pjnath-test/server.c
index 7491d9da..99bacba1 100644
--- a/pjnath/src/pjnath-test/server.c
+++ b/pjnath/src/pjnath-test/server.c
@@ -53,10 +53,11 @@ pj_status_t create_test_server(pj_stun_config *stun_cfg,
pj_sockaddr hostip;
char strbuf[100];
pj_status_t status;
+ pj_bool_t use_ipv6 = flags & SERVER_IPV6;
PJ_ASSERT_RETURN(stun_cfg && domain && p_test_srv, PJ_EINVAL);
- status = pj_gethostip(pj_AF_INET(), &hostip);
+ status = pj_gethostip(GET_AF(use_ipv6), &hostip);
if (status != PJ_SUCCESS)
return status;
@@ -74,7 +75,7 @@ pj_status_t create_test_server(pj_stun_config *stun_cfg,
if (flags & CREATE_DNS_SERVER) {
status = pj_dns_server_create(mem, test_srv->stun_cfg->ioqueue,
- pj_AF_INET(), DNS_SERVER_PORT,
+ GET_AF(use_ipv6), DNS_SERVER_PORT,
0, &test_srv->dns_server);
if (status != PJ_SUCCESS) {
destroy_test_server(test_srv);
@@ -85,11 +86,17 @@ pj_status_t create_test_server(pj_stun_config *stun_cfg,
if (flags & CREATE_A_RECORD_FOR_DOMAIN) {
pj_dns_parsed_rr rr;
pj_str_t res_name;
- pj_in_addr ip_addr;
pj_strdup2(pool, &res_name, domain);
- ip_addr = hostip.ipv4.sin_addr;
- pj_dns_init_a_rr(&rr, &res_name, PJ_DNS_CLASS_IN, 60, &ip_addr);
+
+ if (use_ipv6) {
+ pj_dns_init_aaaa_rr(&rr, &res_name, PJ_DNS_CLASS_IN, 60,
+ &hostip.ipv6.sin6_addr);
+ } else {
+ pj_dns_init_a_rr(&rr, &res_name, PJ_DNS_CLASS_IN, 60,
+ &hostip.ipv4.sin_addr);
+ }
+
pj_dns_server_add_rec(test_srv->dns_server, 1, &rr);
}
@@ -102,7 +109,8 @@ pj_status_t create_test_server(pj_stun_config *stun_cfg,
pj_bzero(&stun_sock_cb, sizeof(stun_sock_cb));
stun_sock_cb.on_data_recvfrom = &stun_on_data_recvfrom;
- pj_sockaddr_in_init(&bound_addr.ipv4, NULL, STUN_SERVER_PORT);
+ pj_sockaddr_init(GET_AF(use_ipv6), &bound_addr,
+ NULL, STUN_SERVER_PORT);
status = pj_activesock_create_udp(pool, &bound_addr, NULL,
test_srv->stun_cfg->ioqueue,
@@ -123,7 +131,6 @@ pj_status_t create_test_server(pj_stun_config *stun_cfg,
if (test_srv->dns_server && (flags & CREATE_STUN_SERVER_DNS_SRV)) {
pj_str_t res_name, target;
pj_dns_parsed_rr rr;
- pj_in_addr ip_addr;
/* Add DNS entries:
* _stun._udp.domain 60 IN SRV 0 0 PORT stun.domain.
@@ -140,8 +147,13 @@ pj_status_t create_test_server(pj_stun_config *stun_cfg,
pj_dns_server_add_rec(test_srv->dns_server, 1, &rr);
res_name = target;
- ip_addr = hostip.ipv4.sin_addr;
- pj_dns_init_a_rr(&rr, &res_name, PJ_DNS_CLASS_IN, 60, &ip_addr);
+ if (use_ipv6) {
+ pj_dns_init_aaaa_rr(&rr, &res_name, PJ_DNS_CLASS_IN, 60,
+ &hostip.ipv6.sin6_addr);
+ } else {
+ pj_dns_init_a_rr(&rr, &res_name, PJ_DNS_CLASS_IN, 60,
+ &hostip.ipv4.sin_addr);
+ }
pj_dns_server_add_rec(test_srv->dns_server, 1, &rr);
}
@@ -154,7 +166,7 @@ pj_status_t create_test_server(pj_stun_config *stun_cfg,
pj_bzero(&turn_sock_cb, sizeof(turn_sock_cb));
turn_sock_cb.on_data_recvfrom = &turn_on_data_recvfrom;
- pj_sockaddr_in_init(&bound_addr.ipv4, NULL, TURN_SERVER_PORT);
+ pj_sockaddr_init(GET_AF(use_ipv6), &bound_addr, NULL, TURN_SERVER_PORT);
status = pj_activesock_create_udp(pool, &bound_addr, NULL,
test_srv->stun_cfg->ioqueue,
@@ -175,7 +187,6 @@ pj_status_t create_test_server(pj_stun_config *stun_cfg,
if (test_srv->dns_server && (flags & CREATE_TURN_SERVER_DNS_SRV)) {
pj_str_t res_name, target;
pj_dns_parsed_rr rr;
- pj_in_addr ip_addr;
/* Add DNS entries:
* _turn._udp.domain 60 IN SRV 0 0 PORT turn.domain.
@@ -192,8 +203,14 @@ pj_status_t create_test_server(pj_stun_config *stun_cfg,
pj_dns_server_add_rec(test_srv->dns_server, 1, &rr);
res_name = target;
- ip_addr = hostip.ipv4.sin_addr;
- pj_dns_init_a_rr(&rr, &res_name, PJ_DNS_CLASS_IN, 60, &ip_addr);
+
+ if (use_ipv6) {
+ pj_dns_init_aaaa_rr(&rr, &res_name, PJ_DNS_CLASS_IN, 60,
+ &hostip.ipv6.sin6_addr);
+ } else {
+ pj_dns_init_a_rr(&rr, &res_name, PJ_DNS_CLASS_IN, 60,
+ &hostip.ipv4.sin_addr);
+ }
pj_dns_server_add_rec(test_srv->dns_server, 1, &rr);
}
}
@@ -344,6 +361,7 @@ static pj_bool_t turn_on_data_recvfrom(pj_activesock_t *asock,
char client_info[PJ_INET6_ADDRSTRLEN+10];
unsigned i;
pj_ssize_t len;
+ pj_bool_t use_ipv6 = PJ_FALSE;
if (status != PJ_SUCCESS)
return PJ_TRUE;
@@ -351,6 +369,7 @@ static pj_bool_t turn_on_data_recvfrom(pj_activesock_t *asock,
pj_sockaddr_print(src_addr, client_info, sizeof(client_info), 3);
test_srv = (test_server*) pj_activesock_get_user_data(asock);
+ use_ipv6 = test_srv->flags & SERVER_IPV6;
pool = pj_pool_create(test_srv->stun_cfg->pf, NULL, 512, 512, NULL);
/* Find the client */
@@ -480,9 +499,9 @@ static pj_bool_t turn_on_data_recvfrom(pj_activesock_t *asock,
alloc->pool = pj_pool_create(test_srv->stun_cfg->pf, "alloc", 512, 512, NULL);
- /* Create relay socket */
- pj_sockaddr_in_init(&alloc->alloc_addr.ipv4, NULL, 0);
- pj_gethostip(pj_AF_INET(), &alloc->alloc_addr);
+ /* Create relay socket */
+ pj_sockaddr_init(GET_AF(use_ipv6), &alloc->alloc_addr, NULL, 0);
+ pj_gethostip(GET_AF(use_ipv6), &alloc->alloc_addr);
status = pj_activesock_create_udp(alloc->pool, &alloc->alloc_addr, NULL,
test_srv->stun_cfg->ioqueue,
@@ -697,6 +716,8 @@ static pj_bool_t alloc_on_data_recvfrom(pj_activesock_t *asock,
pj_ssize_t sent;
unsigned i;
+ PJ_UNUSED_ARG(addr_len);
+
if (status != PJ_SUCCESS)
return PJ_TRUE;
@@ -707,10 +728,7 @@ static pj_bool_t alloc_on_data_recvfrom(pj_activesock_t *asock,
/* Check that this peer has a permission */
for (i=0; i<alloc->perm_cnt; ++i) {
- if (pj_sockaddr_get_len(&alloc->perm[i]) == (unsigned)addr_len &&
- pj_memcmp(pj_sockaddr_get_addr(&alloc->perm[i]),
- pj_sockaddr_get_addr(src_addr),
- addr_len) == 0)
+ if (pj_sockaddr_cmp(&alloc->perm[i], src_addr) == 0)
{
break;
}
diff --git a/pjnath/src/pjnath-test/server.h b/pjnath/src/pjnath-test/server.h
index 4ac61e9d..458e1c44 100644
--- a/pjnath/src/pjnath-test/server.h
+++ b/pjnath/src/pjnath-test/server.h
@@ -39,12 +39,14 @@ enum test_server_flags
CREATE_DNS_SERVER = (1 << 0),
CREATE_A_RECORD_FOR_DOMAIN = (1 << 1),
- CREATE_STUN_SERVER = (1 << 5),
- CREATE_STUN_SERVER_DNS_SRV = (1 << 6),
+ CREATE_STUN_SERVER = (1 << 4),
+ CREATE_STUN_SERVER_DNS_SRV = (1 << 5),
- CREATE_TURN_SERVER = (1 << 10),
- CREATE_TURN_SERVER_DNS_SRV = (1 << 11),
+ CREATE_TURN_SERVER = (1 << 8),
+ CREATE_TURN_SERVER_DNS_SRV = (1 << 9),
+ SERVER_IPV4 = (1 << 12),
+ SERVER_IPV6 = (1 << 13)
};
typedef struct test_server test_server;
diff --git a/pjnath/src/pjnath-test/sess_auth.c b/pjnath/src/pjnath-test/sess_auth.c
index 4093c1bb..626ac07a 100644
--- a/pjnath/src/pjnath-test/sess_auth.c
+++ b/pjnath/src/pjnath-test/sess_auth.c
@@ -229,7 +229,8 @@ static void destroy_server(void)
/* Instantiate standard server */
static int create_std_server(pj_stun_auth_type auth_type,
- pj_bool_t responding)
+ pj_bool_t responding,
+ pj_bool_t use_ipv6)
{
pj_pool_t *pool;
pj_stun_session_cb sess_cb;
@@ -266,14 +267,14 @@ static int create_std_server(pj_stun_auth_type auth_type,
}
/* Create socket */
- status = pj_sock_socket(pj_AF_INET(), pj_SOCK_DGRAM(), 0, &server->sock);
+ status = pj_sock_socket(GET_AF(use_ipv6), pj_SOCK_DGRAM(), 0, &server->sock);
if (status != PJ_SUCCESS) {
destroy_server();
return -30;
}
/* Bind */
- pj_sockaddr_in_init(&server->addr.ipv4, NULL, 0);
+ pj_sockaddr_init(GET_AF(use_ipv6), &server->addr, NULL, 0);
status = pj_sock_bind(server->sock, &server->addr, pj_sockaddr_get_len(&server->addr));
if (status != PJ_SUCCESS) {
destroy_server();
@@ -289,7 +290,7 @@ static int create_std_server(pj_stun_auth_type auth_type,
return -43;
}
- status = pj_gethostip(pj_AF_INET(), &addr);
+ status = pj_gethostip(GET_AF(use_ipv6), &addr);
if (status != PJ_SUCCESS) {
destroy_server();
return -45;
@@ -452,7 +453,7 @@ static int run_client_test(const char *title,
const char *nonce,
const char *password,
pj_bool_t dummy_mi,
-
+ pj_bool_t use_ipv6,
pj_bool_t expected_error,
pj_status_t expected_code,
const char *expected_realm,
@@ -465,9 +466,10 @@ static int run_client_test(const char *title,
pj_stun_auth_cred cred;
pj_stun_tx_data *tdata;
pj_status_t status;
+ pj_sockaddr addr;
int rc = 0;
- PJ_LOG(3,(THIS_FILE, " %s test", title));
+ PJ_LOG(3,(THIS_FILE, " %s test (%s)", title, use_ipv6?"IPv6":"IPv4"));
/* Create client */
pool = pj_pool_create(mem, "client", 1000, 1000, NULL);
@@ -493,14 +495,15 @@ static int run_client_test(const char *title,
}
/* Create client socket */
- status = pj_sock_socket(pj_AF_INET(), pj_SOCK_DGRAM(), 0, &client->sock);
+ status = pj_sock_socket(GET_AF(use_ipv6), pj_SOCK_DGRAM(), 0, &client->sock);
if (status != PJ_SUCCESS) {
destroy_client_server();
return -210;
}
/* Bind client socket */
- status = pj_sock_bind_in(client->sock, 0, 0);
+ pj_sockaddr_init(GET_AF(use_ipv6), &addr, NULL, 0);
+ status = pj_sock_bind(client->sock, &addr, pj_sockaddr_get_len(&addr));
if (status != PJ_SUCCESS) {
destroy_client_server();
return -220;
@@ -528,7 +531,7 @@ static int run_client_test(const char *title,
}
/* Create the server */
- status = create_std_server(server_auth_type, server_responding);
+ status = create_std_server(server_auth_type, server_responding, use_ipv6);
if (status != 0) {
destroy_client_server();
return status;
@@ -680,6 +683,26 @@ static int run_client_test(const char *title,
done:
destroy_client_server();
+
+ /* If IPv6 is enabled, test again for IPv4. */
+ if ((rc == 0) && use_ipv6) {
+ rc = run_client_test(title,
+ server_responding,
+ server_auth_type,
+ client_auth_type,
+ realm,
+ username,
+ nonce,
+ password,
+ dummy_mi,
+ 0,
+ expected_error,
+ expected_code,
+ expected_realm,
+ expected_nonce,
+ more_check);
+ }
+
return rc;
}
@@ -778,6 +801,7 @@ int sess_auth_test(void)
NULL, // nonce
NULL, // password
PJ_FALSE, // dummy MI
+ USE_IPV6, // use IPv6
PJ_TRUE, // expected error
PJNATH_ESTUNTIMEDOUT,// expected code
NULL, // expected realm
@@ -808,6 +832,7 @@ int sess_auth_test(void)
NULL, // nonce
NULL, // password
PJ_FALSE, // dummy MI
+ USE_IPV6, // use IPv6
PJ_TRUE, // expected error
PJ_STATUS_FROM_STUN_CODE(400),// expected code
NULL, // expected realm
@@ -832,6 +857,7 @@ int sess_auth_test(void)
NULL, // nonce
"anotherpass", // password
PJ_FALSE, // dummy MI
+ USE_IPV6, // use IPv6
PJ_TRUE, // expected error
PJ_STATUS_FROM_STUN_CODE(401),// expected code
NULL, // expected realm
@@ -860,6 +886,7 @@ int sess_auth_test(void)
NULL, // nonce
"anotherpass", // password
PJ_FALSE, // dummy MI
+ USE_IPV6, // use IPv6
PJ_TRUE, // expected error
PJ_STATUS_FROM_STUN_CODE(401),// expected code
NULL, // expected realm
@@ -882,6 +909,7 @@ int sess_auth_test(void)
NULL, // nonce
NULL, // password
PJ_TRUE, // dummy MI
+ USE_IPV6, // use IPv6
PJ_TRUE, // expected error
PJ_STATUS_FROM_STUN_CODE(400), // expected code
NULL, // expected realm
@@ -902,6 +930,7 @@ int sess_auth_test(void)
NULL, // nonce
PASSWORD, // password
PJ_FALSE, // dummy MI
+ USE_IPV6, // use IPv6
PJ_FALSE, // expected error
PJ_SUCCESS, // expected code
NULL, // expected realm
@@ -928,6 +957,7 @@ int sess_auth_test(void)
NULL, // nonce
PASSWORD, // password
PJ_TRUE, // dummy MI
+ USE_IPV6, // use IPv6
PJ_TRUE, // expected error
PJ_STATUS_FROM_STUN_CODE(401), // expected code
NULL, // expected realm
@@ -961,6 +991,7 @@ int sess_auth_test(void)
NULL, // client nonce
NULL, // client password
PJ_FALSE, // client dummy MI
+ USE_IPV6, // use IPv6
PJ_TRUE, // expected error
PJ_STATUS_FROM_STUN_CODE(401), // expected code
REALM, // expected realm
@@ -987,6 +1018,7 @@ int sess_auth_test(void)
NONCE, // client nonce
PASSWORD, // client password
PJ_TRUE, // client dummy MI
+ USE_IPV6, // use IPv6
PJ_TRUE, // expected error
PJ_STATUS_FROM_STUN_CODE(400), // expected code
NULL, // expected realm
@@ -1007,6 +1039,7 @@ int sess_auth_test(void)
NONCE, // client nonce
PASSWORD, // client password
PJ_TRUE, // client dummy MI
+ USE_IPV6, // use IPv6
PJ_TRUE, // expected error
PJ_STATUS_FROM_STUN_CODE(400), // expected code
NULL, // expected realm
@@ -1027,6 +1060,7 @@ int sess_auth_test(void)
NULL, // client nonce
PASSWORD, // client password
PJ_TRUE, // client dummy MI
+ USE_IPV6, // use IPv6
PJ_TRUE, // expected error
PJ_STATUS_FROM_STUN_CODE(400), // expected code
NULL, // expected realm
@@ -1063,6 +1097,7 @@ int sess_auth_test(void)
"a nonce", // client nonce
"somepassword", // client password
PJ_FALSE, // client dummy MI
+ USE_IPV6, // use IPv6
PJ_TRUE, // expected error
PJ_STATUS_FROM_STUN_CODE(401), // expected code
REALM, // expected realm
@@ -1083,6 +1118,7 @@ int sess_auth_test(void)
"anothernonce", // client nonce
PASSWORD, // client password
PJ_FALSE, // client dummy MI
+ USE_IPV6, // use IPv6
PJ_FALSE, // expected error
0, // expected code
NULL, // expected realm
@@ -1113,6 +1149,7 @@ int sess_auth_test(void)
NONCE, // client nonce
PASSWORD, // client password
PJ_FALSE, // client dummy MI
+ USE_IPV6, // use IPv6
PJ_TRUE, // expected error
PJ_STATUS_FROM_STUN_CODE(401), // expected code
REALM, // expected realm
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);
diff --git a/pjnath/src/pjnath-test/test.h b/pjnath/src/pjnath-test/test.h
index 6a57bc0c..71d82315 100644
--- a/pjnath/src/pjnath-test/test.h
+++ b/pjnath/src/pjnath-test/test.h
@@ -27,6 +27,14 @@
#define INCLUDE_TURN_SOCK_TEST 1
#define INCLUDE_CONCUR_TEST 1
+#define GET_AF(use_ipv6) (use_ipv6?pj_AF_INET6():pj_AF_INET())
+
+#if defined(PJ_HAS_IPV6) && PJ_HAS_IPV6
+# define USE_IPV6 1
+#else
+# define USE_IPV6 0
+#endif
+
int stun_test(void);
int sess_auth_test(void);
int stun_sock_test(void);
diff --git a/pjnath/src/pjnath-test/turn_sock_test.c b/pjnath/src/pjnath-test/turn_sock_test.c
index c58ca264..cb97c466 100644
--- a/pjnath/src/pjnath-test/turn_sock_test.c
+++ b/pjnath/src/pjnath-test/turn_sock_test.c
@@ -102,6 +102,7 @@ static int create_test_session(pj_stun_config *stun_cfg,
pj_turn_alloc_param alloc_param;
pj_stun_auth_cred cred;
pj_status_t status;
+ pj_bool_t use_ipv6 = cfg->srv.flags & SERVER_IPV6;
/* Create client */
pool = pj_pool_create(mem, "turnclient", 512, 512, NULL);
@@ -113,16 +114,21 @@ static int create_test_session(pj_stun_config *stun_cfg,
pj_bzero(&turn_sock_cb, sizeof(turn_sock_cb));
turn_sock_cb.on_rx_data = &turn_on_rx_data;
turn_sock_cb.on_state = &turn_on_state;
- status = pj_turn_sock_create(sess->stun_cfg, pj_AF_INET(), PJ_TURN_TP_UDP,
- &turn_sock_cb, 0, sess, &sess->turn_sock);
+ status = pj_turn_sock_create(sess->stun_cfg,
+ GET_AF(use_ipv6),
+ PJ_TURN_TP_UDP,
+ &turn_sock_cb,
+ 0,
+ sess,
+ &sess->turn_sock);
if (status != PJ_SUCCESS) {
destroy_session(sess);
return -20;
}
/* Create test server */
- status = create_test_server(sess->stun_cfg, cfg->srv.flags,
- SRV_DOMAIN, &sess->test_srv);
+ status = create_test_server(sess->stun_cfg, cfg->srv.flags, SRV_DOMAIN,
+ &sess->test_srv);
if (status != PJ_SUCCESS) {
destroy_session(sess);
return -30;
@@ -139,7 +145,7 @@ static int create_test_session(pj_stun_config *stun_cfg,
return -40;
} else {
- pj_str_t dns_srv = pj_str("127.0.0.1");
+ pj_str_t dns_srv = use_ipv6?pj_str("::1") : pj_str("127.0.0.1");
pj_uint16_t dns_srv_port = (pj_uint16_t) DNS_SERVER_PORT;
status = pj_dns_resolver_set_ns(sess->resolver, 1, &dns_srv, &dns_srv_port);
@@ -170,7 +176,7 @@ static int create_test_session(pj_stun_config *stun_cfg,
} else {
/* Explicitly specify server address */
- pj_str_t host = pj_str("127.0.0.1");
+ pj_str_t host = use_ipv6?pj_str("::1") : pj_str("127.0.0.1");
status = pj_turn_sock_alloc(sess->turn_sock, &host, TURN_SERVER_PORT,
NULL, &cred, &alloc_param);
@@ -250,13 +256,21 @@ static void turn_on_state(pj_turn_sock *turn_sock,
/////////////////////////////////////////////////////////////////////
-static int state_progression_test(pj_stun_config *stun_cfg)
+static void set_server_flag(struct test_session_cfg *test_cfg,
+ pj_bool_t use_ipv6)
+{
+ test_cfg->srv.flags &= ~(SERVER_IPV4+SERVER_IPV6);
+ test_cfg->srv.flags |= (use_ipv6)?SERVER_IPV6:SERVER_IPV4;
+}
+
+static int state_progression_test(pj_stun_config *stun_cfg,
+ pj_bool_t use_ipv6)
{
struct test_session_cfg test_cfg =
{
- { /* Client cfg */
- /* DNS SRV */ /* Destroy on state */
- PJ_TRUE, 0xFFFF
+ { /* Client cfg */
+ PJ_TRUE, /* DNS SRV */
+ 0xFFFF /* Destroy on state */
},
{ /* Server cfg */
0xFFFFFFFF, /* flags */
@@ -266,10 +280,11 @@ static int state_progression_test(pj_stun_config *stun_cfg)
};
struct test_session *sess;
unsigned i;
- int rc;
-
- PJ_LOG(3,("", " state progression tests"));
+ int rc = 0;
+ PJ_LOG(3,("", " state progression tests - (%s)",use_ipv6?"IPv6":"IPv4"));
+
+ set_server_flag(&test_cfg, use_ipv6);
for (i=0; i<=1; ++i) {
enum { TIMEOUT = 60 };
pjlib_state pjlib_state;
@@ -372,7 +387,10 @@ static int state_progression_test(pj_stun_config *stun_cfg)
}
}
- return 0;
+ if (use_ipv6)
+ rc = state_progression_test(stun_cfg, 0);
+
+ return rc;
}
@@ -380,13 +398,14 @@ static int state_progression_test(pj_stun_config *stun_cfg)
static int destroy_test(pj_stun_config *stun_cfg,
pj_bool_t with_dns_srv,
- pj_bool_t in_callback)
+ pj_bool_t in_callback,
+ pj_bool_t use_ipv6)
{
struct test_session_cfg test_cfg =
{
- { /* Client cfg */
- /* DNS SRV */ /* Destroy on state */
- PJ_TRUE, 0xFFFF
+ { /* Client cfg */
+ PJ_TRUE, /* DNS SRV */
+ 0xFFFF /* Destroy on state */
},
{ /* Server cfg */
0xFFFFFFFF, /* flags */
@@ -404,6 +423,7 @@ static int destroy_test(pj_stun_config *stun_cfg,
));
test_cfg.client.enable_dns_srv = with_dns_srv;
+ set_server_flag(&test_cfg, use_ipv6);
for (target_state=PJ_TURN_STATE_RESOLVING; target_state<=PJ_TURN_STATE_READY; ++target_state) {
enum { TIMEOUT = 60 };
@@ -495,14 +515,14 @@ int turn_sock_test(void)
return -2;
}
- rc = state_progression_test(&stun_cfg);
+ rc = state_progression_test(&stun_cfg, USE_IPV6);
if (rc != 0)
goto on_return;
for (i=0; i<=1; ++i) {
int j;
for (j=0; j<=1; ++j) {
- rc = destroy_test(&stun_cfg, i, j);
+ rc = destroy_test(&stun_cfg, i, j, USE_IPV6);
if (rc != 0)
goto on_return;
}
diff --git a/pjnath/src/pjnath/stun_msg_dump.c b/pjnath/src/pjnath/stun_msg_dump.c
index 29f37c54..f38e2750 100644
--- a/pjnath/src/pjnath/stun_msg_dump.c
+++ b/pjnath/src/pjnath/stun_msg_dump.c
@@ -88,19 +88,17 @@ static int print_attr(char *buffer, unsigned length,
{
char addr[PJ_INET6_ADDRSTRLEN];
const pj_stun_sockaddr_attr *attr;
+ pj_uint16_t af;
attr = (const pj_stun_sockaddr_attr*)ahdr;
+ af = attr->sockaddr.addr.sa_family;
- if (attr->sockaddr.addr.sa_family == pj_AF_INET()) {
+ if ((af == pj_AF_INET()) || (af == pj_AF_INET6())) {
len = pj_ansi_snprintf(p, end-p,
- ", IPv4 addr=%s:%d\n",
+ ", %s addr=%s\n",
+ (af == pj_AF_INET())?"IPv4":"IPv6",
pj_sockaddr_print(&attr->sockaddr,
- addr, sizeof(addr),0),
- pj_sockaddr_get_port(&attr->sockaddr));
-
- } else if (attr->sockaddr.addr.sa_family == pj_AF_INET6()) {
- len = pj_ansi_snprintf(p, end-p,
- ", IPv6 addr present\n");
+ addr, sizeof(addr),3));
} else {
len = pj_ansi_snprintf(p, end-p,
", INVALID ADDRESS FAMILY!\n");