Index: source/ariba/utility/transport/tcpip/protlib/tp_over_tcp.cpp
===================================================================
--- source/ariba/utility/transport/tcpip/protlib/tp_over_tcp.cpp	(revision 7026)
+++ source/ariba/utility/transport/tcpip/protlib/tp_over_tcp.cpp	(revision 7038)
@@ -61,5 +61,25 @@
 const unsigned int max_listen_queue_size= 10;
 
+#define IPV6_ADDR_INT32_SMP 0x0000ffff
+
 namespace protlib {
+
+void v6_to_v4(struct sockaddr_in *sin, struct sockaddr_in6 *sin6)	{
+	bzero(sin, sizeof(*sin));
+ 	sin->sin_family = AF_INET;
+ 	sin->sin_port = sin6->sin6_port;
+ 	memcpy(&sin->sin_addr, &sin6->sin6_addr.s6_addr[12], sizeof(struct in_addr));
+}
+
+/* Convert sockaddr_in to sockaddr_in6 in v4 mapped addr format. */
+void v4_to_v6(struct sockaddr_in *sin, struct sockaddr_in6 *sin6) {
+	bzero(sin6, sizeof(*sin6));
+	sin6->sin6_family = AF_INET6;
+	sin6->sin6_port = sin->sin_port;
+ 	*(uint32_t *)&sin6->sin6_addr.s6_addr[0] = 0;
+	*(uint32_t *)&sin6->sin6_addr.s6_addr[4] = 0;
+ 	*(uint32_t *)&sin6->sin6_addr.s6_addr[8] = IPV6_ADDR_INT32_SMP;
+	*(uint32_t *)&sin6->sin6_addr.s6_addr[12] = sin->sin_addr.s_addr;
+}
 
 using namespace log;
@@ -129,5 +149,5 @@
 
     // no connection found, create a new one
-    new_socket = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP);
+    new_socket = socket( v4_mode ? AF_INET : AF_INET6, SOCK_STREAM, IPPROTO_TCP);
     if (new_socket == -1)
     {
@@ -161,14 +181,23 @@
     }
 
-    struct sockaddr_in6 dest_address;
-    dest_address.sin6_flowinfo= 0;
-    dest_address.sin6_scope_id= 0;
-    addr.get_sockaddr(dest_address);
+	struct sockaddr_in6 dest_address;
+	dest_address.sin6_flowinfo= 0;
+	dest_address.sin6_scope_id= 0;
+	addr.get_sockaddr(dest_address);
+
+	// connect the socket to the destination address
+	int connect_status = 0;
+	if (v4_mode) {
+		struct sockaddr_in dest_address_v4;
+		v6_to_v4( &dest_address_v4, &dest_address );
+		connect_status = connect(new_socket,
+					 reinterpret_cast<const struct sockaddr*>(&dest_address_v4),
+					 sizeof(dest_address));
+	} else {
+		connect_status = connect(new_socket,
+					 reinterpret_cast<const struct sockaddr*>(&dest_address),
+					 sizeof(dest_address));
+	}
       
-    // connect the socket to the destination address
-    int connect_status = connect(new_socket,
-				 reinterpret_cast<const struct sockaddr*>(&dest_address),
-				 sizeof(dest_address));
-
     // connects to the listening_port of the peer's masterthread    
     if (connect_status != 0)
@@ -180,16 +209,12 @@
     }
 
-    
+
     struct sockaddr_in6 own_address;
     socklen_t own_address_len= sizeof(own_address);
-    getsockname(new_socket, reinterpret_cast<struct sockaddr*>(&own_address), &own_address_len);
-
-    
+   	getsockname(new_socket, reinterpret_cast<struct sockaddr*>(&own_address), &own_address_len);
 
     Log(DEBUG_LOG,LOG_UNIMP, tpparam.name,">>--Connect-->> to " << addr.get_ip_str() << " port #" << addr.get_port() 
 	<< " from " << inet_ntop(AF_INET6,&own_address.sin6_addr,in6_addrstr,INET6_ADDRSTRLEN) 
 	<< " port #" << ntohs(own_address.sin6_port));
