diff --git a/pjlib/src/pj/sock_bsd.c b/pjlib/src/pj/sock_bsd.c index 1554af8..aea2b08 100644 --- a/pjlib/src/pj/sock_bsd.c +++ b/pjlib/src/pj/sock_bsd.c @@ -754,7 +754,23 @@ PJ_DEF(pj_status_t) pj_sock_connect( pj_sock_t sock, const pj_sockaddr_t *addr, int namelen) { + const pj_sockaddr *b = addr; PJ_CHECK_STACK(); + if (b->addr.sa_family == pj_AF_INET6()) { + char buf[PJ_INET6_ADDRSTRLEN]; + int len = sizeof(pj_sockaddr_in6); + pj_sockaddr c; + pj_sock_getsockname(sock, &c, &len); + pj_sockaddr_print(&c, buf, sizeof(buf), 1 | 2); + printf ("On v6 connect, trying to connect from socket bound to %s\n", buf); + printf ("Address family is really %sset correctly\n", c.addr.sa_family == AF_INET6 ? "" : "NOT "); + printf ("And the len after getsockname is %d\n", len); + pj_sockaddr_print(b, buf, sizeof(buf), 1 | 2); + printf ("On v6 connect, trying to connect to %s\n", buf); + printf ("Address family is really %sset correctly\n", b->addr.sa_family == AF_INET6 ? "" : "NOT "); + printf ("And the len is %d\n", namelen); + printf ("And the scope_id is %d\n", b->ipv6.sin6_scope_id); + } if (connect(sock, (struct sockaddr*)addr, namelen) != 0) return PJ_RETURN_OS_ERROR(pj_get_native_netos_error()); else diff --git a/pjlib/src/pj/sock_common.c b/pjlib/src/pj/sock_common.c index 141fad7..be22a23 100644 --- a/pjlib/src/pj/sock_common.c +++ b/pjlib/src/pj/sock_common.c @@ -919,6 +919,13 @@ PJ_DEF(pj_status_t) pj_gethostip(int af, pj_sockaddr *addr) pj_sockaddr_print(&cand_addr[i], strip, sizeof(strip), 0), cand_weight[i])); + if (af == pj_AF_INET6()) + { + char buf[PJ_INET6_ADDRSTRLEN]; + printf("Candidate address is %s\n", pj_sockaddr_print(&cand_addr[i], buf, sizeof(buf), 1 | 2)); + printf("Candidate address scope_id is %d\n", cand_addr[i].ipv6.sin6_scope_id); + } + if (cand_weight[i] < MIN_WEIGHT) { continue; } @@ -944,6 +951,9 @@ PJ_DEF(pj_status_t) pj_gethostip(int af, pj_sockaddr *addr) pj_sockaddr_print(addr, strip, sizeof(strip), 0))); } else { pj_sockaddr_copy_addr(addr, &cand_addr[selected_cand]); + if (af == pj_AF_INET6()) { + addr->ipv6.sin6_scope_id = cand_addr[selected_cand].ipv6.sin6_scope_id; + } TRACE_((THIS_FILE, "Candidate %s selected", pj_sockaddr_print(addr, strip, sizeof(strip), 0))); } diff --git a/pjsip/src/pjsip/sip_transport_tcp.c b/pjsip/src/pjsip/sip_transport_tcp.c index 35348a7..f311f73 100644 --- a/pjsip/src/pjsip/sip_transport_tcp.c +++ b/pjsip/src/pjsip/sip_transport_tcp.c @@ -330,9 +330,10 @@ PJ_DEF(pj_status_t) pjsip_tcp_transport_start3( if (status != PJ_SUCCESS) goto on_error; - pj_memcpy(pj_sockaddr_get_addr(listener_addr), - pj_sockaddr_get_addr(&hostip), - pj_sockaddr_get_addr_len(&hostip)); + pj_sockaddr_copy_addr(listener_addr, &hostip); + if (hostip.addr.sa_family == pj_AF_INET6()) { + listener_addr->ipv6.sin6_scope_id = hostip.ipv6.sin6_scope_id; + } } /* Save the address name */ @@ -894,6 +895,10 @@ static pj_status_t lis_create_transport(pjsip_tpfactory *factory, /* Initially set the address from the listener's address */ pj_sockaddr_copy_addr(&local_addr, &listener->factory.local_addr); + if (listener->factory.local_addr.addr.sa_family == pj_AF_INET6()) + { + local_addr.ipv6.sin6_scope_id = listener->factory.local_addr.ipv6.sin6_scope_id; + } /* Create the transport descriptor */ status = tcp_create(listener, NULL, sock, PJ_FALSE, &local_addr, diff --git a/pjsip/src/test/test.c b/pjsip/src/test/test.c index 8fa5f66..d024630 100644 --- a/pjsip/src/test/test.c +++ b/pjsip/src/test/test.c @@ -291,6 +291,7 @@ int test_main(void) tsx_test[tsx_test_cnt].type = PJSIP_TRANSPORT_LOOP_DGRAM; ++tsx_test_cnt; +#if 0 #if INCLUDE_URI_TEST DO_TEST(uri_test()); @@ -321,10 +322,14 @@ int test_main(void) DO_TEST(transport_loop_test()); #endif +#endif + #if INCLUDE_TCP_TEST DO_TEST(transport_tcp_test()); #endif +#if 0 + #if INCLUDE_RESOLVE_TEST DO_TEST(resolve_test()); #endif @@ -369,6 +374,7 @@ int test_main(void) DO_TEST(regc_test()); #endif +#endif on_return: flush_events(500); diff --git a/pjsip/src/test/transport_tcp_test.c b/pjsip/src/test/transport_tcp_test.c index 2a814bb..5e791ba 100644 --- a/pjsip/src/test/transport_tcp_test.c +++ b/pjsip/src/test/transport_tcp_test.c @@ -56,6 +56,11 @@ int transport_tcp_test(void) return -14; } + if (rem_addr.addr.sa_family == pj_AF_INET6() && tpfactory->local_addr.addr.sa_family == pj_AF_INET6()) + { + rem_addr.ipv6.sin6_scope_id = tpfactory->local_addr.ipv6.sin6_scope_id; + } + pj_ansi_sprintf(url, "sip:alice@%s;transport=tcp", pj_sockaddr_print(&rem_addr, rem_addr_str, sizeof(rem_addr_str), 1 | 2));