static int mask2len(const unsigned char *p, const int size) { int i = 0, j; for(j = 0; j < size; j++, p++) { if(*p != 0xff) break; i += 8; } if(j < size) { switch(*p) { #define MASKLEN(m, l) case m: do { i += l; break; } while (0) MASKLEN(0xfe, 7); break; MASKLEN(0xfc, 6); break; MASKLEN(0xf8, 5); break; MASKLEN(0xf0, 4); break; MASKLEN(0xe0, 3); break; MASKLEN(0xc0, 2); break; MASKLEN(0x80, 1); break; #undef MASKLEN } } return i; }
static int mask_bits(u_char *m_ad, int m_len) { int h_num = 0,i; for (i = 0; i < m_len; i++, m_ad++) { if (*m_ad != 0xff) break; h_num += 8; } if (i < m_len) { switch (*m_ad) { #define MASKLEN(m, l) case m: h_num += l; break MASKLEN(0xfe, 7); MASKLEN(0xfc, 6); MASKLEN(0xf8, 5); MASKLEN(0xf0, 4); MASKLEN(0xe0, 3); MASKLEN(0xc0, 2); MASKLEN(0x80, 1); #undef MASKLEN } } return h_num; }
int mask2len(const struct in6_addr *addr) { int i = 0, j; const u_char *p = (const u_char *)addr; for(j = 0; j < 16; j++, p++) { if(*p != 0xff) break; i += 8; } if(j < 16) { switch(*p) { #define MASKLEN(m, l) case m: do { i += l; break; } while (0) MASKLEN(0xfe, 7); break; MASKLEN(0xfc, 6); break; MASKLEN(0xf8, 5); break; MASKLEN(0xf0, 4); break; MASKLEN(0xe0, 3); break; MASKLEN(0xc0, 2); break; MASKLEN(0x80, 1); break; #undef MASKLEN } } return i; }