-    
-   
 
    
@@ -1422,14 +1447,26 @@
 {
   // create a new address-structure for the listening masterthread
-  struct sockaddr_in6 own_address;
-  own_address.sin6_family = AF_INET6;
-  own_address.sin6_flowinfo= 0;
-  own_address.sin6_port = htons(tpparam.port); // use port number in param structure
+  struct sockaddr_in6 own_address_v6;
+  own_address_v6.sin6_family = AF_INET6;
+  own_address_v6.sin6_flowinfo= 0;
+  own_address_v6.sin6_port = htons(tpparam.port); // use port number in param structure
   // accept incoming connections on all interfaces 
-  own_address.sin6_addr = in6addr_any;
-  own_address.sin6_scope_id= 0;
+  own_address_v6.sin6_addr = in6addr_any;
+  own_address_v6.sin6_scope_id= 0;
+
+  // create a new address-structure for the listening masterthread
+  struct sockaddr_in own_address_v4;
+  own_address_v4.sin_family = AF_INET;
+  own_address_v4.sin_port = htons(tpparam.port); // use port number in param structure
+  // accept incoming connections on all interfaces
+  own_address_v4.sin_addr.s_addr = INADDR_ANY;
   
   // create a listening socket
-  int master_listener_socket= socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP);
+  int master_listener_socket= socket( AF_INET6, SOCK_STREAM, IPPROTO_TCP);
+  if (master_listener_socket!=-1) v4_mode = false;
+  if (master_listener_socket == -1) {
+	  master_listener_socket= socket( AF_INET, SOCK_STREAM, IPPROTO_TCP);
+	  if (master_listener_socket!=-1) v4_mode = true;
+  }
   if (master_listener_socket == -1)
   {
@@ -1464,11 +1501,13 @@
   
   // bind the newly created socket to a specific address
-  int bind_status = bind(master_listener_socket,
-			 reinterpret_cast<struct sockaddr *>(&own_address),
-			 sizeof(own_address));
+  int bind_status = bind(master_listener_socket, v4_mode ?
+			 reinterpret_cast<struct sockaddr *>(&own_address_v4) :
+			 reinterpret_cast<struct sockaddr *>(&own_address_v6),
+					 v4_mode ? sizeof(own_address_v4) : sizeof(own_address_v6));
   if (bind_status)
     { 
       Log(ERROR_LOG,LOG_CRIT, tpparam.name, "Binding to " 
-	  << inet_ntop(AF_INET6, &own_address.sin6_addr, in6_addrstr, INET6_ADDRSTRLEN)
+	  << (v4_mode ? inet_ntop(AF_INET, &own_address_v4.sin_addr, in_addrstr, INET_ADDRSTRLEN) :
+			  inet_ntop(AF_INET6, &own_address_v6.sin6_addr, in6_addrstr, INET6_ADDRSTRLEN))
 	  << " port " << tpparam.port << " failed, error: " << strerror(errno));
       return;
@@ -1598,6 +1637,13 @@
 
 	struct sockaddr_in6 own_address;
-	socklen_t own_address_len= sizeof(own_address);
-	getsockname(conn_socket, reinterpret_cast<struct sockaddr*>(&own_address), &own_address_len);
+	if (v4_mode) {
+		struct sockaddr_in own_address_v4;
+		socklen_t own_address_len_v4 = sizeof(own_address_v4);
+		getsockname(conn_socket, reinterpret_cast<struct sockaddr*>(&own_address_v4), &own_address_len_v4);
+		v4_to_v6(&own_address_v4, &own_address);
+	} else {
+		socklen_t own_address_len= sizeof(own_address);
+		getsockname(conn_socket, reinterpret_cast<struct sockaddr*>(&own_address), &own_address_len);
+	}
 
 	// AssocData will copy addr content into its own structure
Index: source/ariba/utility/transport/tcpip/protlib/tp_over_tcp.h
===================================================================
--- source/ariba/utility/transport/tcpip/protlib/tp_over_tcp.h	(revision 7026)
+++ source/ariba/utility/transport/tcpip/protlib/tp_over_tcp.h	(revision 7038)
@@ -218,4 +218,5 @@
   
   bool debug_pdu;
+  bool v4_mode;
 }; // end class TPoverTCP
 
