Beispiel #1
0
bool iface_info::check( const address_type & test ) const
{
    bool res = false;
    if( sockaddr_.is_v4( ) && test.is_v4( ) ) {
        auto sa = sockaddr_.to_v4( ).to_ulong( );
        auto ma = mask_.to_v4( ).to_ulong( );
        auto ta = test.to_v4( ).to_ulong( );
        res = ((sa & ma) == (ta & ma));
    } else if( sockaddr_.is_v6( ) && test.is_v6( ) ) {
#ifdef _WIN32
        return true; // always valid.
#else
        auto sa = sockaddr_.to_v6( ).to_bytes( );
        auto ma = mask_.to_v6( ).to_bytes( );
        auto ta = test.to_v6( ).to_bytes( );

        /// something wrong!
        static_assert( sa.max_size( ) == 16,
                       "bytes_type::max_size( ) != 16" );
        res =  (sa[0x0] & ma[0x0]) == (ta[0x0] & ma[0x0])
               && (sa[0x1] & ma[0x1]) == (ta[0x1] & ma[0x1])
               && (sa[0x2] & ma[0x2]) == (ta[0x2] & ma[0x2])
               && (sa[0x3] & ma[0x3]) == (ta[0x3] & ma[0x3])
               && (sa[0x4] & ma[0x4]) == (ta[0x4] & ma[0x4])
               && (sa[0x5] & ma[0x5]) == (ta[0x5] & ma[0x5])
               && (sa[0x6] & ma[0x6]) == (ta[0x6] & ma[0x6])
               && (sa[0x7] & ma[0x7]) == (ta[0x7] & ma[0x7])
               && (sa[0x8] & ma[0x8]) == (ta[0x8] & ma[0x8])
               && (sa[0x9] & ma[0x9]) == (ta[0x9] & ma[0x9])
               && (sa[0xA] & ma[0xA]) == (ta[0xA] & ma[0xA])
               && (sa[0xB] & ma[0xB]) == (ta[0xB] & ma[0xB])
               && (sa[0xC] & ma[0xC]) == (ta[0xC] & ma[0xC])
               && (sa[0xD] & ma[0xD]) == (ta[0xD] & ma[0xD])
               && (sa[0xE] & ma[0xE]) == (ta[0xE] & ma[0xE])
               && (sa[0xF] & ma[0xF]) == (ta[0xF] & ma[0xF])
               ;
#endif
    }
    return res;
}