]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
Author: Michael van Elst
authorAmos Jeffries <squid3@treenet.co.nz>
Sat, 23 Jan 2010 06:02:26 +0000 (19:02 +1300)
committerAmos Jeffries <squid3@treenet.co.nz>
Sat, 23 Jan 2010 06:02:26 +0000 (19:02 +1300)
Use POSIX tests for IPv6 address detections.

src/ip/IpAddress.cc

index 81a39faea923db6d759e3bd3bc225e8ed57ac6d2..15f6401137a02e8caf7a1251a8772485672e62f3 100644 (file)
@@ -243,13 +243,7 @@ bool IpAddress::IsSockAddr() const
 bool IpAddress::IsIPv4() const
 {
 #if USE_IPV6
-
-    return IsAnyAddr() || IsNoAddr() ||
-           ( m_SocketAddr.sin6_addr.s6_addr32[0] == htonl(0x00000000) &&
-             m_SocketAddr.sin6_addr.s6_addr32[1] == htonl(0x00000000) &&
-             m_SocketAddr.sin6_addr.s6_addr32[2] == htonl(0x0000FFFF)
-           );
-
+    return IsAnyAddr() || IsNoAddr() || IN6_IS_ADDR_V4MAPPED( &m_SocketAddr.sin6_addr );
 #else
     return true; // enforce IPv4 in IPv4-only mode.
 #endif
@@ -258,12 +252,7 @@ bool IpAddress::IsIPv4() const
 bool IpAddress::IsIPv6() const
 {
 #if USE_IPV6
-
-    return IsAnyAddr() || IsNoAddr() ||
-           !( m_SocketAddr.sin6_addr.s6_addr32[0] == htonl(0x00000000) &&
-              m_SocketAddr.sin6_addr.s6_addr32[1] == htonl(0x00000000) &&
-              m_SocketAddr.sin6_addr.s6_addr32[2] == htonl(0x0000FFFF)
-            );
+    return IsAnyAddr() || IsNoAddr() || !IN6_IS_ADDR_V4MAPPED( &m_SocketAddr.sin6_addr );
 #else
     return false; // enforce IPv4 in IPv4-only mode.
 #endif
@@ -272,13 +261,8 @@ bool IpAddress::IsIPv6() const
 bool IpAddress::IsAnyAddr() const
 {
 #if USE_IPV6
-    return     m_SocketAddr.sin6_addr.s6_addr32[0] == 0
-               && m_SocketAddr.sin6_addr.s6_addr32[1] == 0
-               && m_SocketAddr.sin6_addr.s6_addr32[2] == 0
-               && m_SocketAddr.sin6_addr.s6_addr32[3] == 0
-               ;
+    return IN6_IS_ADDR_UNSPECIFIED( &m_SocketAddr.sin6_addr );
 #else
-
     return (INADDR_ANY == m_SocketAddr.sin_addr.s_addr);
 #endif
 }
@@ -302,15 +286,20 @@ void IpAddress::SetEmpty()
 bool IpAddress::SetIPv4()
 {
 #if USE_IPV6
+    static const struct in6_addr v4_localhost =
+       {{{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+           0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x01 }}};
+    static const struct in6_addr v4_any =
+       {{{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+           0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 }}};
 
     if ( IsLocalhost() ) {
-        m_SocketAddr.sin6_addr.s6_addr32[2] = htonl(0xffff);
-        m_SocketAddr.sin6_addr.s6_addr32[3] = htonl(0x7F000001);
+        m_SocketAddr.sin6_addr = v4_localhost;
         return true;
     }
 
     if ( IsAnyAddr() ) {
-        m_SocketAddr.sin6_addr.s6_addr32[2] = htonl(0xffff);
+        m_SocketAddr.sin6_addr = v4_any;
         return true;
     }
 
@@ -327,19 +316,12 @@ bool IpAddress::SetIPv4()
 bool IpAddress::IsLocalhost() const
 {
 #if USE_IPV6
-    return    (   m_SocketAddr.sin6_addr.s6_addr32[0] == 0
-                  && m_SocketAddr.sin6_addr.s6_addr32[1] == 0
-                  && m_SocketAddr.sin6_addr.s6_addr32[2] == 0
-                  && m_SocketAddr.sin6_addr.s6_addr32[3] == htonl(0x1)
-              )
-              ||
-              (   m_SocketAddr.sin6_addr.s6_addr32[0] == 0
-                  && m_SocketAddr.sin6_addr.s6_addr32[1] == 0
-                  && m_SocketAddr.sin6_addr.s6_addr32[2] == htonl(0xffff)
-                  && m_SocketAddr.sin6_addr.s6_addr32[3] == htonl(0x7F000001)
-              );
-#else
+    static const struct in6_addr v4_localhost =
+       {{{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+           0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x01 }}};
 
+    return IN6_IS_ADDR_LOOPBACK( &m_SocketAddr.sin6_addr ) || IN6_ARE_ADDR_EQUAL( &m_SocketAddr.sin6_addr, &v4_localhost );
+#else
     return (htonl(0x7F000001) == m_SocketAddr.sin_addr.s_addr);
 #endif
 }
@@ -360,7 +342,8 @@ void IpAddress::SetLocalhost()
 bool IpAddress::IsSiteLocal6() const
 {
 #if USE_IPV6
-    return (m_SocketAddr.sin6_addr.s6_addr32[0] & htonl(0xff80)) == htonl(0xfe80);
+    return m_SocketAddr.sin6_addr.s6_addr[0] == 0xfe &&
+           (m_SocketAddr.sin6_addr.s6_addr[1] & 0x80);
 #else
     return false;
 #endif
@@ -369,8 +352,8 @@ bool IpAddress::IsSiteLocal6() const
 bool IpAddress::IsSlaac() const
 {
 #if USE_IPV6
-    return (m_SocketAddr.sin6_addr.s6_addr32[2] & htonl(0x000000ff)) == htonl(0x000000ff) &&
-           (m_SocketAddr.sin6_addr.s6_addr32[3] & htonl(0xff000000)) == htonl(0xfe000000);
+    return m_SocketAddr.sin6_addr.s6_addr[10] == htons(0xff) &&
+           m_SocketAddr.sin6_addr.s6_addr[11] == htons(0xfe);
 #else
     return false;
 #endif
@@ -380,13 +363,12 @@ bool IpAddress::IsNoAddr() const
 {
     // IFF the address == 0xff..ff (all ones)
 #if USE_IPV6
-    return     m_SocketAddr.sin6_addr.s6_addr32[0] == 0xFFFFFFFF
-               && m_SocketAddr.sin6_addr.s6_addr32[1] == 0xFFFFFFFF
-               && m_SocketAddr.sin6_addr.s6_addr32[2] == 0xFFFFFFFF
-               && m_SocketAddr.sin6_addr.s6_addr32[3] == 0xFFFFFFFF
-               ;
-#else
+    static const struct in6_addr v6_noaddr =
+       {{{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+           0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }}};
 
+    return IN6_ARE_ADDR_EQUAL( &m_SocketAddr.sin6_addr, &v6_noaddr );
+#else
     return 0xFFFFFFFF == m_SocketAddr.sin_addr.s_addr;
 #endif
 }
@@ -456,8 +438,8 @@ bool IpAddress::GetReverseString(char buf[MAX_IPSTRLEN], int show_type) const
 
     if (show_type == AF_INET && IsIPv4()) {
 #if USE_IPV6
-
-        return GetReverseString4(buf, *(struct in_addr*)&m_SocketAddr.sin6_addr.s6_addr32[3] );
+        struct in_addr* tmp = (struct in_addr*)&m_SocketAddr.sin6_addr.s6_addr[12];
+        return GetReverseString4(buf, *tmp);
     } else if ( show_type == AF_INET6 && IsIPv6() ) {
         return GetReverseString6(buf, m_SocketAddr.sin6_addr);
 #else
@@ -1167,22 +1149,19 @@ void IpAddress::Map4to6(const struct in_addr &in, struct in6_addr &out) const
 
     if ( in.s_addr == 0x00000000) {
         /* ANYADDR */
-
         memset(&out, 0, sizeof(struct in6_addr));
     } else if ( in.s_addr == 0xFFFFFFFF) {
         /* NOADDR */
-
-        out.s6_addr32[0] = 0xFFFFFFFF;
-        out.s6_addr32[1] = 0xFFFFFFFF;
-        out.s6_addr32[2] = 0xFFFFFFFF;
-        out.s6_addr32[3] = 0xFFFFFFFF;
-
+        memset(&out, 255, sizeof(struct in6_addr));
     } else {
         /* general */
-
         memset(&out, 0, sizeof(struct in6_addr));
-        out.s6_addr32[2] = htonl(0xFFFF);
-        out.s6_addr32[3] = in.s_addr;
+        out.s6_addr[10] = 0xFF;
+        out.s6_addr[11] = 0xFF;
+        out.s6_addr[12] = ((uint8_t *)&in.s_addr)[0];
+        out.s6_addr[13] = ((uint8_t *)&in.s_addr)[1];
+        out.s6_addr[14] = ((uint8_t *)&in.s_addr)[2];
+        out.s6_addr[15] = ((uint8_t *)&in.s_addr)[3];
     }
 }
 
@@ -1193,7 +1172,10 @@ void IpAddress::Map6to4(const struct in6_addr &in, struct in_addr &out) const
     /* general */
 
     memset(&out, 0, sizeof(struct in_addr));
-    out.s_addr = in.s6_addr32[3];
+    ((uint8_t *)&out.s_addr)[0] = in.s6_addr[12];
+    ((uint8_t *)&out.s_addr)[1] = in.s6_addr[13];
+    ((uint8_t *)&out.s_addr)[2] = in.s6_addr[14];
+    ((uint8_t *)&out.s_addr)[3] = in.s6_addr[15];
 }
 
 #endif