根据掩码位计算IPv6地址掩码

最近想一个问题如何快速判断IPv6地址是否为同网段?

比如给定一个前缀prefix 和一个掩码位数mask_len, 那么一个IPv6地址与前缀怎么对比比较快呢。

我大概想了一下,把mask_len变成mask, (IPv6 & mask) ^ prefix == 0 ? 这种位操作的判断应该是比较快的。

mask_len变成mask就要麻烦一点了,毕竟IPv6有16个字节,不像IPv4可以直接位移4字节的unsigned int那么简单。

经过一番调试(经历了分批位移失败的教训后),写出了如下代码,终于还是单字节操作比较方便。

#include <stdio.h>
#include <string.h>

typedef unsigned char         u8;
typedef unsigned short        u16;
typedef unsigned int          u32;
typedef unsigned long long    u64;


typedef union
{
      u8 as_u8[16];
      u16 as_u16[8];
      u32 as_u32[4];
      u64 as_u64[2];
}
ip6_address_t;


#define BYTE_TO_BINARY_PATTERN "%c%c%c%c%c%c%c%c"

#define BYTE_TO_BINARY(byte)   \
    (byte & 0x80 ? '1' : '0'), \
    (byte & 0x40 ? '1' : '0'), \
    (byte & 0x20 ? '1' : '0'), \
    (byte & 0x10 ? '1' : '0'), \
    (byte & 0x08 ? '1' : '0'), \
    (byte & 0x04 ? '1' : '0'), \
    (byte & 0x02 ? '1' : '0'), \
    (byte & 0x01 ? '1' : '0') 


int print_ip6(ip6_address_t* ip)
{
        int i = 0;
        for (i = 0; i < 16; i++) {
                printf(" "BYTE_TO_BINARY_PATTERN, BYTE_TO_BINARY(ip->as_u8[i]));
                if (i == 7) {
                        printf(" ");
                }
        }
        printf("\n");
        return 0;
}

int cal_bitmask(ip6_address_t* p, int len)
{
        if (len < 0) {
                return -1;
        }

        int i = 0;
        p->as_u64[0] = 0;
        p->as_u64[1] = 0;
        for (i = 0; i < 16 && len > 0; i++) {
                if (len < 8) {
                        p->as_u8[i] = 0xFF << (8-len);
                        break;
                }
                p->as_u8[i] = 0xFF;
                len -= 8;
        }

        return 0;
}

int main()
{
        ip6_address_t mask;
        memset(&mask, 0, sizeof(mask));

        int i = 0;
        for (i = 0; i <= 128; i++) {
                memset(&mask, 0, sizeof(mask));
                cal_bitmask(&mask, i);

                print_ip6(&mask);
        }
        return 0;
}

代码中测试了0~128位掩码,二进制输出还是很美观的(前提是屏幕足够大)

[ckun@localhost test]$ gcc a.c
[ckun@localhost test]$ ./a.out 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 10000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11100000 00000000 00000000 00000000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11110000 00000000 00000000 00000000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111000 00000000 00000000 00000000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111100 00000000 00000000 00000000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111110 00000000 00000000 00000000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 00000000 00000000 00000000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 10000000 00000000 00000000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11000000 00000000 00000000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11100000 00000000 00000000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11110000 00000000 00000000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111000 00000000 00000000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111100 00000000 00000000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111110 00000000 00000000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 00000000 00000000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 10000000 00000000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11000000 00000000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11100000 00000000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11110000 00000000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111000 00000000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111100 00000000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111110 00000000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 00000000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 10000000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11000000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11100000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11110000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111100 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111110 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 10000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11100000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11110000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111100 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111110 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 10000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11100000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11110000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111100 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111110 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 10000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11100000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11110000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111100 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111110 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 10000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11100000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11110000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111100  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111110  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  10000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11100000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11110000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111100 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111110 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 10000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11100000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11110000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111100 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111110 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 10000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11100000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11110000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111100 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111110 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 10000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11100000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11110000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111100 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111110 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 10000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 11000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 11100000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 11110000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 11111000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 11111100 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 11111110 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 11111111 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 11111111 10000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 11111111 11000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 11111111 11100000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 11111111 11110000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 11111111 11111000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 11111111 11111100 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 11111111 11111110 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 11111111 11111111 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 11111111 11111111 10000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 11111111 11111111 11000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 11111111 11111111 11100000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 11111111 11111111 11110000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 11111111 11111111 11111000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 11111111 11111111 11111100 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 11111111 11111111 11111110 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 11111111 11111111 11111111 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 11111111 11111111 11111111 10000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 11111111 11111111 11111111 11000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 11111111 11111111 11111111 11100000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 11111111 11111111 11111111 11110000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111100
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111110
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111

在有了根据mask length获取mask之后,判断IPv6是否和prefix同网段就方便了。

如果有更快判断IPv6和Prefix判断同网段的方法,也不灵赐教,嘻嘻。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值