@ -1,3 +1,4 @@
/* -*- c-basic-offset: 4; indent-tabs-mode: nil; -*- */
# include <arpa/inet.h>
# include <assert.h>
# include <common/status.h>
@ -112,8 +113,8 @@ static bool IsRFC6598(const struct wireaddr *addr)
static bool IsRFC5737 ( const struct wireaddr * addr )
{
return IsIPv4 ( addr ) & & ( ( GetByte ( addr , 3 ) = = 192 & & GetByte ( addr , 2 ) = = 0 & & GetByte ( addr , 1 ) = = 2 ) | |
( GetByte ( addr , 3 ) = = 198 & & GetByte ( addr , 2 ) = = 51 & & GetByte ( addr , 1 ) = = 100 ) | |
( GetByte ( addr , 3 ) = = 203 & & GetByte ( addr , 2 ) = = 0 & & GetByte ( addr , 1 ) = = 113 ) ) ;
( GetByte ( addr , 3 ) = = 198 & & GetByte ( addr , 2 ) = = 51 & & GetByte ( addr , 1 ) = = 100 ) | |
( GetByte ( addr , 3 ) = = 203 & & GetByte ( addr , 2 ) = = 0 & & GetByte ( addr , 1 ) = = 113 ) ) ;
}
static bool IsRFC3849 ( const struct wireaddr * addr )
@ -139,21 +140,21 @@ static bool IsRFC4843(const struct wireaddr *addr)
static bool IsTor ( const struct wireaddr * addr )
{
return addr - > type = = ADDR_TYPE_TOR_V2 | | addr - > type = = ADDR_TYPE_TOR_V3 ;
return addr - > type = = ADDR_TYPE_TOR_V2 | | addr - > type = = ADDR_TYPE_TOR_V3 ;
}
static bool IsLocal ( const struct wireaddr * addr )
{
// IPv4 loopback
if ( IsIPv4 ( addr ) & & ( GetByte ( addr , 3 ) = = 127 | | GetByte ( addr , 3 ) = = 0 ) )
return true ;
if ( IsIPv4 ( addr ) & & ( GetByte ( addr , 3 ) = = 127 | | GetByte ( addr , 3 ) = = 0 ) )
return true ;
// IPv6 loopback (::1/128)
static const unsigned char pchLocal [ 16 ] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 } ;
if ( IsIPv6 ( addr ) & & RawEq ( addr , pchLocal , sizeof ( pchLocal ) ) )
return true ;
// IPv6 loopback (::1/128)
static const unsigned char pchLocal [ 16 ] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 } ;
if ( IsIPv6 ( addr ) & & RawEq ( addr , pchLocal , sizeof ( pchLocal ) ) )
return true ;
return false ;
return false ;
}
static bool IsInternal ( const struct wireaddr * addr )
@ -205,20 +206,20 @@ static bool get_local_sockname(int af, void *saddr, socklen_t saddrlen)
int fd = socket ( af , SOCK_DGRAM , 0 ) ;
if ( fd < 0 ) {
status_debug ( " Failed to create %u socket: %s " ,
af , strerror ( errno ) ) ;
af , strerror ( errno ) ) ;
return false ;
}
if ( connect ( fd , saddr , saddrlen ) ! = 0 ) {
status_debug ( " Failed to connect %u socket: %s " ,
af , strerror ( errno ) ) ;
af , strerror ( errno ) ) ;
close ( fd ) ;
return false ;
}
if ( getsockname ( fd , saddr , & saddrlen ) ! = 0 ) {
status_debug ( " Failed to get %u socket name: %s " ,
af , strerror ( errno ) ) ;
af , strerror ( errno ) ) ;
close ( fd ) ;
return false ;
}
@ -236,9 +237,9 @@ bool guess_address(struct wireaddr *addr)
case ADDR_TYPE_IPV4 : {
struct sockaddr_in sin ;
memset ( & sin , 0 , sizeof ( sin ) ) ;
sin . sin_port = htons ( 53 ) ;
sin . sin_port = htons ( 53 ) ;
/* 8.8.8.8 */
sin . sin_addr . s_addr = 0x08080808 ;
sin . sin_addr . s_addr = 0x08080808 ;
sin . sin_family = AF_INET ;
ret = get_local_sockname ( AF_INET , & sin , sizeof ( sin ) ) ;
addr - > addrlen = sizeof ( sin . sin_addr ) ;
@ -250,7 +251,7 @@ bool guess_address(struct wireaddr *addr)
memset ( & sin6 , 0 , sizeof ( sin6 ) ) ;
/* 2001:4860:4860::8888 */
static const unsigned char pchGoogle [ 16 ]
= { 0x20 , 0x01 , 0x48 , 0x60 , 0x48 , 0x60 , 0 , 0 , 0 , 0 , 0 , 0 , 8 , 8 , 8 , 8 } ;
= { 0x20 , 0x01 , 0x48 , 0x60 , 0x48 , 0x60 , 0 , 0 , 0 , 0 , 0 , 0 , 8 , 8 , 8 , 8 } ;
memset ( & sin6 , 0 , sizeof ( sin6 ) ) ;
sin6 . sin6_port = htons ( 53 ) ;
sin6 . sin6_family = AF_INET6 ;
@ -271,6 +272,6 @@ bool guess_address(struct wireaddr *addr)
bool address_routable ( const struct wireaddr * wireaddr , bool allow_localhost )
{
if ( allow_localhost & & IsLocal ( wireaddr ) )
return true ;
return true ;
return IsRoutable ( wireaddr ) ;
}