From: tolik@mpeks.tomsk.su (Anatoly A. Orehovsky) Newsgroups: fido7.ru.cisco Subject: Re: Как правильно вычислять wildcard bits в Access list Date: 2 Sep 1999 10:58:43 +0400 Organization: CISA Ltd. InterNetNews site Alex Bakhtin (bakhtin@amt.ru) wrote: : KVS> Как правильно вычислять wildcard bits в Access list Например есть сеть : KVS> класса С 192.168.1.0 но не все машины попадают в Acc-List например : KVS> только с 1 по 37 access-list 1 permit 192.168.1.? 0.0.0.? : Одной строчкой не получится. А wildcard bits надо вычислять в : двоичной системе счисления. : permit 192.168.1.0 0.0.0.31 : permit 192.168.1.32 0.0.0.3 : permit host 192.168.1.37 По этому поводу слепилась программка, которая говорит, что wildcard bits для диапазона 192.168.1.1-192.168.1.37 будут: % mk_nets -ch 192.168.1.1 192.168.1.37 host 192.168.1.1 192.168.1.2 0.0.0.1 192.168.1.4 0.0.0.3 192.168.1.8 0.0.0.7 192.168.1.16 0.0.0.15 192.168.1.32 0.0.0.3 192.168.1.36 0.0.0.1 И таки да ! mk_nets.c: #include #include #include #include #include #define PROGNAME "mk_nets" char cflag; char hflag; typedef union { unsigned long inet; unsigned char dec[4]; } ipaddr; void usage() { fprintf(stderr, "usage: %s [-ch] first_ip last_ip ...\n", PROGNAME); exit(-1); } void mk_nets (unsigned long f, unsigned long l) { unsigned long mask; mask = 0xffffffffL; while(((f & mask) != (l & mask)) && ((f & (mask << 1)) == f) && ((f | ~(mask << 1)) <= l)) mask <<= 1; { ipaddr pa, pm; pa.inet = htonl(f & mask); pm.inet = cflag ? htonl(~mask) : htonl(mask); if (hflag && cflag && (mask == 0xffffffffL)) printf("host %d.%d.%d.%d\n", pa.dec[0], pa.dec[1], pa.dec[2], pa.dec[3]); else printf("%d.%d.%d.%d%c%d.%d.%d.%d\n", pa.dec[0], pa.dec[1], pa.dec[2], pa.dec[3], cflag ? ' ' : ':', pm.dec[0], pm.dec[1], pm.dec[2], pm.dec[3]); } if ((f & mask) != (l & mask)) mk_nets((f | ~mask) + 1, l); } int main(int argc, char **argv) { unsigned long faddr, laddr; register char ch; extern int optind; while ((ch = getopt(argc, argv, "ch")) != EOF) { switch (ch) { case 'c' : cflag = 1; break; case 'h' : hflag = 1; break; case '?' : default : usage(); } } argc -= optind; argv += optind; if (!argc || (argc % 2)) usage(); while (argc) { faddr = ntohl(inet_addr(*argv)); laddr = ntohl(inet_addr(*(argv + 1))); if (faddr == INADDR_NONE || laddr == INADDR_NONE || faddr > laddr) { fprintf(stderr, "invalid parameters\n"); exit(1); } mk_nets(faddr, laddr); argc -= 2; argv += 2; } exit(0); } -- Anatoly A. Orehovsky. AO9-RIPE. AAO1-RIPN http://www.tekmetrics.com/transcript.shtml?pid=6064