All pastes #2009827 Raw Edit

What do you call an Elephant wit

public text v1 · immutable
#2009827 ·published 2010-12-03 18:41 UTC
rendered paste body
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));