[Cisco] Как правильно вычислять wildcard bits в Access list (cisco netmask access)
Ключевые слова: cisco, netmask, access, (найти похожие документы)
_ RU.CISCO (2:5077/15.22) ___________________________________________ RU.CISCO _
From : Anatoly A. Orehovsky 2:5020/400 05 Sep 99 07:22:42
Subj : [Cisco] Как правильно вычислять wildcard bits в Access list
________________________________________________________________________________
From: tolik@mpeks.tomsk.su (Anatoly A. Orehovsky)
Anatoly A. Orehovsky (tolik@mpeks.tomsk.su) wrote:
: Hу, это - конечно. Однако, в свете наличия программки, велика ли разница
: в три строчки ? При том, что оптимизация проводится вручную, а с переделкой
: программки возиться лень ?
Hе мудрствуя лукаво, слегка поправил программку. Таперича сия программка
может:
mk_nets [-fhlw] first_ip last_ip ...
first_ip, last_ip соответственно, превый и последний адреса
диапазона, для которого строятся сетки
-w выдает сетки в формате wildmat, иначе - netmask
-h для netmask 255.255.255.255 при -w выдает "host addr", без -w -
просто addr без netmask
-f выравнивает первый адрес на границу ближайшей сетки
-l выравнивает последний адрес на границу ближайшей сетки
В общем, смотрите сами.
mk_nets.c:
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define PROGNAME "mk_nets"
char wflag, hflag, fflag, lflag;
typedef union {
unsigned long inet;
unsigned char dec[4];
} ipaddr;
void
usage() {
fprintf(stderr, "usage: %s [-fhlw] 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)) &&
(fflag ? 1 : (f & (mask << 1)) == f) &&
(lflag ? 1 : (f | ~(mask << 1)) <= l))
mask <<= 1;
{
ipaddr pa, pm;
pa.inet = htonl(f & mask);
pm.inet = wflag ? htonl(~mask) : htonl(mask);
if (hflag && (mask == 0xffffffffL))
printf("%s%d.%d.%d.%d\n",
wflag ? "host " : "",
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],
wflag ? ' ' : ':',
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, "fhlw")) != EOF) {
switch (ch) {
case 'w' : wflag = 1;
break;
case 'h' : hflag = 1;
break;
case 'f' : fflag = 1;
break;
case 'l' : lflag = 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
--- ifmail v.2.14dev3
* Origin: CISA Ltd. InterNetNews site (2:5020/400)