@ -563,15 +563,9 @@ static bool is_whitelist_ip(unsigned char *ip)
return false ;
}
static bool is_lan_ip ( const sockaddr * addr , int namelen )
static bool is_lan_ip v4( unsigned char * ip )
{
if ( ! namelen ) return false ;
if ( addr - > sa_family = = AF_INET ) {
struct sockaddr_in * addr_in = ( struct sockaddr_in * ) addr ;
unsigned char ip [ 4 ] ;
memcpy ( ip , & addr_in - > sin_addr , sizeof ( ip ) ) ;
PRINT_DEBUG ( " CHECK LAN IP %hhu.%hhu.%hhu.%hhu:%u \n " , ip [ 0 ] , ip [ 1 ] , ip [ 2 ] , ip [ 3 ] , ntohs ( addr_in - > sin_port ) ) ;
PRINT_DEBUG ( " CHECK LAN IP %hhu.%hhu.%hhu.%hhu \n " , ip [ 0 ] , ip [ 1 ] , ip [ 2 ] , ip [ 3 ] ) ;
if ( is_whitelist_ip ( ip ) ) return true ;
if ( ip [ 0 ] = = 127 ) return true ;
if ( ip [ 0 ] = = 10 ) return true ;
@ -582,13 +576,25 @@ static bool is_lan_ip(const sockaddr *addr, int namelen)
if ( ip [ 0 ] = = 239 ) return true ; //multicast
if ( ip [ 0 ] = = 0 ) return true ; //Current network
if ( ip [ 0 ] = = 192 & & ( ip [ 1 ] = = 18 | | ip [ 1 ] = = 19 ) ) return true ; //Used for benchmark testing of inter-network communications between two separate subnets.
if ( ip [ 0 ] > = 224 ) return true ; //ip multicast (224 - 239) future use (240.0.0.0– 255.255.255.254) broadcast (255.255.255.255)
if ( ip [ 0 ] > = 224 ) return true ; //ip multicast (224 - 239) future use (240.0.0.0 - 255.255.255.254) broadcast (255.255.255.255)
return false ;
}
static bool is_lan_ip ( const sockaddr * addr , int namelen )
{
if ( ! namelen ) return false ;
if ( addr - > sa_family = = AF_INET ) {
struct sockaddr_in * addr_in = ( struct sockaddr_in * ) addr ;
unsigned char ip [ 4 ] ;
memcpy ( ip , & addr_in - > sin_addr , sizeof ( ip ) ) ;
if ( is_lan_ipv4 ( ip ) ) return true ;
} else if ( addr - > sa_family = = AF_INET6 ) {
struct sockaddr_in6 * addr_in6 = ( struct sockaddr_in6 * ) addr ;
unsigned char ip [ 16 ] ;
unsigned char zeroes [ 16 ] = { } ;
memcpy ( ip , & addr_in6 - > sin6_addr , sizeof ( ip ) ) ;
PRINT_DEBUG ( " CHECK LAN IP6 %hhu.%hhu.%hhu.%hhu.%hhu.%hhu.%hhu.%hhu...%hhu \n " , ip [ 0 ] , ip [ 1 ] , ip [ 2 ] , ip [ 3 ] , ip [ 4 ] , ip [ 5 ] , ip [ 6 ] , ip [ 7 ] , ip [ 15 ] ) ;
PRINT_DEBUG ( " CHECK LAN IP6 %hhu.%hhu.%hhu.%hhu.%hhu.%hhu.%hhu.%hhu. %hhu .%hhu.%hhu.%hhu.%hhu.%hhu.%hhu .%hhu\n " , ip [ 0 ] , ip [ 1 ] , ip [ 2 ] , ip [ 3 ] , ip [ 4 ] , ip [ 5 ] , ip [ 6 ] , ip [ 7 ] , ip [ 8 ] , ip [ 9 ] , ip [ 10 ] , ip [ 11 ] , ip [ 12 ] , ip [ 13 ] , ip [ 14 ] , ip [ 15 ] ) ;
if ( ( ( ip [ 0 ] = = 0xFF ) & & ( ip [ 1 ] < 3 ) & & ( ip [ 15 ] = = 1 ) ) | |
( ( ip [ 0 ] = = 0xFE ) & & ( ( ip [ 1 ] & 0xC0 ) = = 0x80 ) ) ) return true ;
if ( memcmp ( zeroes , ip , sizeof ( ip ) ) = = 0 ) return true ;
@ -596,7 +602,13 @@ static bool is_lan_ip(const sockaddr *addr, int namelen)
if ( ip [ 0 ] = = 0xff ) return true ; //multicast
if ( ip [ 0 ] = = 0xfc ) return true ; //unique local
if ( ip [ 0 ] = = 0xfd ) return true ; //unique local
//TODO: ipv4 mapped?
unsigned char ipv4_mapped [ 12 ] = { } ;
ipv4_mapped [ 10 ] = 0xFF ;
ipv4_mapped [ 11 ] = 0xFF ;
if ( memcmp ( ipv4_mapped , ip , sizeof ( ipv4_mapped ) ) = = 0 ) {
if ( is_lan_ipv4 ( ip + 12 ) ) return true ;
}
}
PRINT_DEBUG ( " NOT LAN IP \n " ) ;