{code}
 
-#ifndef CONDOR_IPADDRESS_H
-#define CONDOR_IPADDRESS_H
-
 class ipaddr
 {
 	sockaddr_in6 storage;
 
-	const unsigned char* get_addr() const {
-		// field name of in6_addr is different from platform to platform
-		return (const unsigned char*)&storage.sin6_addr;
-	}
-
-	unsigned char* get_addr() {
-		// field name of in6_addr is different from platform to platform
-		return (unsigned char*)&storage.sin6_addr;
-	}
+	const unsigned char* get_addr() const;
+	unsigned char* get_addr();
 
-	unsigned int& get_addr_header() { return *(unsigned int*)get_addr(); }
-	const unsigned int& get_v4_addr() const { return *(const unsigned int*)(get_addr()+12); }
-	unsigned int& get_v4_addr() { return *(unsigned int*)(get_addr()+12); }
+	unsigned int& get_addr_header();
+	const unsigned int& get_v4_addr() const;
+	unsigned int& get_v4_addr();
 
 public:
-	ipaddr()
-	{
-		memset(&storage, 0, sizeof(storage));
-	}
+	// accepts network byte ordered ip and port
+	void init(int ip, unsigned port);
 
-	ipaddr(int ip, unsigned port = 0)
-	{
 		ipaddr();
-		storage.sin6_family = AF_INET;
-		storage.sin6_port = htons(port);
-		// IPv4-mapped region
-		get_addr_header() = 0xffff0000;
-		get_v4_addr() = (unsigned int)ip;
-	}
-
-	ipaddr(in_addr ip, unsigned port = 0)
-	{
-		ipaddr(ip.s_addr, port);
-	}
 
-	ipaddr(sockaddr_in* sin)
-	{
-		ipaddr(sin->sin_addr, sin->sin_port);
-	}
-
-	ipaddr(sockaddr_in6* sin6)
-	{
-		storage = *sin6;
-	}
-
-	sockaddr_in to_sin() const
-	{
-		sockaddr_in ret;
-		memset(&ret, 0, sizeof(ret));
-		if (!is_ipv4()) {
-			// error..
-			return ret;
-		}
-
-		ret.sin_family = AF_INET;
-		ret.sin_port = storage.sin6_port;
-		ret.sin_addr.s_addr = get_v4_addr();
-	}
-
-	const sockaddr_in6& to_sin6() const
-	{
-		return storage;
-	}
-
-	bool is_ipv4() const
-	{
-		return storage.sin6_family == AF_INET;
-	}
+	// ip address is always network byte order but port is not.
+	ipaddr(int ip, unsigned port = 0);
+	ipaddr(in_addr ip, unsigned port = 0);
+	ipaddr(const in6_addr& in6, unsigned port = 0);
+	ipaddr(sockaddr_in* sin) ;
+	ipaddr(sockaddr_in6* sin6);
+
+	sockaddr_in to_sin() const;
+	const sockaddr_in6& to_sin6() const;
+	bool is_ipv4() const;
 
 };
 
-#endif
-
 {endcode}
 
 As you see here, sockaddr_in6 is super-set of sockaddr_in. So, this implementation considers IPv6 as basis and providing compatibility to IPv4 usage.
@@ -206,6 +156,22 @@
 
 In bottom line, I recommend you to have class IpAddr (which is basically sockaddr_in6 with helper functions) even you only want IP address.
 
+{section: Make configure for IPv6 support}
+
+When creating sockets and binding to local address, you need to specify whether it is IPv4 or IPv6. To supply these parameters, I am considering to use ifdef for C/C++ source codes.
+
+{code}
+
+#ifdef CONDOR_IPV6_SUPPORT
+fd = socket(AF_INET6, ...);
+#else
+fd = socket(AF_INET,...);
+#endif
+
+Let's find a way to configure it. It may be done by using "configure" script.
+
+{endcode}
+
 {section: Condor NO_DNS option}
 
 In Condor, NO_DNS option eliminates its dependency to Domain Name System. According to condor_netdb.c
@@ -465,3 +431,4 @@
 ... (omissioned) ...
 Jan, 25 : tackling with inet_ntoa
 Jan, 26 : completed condor_inet_pton and wrote unit test.
+Jan, 28 : tackling with internet.c, mostly is_ip_addr related.