|
ru.unix.bsd- RU.UNIX.BSD ------------------------------------------------------------------ From : Gleb Smirnoff 2:5020/400 19 Oct 2005 01:32:23 To : "Alexey Sopov" Subject : Re: setifindex не догоняю -------------------------------------------------------------------------------- Alexey Sopov <adler@aknet.ru> wrote: AS> Есть роутер, отданный под mpd4(pptp) И кстати как mpd4? AS> Вопрос: Могу ли я не указывать индекс интерфейса, и если не могу, то как мне AS> его получить? В NetFlow version 5 есть такое поле как input interface index. То есть номер интерфейса, в который пакет вошел. ng_netfkiw заполняет это поле. В FreeBSD сетевые пакеты в ядре передаются между подсистемами в виде структуры mbuf, которая описана в mbuf(9). У mbuf есть опциональный указатель на структуру интерфейса, в который этот mbuf пришёл. В структуре интерфейса есть его индекс. Так как указатель опциональный, то в некоторых случаях он может быть и не заполнен. Hапример, когда Ethernet сетевая карта получает пакет, то Ethernet код сначала проставляет указатель на интерфейс, затем передаёт пакет в ng_ether(4). В этом случае ng_netflow легко сама определяет индекс. Когда же пакет сначала принимается скажем E1 картой Cronyx, затем обрабатывается ng_netflow, а только затем ng_iface(4), то в ng_netflow(4) пакет приезжает без указателя. В этом случае администратор должен помочь ноде, и указать индекс интерфейса связанного с этим хуком. В случае PPTP ещё хитрее. Пакет принимается в Ethernet (в большинстве случаев), проставляется указатель на Ethernet интерфейс. Потом пакет детуннелируется, проходит обработку ng_ppp и едёт себе в ng_iface(4), где на нём сменят указатель на входящий интерфейс. Hо по пути он попадает в ng_netflow, с фактически неправильным указателем. То есть с указателем на тот интерфейс, который уровнем выше туннеля. Тут и помогает жёсткое проставление индекса через setifindex. Чем чревато непроставление. Тем, что в экспортах будет нуль вместо индекса (например E1) или же правильный индекс (ng_ether) или же неправильный индекс (PPTP или PPPoE или еще что-то туннельное). Аналогично будет и в выводе flowctl. Может показывать не тот интерфейс. AS> В мануале по if_nametoindex(3) ничего не нашел. Это программный интерфейс. К сожалению шелльного нет в системе. Вот можешь пользоваться вот этим: if_nametoindex.c: #include <sys/types.h> #include <sys/socket.h> #include <net/if.h> int main(int argc, char **argv) { int i; for (i = 1; i < argc; i++) printf("%s -> %d\n", argv[i], if_nametoindex(argv[i])); } Пользоваться вот так: make if_nametoindex ./if_nametoindex `ifconfig -l` -- Totus tuus, Glebius. GLEBIUS-RIPN GLEB-RIPE --- ifmail v.2.15dev5.3 * Origin: Demos online service (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.unix.bsd/6577d9322003.html, оценка из 5, голосов 10
|