On Mon, Dec 23, 2002 at 01:49:46PM +0200, Michail Litvak wrote:
Hello Anatol V Sukhomlyn!
Mon, Dec 23, 2002 at 01:42:21PM +0200, anatols wrote about "[uanog] match ip address!":
AVS> на примере это выглядит так AVS> есть таблица 10.10.10.0/24 AVS> 20.20.20.0/22 AVS> и так далее AVS> вот и нужно чтобы при проверке адреса 10.10.10.1/24 находилось его AVS> вхождение в таблицу. AVS> Сейчас это делается перебором всех значений таблицы, что занимает достаточно AVS> много времени :(. AVS> Может каким-то образом захешировать значения таблицы?
Если я правильно понимаю - то это делается через radix tree, реализацию смотреть внутрях linux kernel или *BSD. /me когда-то писал перловый модуль, но оно потерялось :(
Совсем недавно я размышлял на эту тему и выдумал вот что. У меня есть пакет уже сниференный libpcap. Есть строка вида x.x.x.x[/x]. Надо сверить входит ли src->addr || dst->addr в указанную сеть. И вот что получилось. Боюсь, что /me выдумал велосипед, но этот велосипед, по крайней мере работает. -=- Cut isInIP-alhoritm.txt -=- unsigned long sfx[] = { 0x00000000, 0x80000000, 0xc0000000, 0xe0000000, 0xf0000000, 0xf8000000, 0xfc000000, 0xfe000000, 0xff000000, 0xff800000, 0xffc00000, 0xffe00000, 0xfff00000, 0xfff80000, 0xfffc0000, 0xfffe0000, 0xffff0000, 0xffff8000, 0xffffc000, 0xffffe000, 0xfffff000, 0xfffff800, 0xfffffc00, 0xfffffe00, 0xffffff00, 0xffffff80, 0xffffffc0, 0xffffffe0, 0xfffffff0, 0xfffffff8, 0xfffffffc, 0xfffffffe, 0xffffffff }; int isInIP(char* ip, struct u_packet* pkt) { char *p; char buf[255]; char fqdn[15]; char suffix[5]; int i_suffix; int rc; struct in_addr in; unsigned long _min_; unsigned long _max_; unsigned long _sin_; unsigned long _din_; /* ip - параметр вида ipaddr[/suffix] тип char* p - ноу комментс */ /* 1. Проверяем дан ли нам один хост в строке ip */ sprintf(buf,ip); p = strtok(buf,"/"); if (p == NULL) return 0; sprintf(fqdn,ltrim(rtrim(p))); p = strtok(NULL,"\n"); if (p == NULL) // there is no suffix suffix[0] = '\0'; else sprintf(suffix,p); HOST: if (suffix[0] == '\0') { myitoa(buf,pkt->src); // альтернативная функция перевода in-addr to char* rc = strncmp(buf,fqdn,strlen(fqdn)); if (rc == 0) return 1; myitoa(buf,pkt->dst); rc = strncmp(buf,fqdn,strlen(fqdn)); if (rc == 0) return 1; return 0; } /* 2. Теперь если присутствует суффикс */ i_suffix = atoi(suffix); if (i_suffix == 32) { suffix[0] = '\0'; goto HOST; } rc = inet_aton(fqdn,&in); /* Получаем минимальное и максимальное значение адреса в указанной сети */ _min_ = ntohl(in.s_addr); _max_ = _min_ + (0xffffffff-sfx[i_suffix]); /* sprintf(buf,"min=%lx, max=%lx, pkt src=%lx pkt dst=%lx", _min_,_max_,ntohl(pkt->src),ntohl(pkt->dst)); __log__(buf); */ // И проверяем. _sin_ = ntohl(pkt->src); if ((_sin_>=_min_) && (_sin_<=_max_)) return 1; _din_ = ntohl(pkt->dst); if ((_din_>=_min_) && (_din_<=_max_)) return 1; return 0; } -=- -- Alex Radetsky AR2657-RIPE RAD-UANIC =================================================================== uanog mailing list. To Unsubscribe: send mail to majordomo@uanog.kiev.ua with "unsubscribe uanog" in the body of the message