LINUX.ORG.RU

ICMP_FILTER проблема


0

1

помогите кто знает куда копать

setsockopt(sock, SOL_RAW, ICMP_FILTER, (char *)&filter, sizeof(filter);

на центосе отрабатывает нормально и сокет (RAW, ICMP) нормально принимает входящие icmp пакеты с произвольного компа

на FreeBSD с тем же кодом происходят странности. сокет (RAW, ICMP) создаётся нормально setsockopt с вышеуказанными параметрами возвращает ошибку 0x16 и в этом случае recvfrom показывает только те icmp пакеты, ответ которые были ответным результатом исходящих icmp с того же сервера

т.е. сервер отправляет icmp (любой другой процесс например) - ответ виден больше ничего не видно. ни входящие с других серверов ни искуственно созданные «ответы» с других серверов, хотя траффик идёт. результата не видено только на сокете через recvfrom

куда копать? очень надо чтоб на бзде заработало


куда копать?

Я бы спросил в рассылке бздунов.

bk_ ★★
()

Могу ошибаться, но, по ходу, BSD не поддерживает опцию SOL_RAW в setsockopt (как оно у тебя скомпилировалось вообще?).

Вот выдержка из мана (MacOSX, не BSD):

The following options are recognized at the socket level.  Except as noted, each may be examined with getsockopt() and set with setsockopt().

           SO_DEBUG        enables recording of debugging information
           SO_REUSEADDR    enables local address reuse
           SO_REUSEPORT    enables duplicate address and port bindings
           SO_KEEPALIVE    enables keep connections alive
           SO_DONTROUTE    enables routing bypass for outgoing messages
           SO_LINGER       linger on close if data present
           SO_BROADCAST    enables permission to transmit broadcast messages
           SO_OOBINLINE    enables reception of out-of-band data in band
           SO_SNDBUF       set buffer size for output
           SO_RCVBUF       set buffer size for input
           SO_SNDLOWAT     set minimum count for output
           SO_RCVLOWAT     set minimum count for input
           SO_SNDTIMEO     set timeout value for output
           SO_RCVTIMEO     set timeout value for input
           SO_TYPE         get the type of the socket (get only)
           SO_ERROR        get and clear error on the socket (get only)
           SO_NOSIGPIPE    do not generate SIGPIPE, instead return EPIPE
           SO_NREAD        number of bytes to be read (get only)
           SO_NWRITE       number of bytes written not yet sent by the protocol (get only)
           SO_LINGER_SEC   linger on close if data present with timeout in seconds

Да и гуглеж по SOL_RAW указывает только на линукс.

Однако: http://sock-raw.org/papers/sock_raw . Как ты создаешь сокет?

bk_ ★★
()
Последнее исправление: bk_ (всего исправлений: 1)
Ответ на: комментарий от bk_

Могу ошибаться, но, по ходу, BSD не поддерживает опцию SOL_RAW в setsockopt (как оно у тебя скомпилировалось вообще?) Однако: http://sock-raw.org/papers/sock_raw . Как ты создаешь сокет?

fasm'ом компилил, собирал через gcc как обычно

сокет стандартным образом создаётся и работает (но без setsockopt и поэтому фильтрация не работает)

push IPPROTO_ICMP push SOCK_RAW push AF_INET call socket

если SOL_RAW на setsockopt не поддерживается в бзд... какие могут быть ещё варианты, чтобы принимать ICMP ? в этом главный вопрос

jetr7
() автор топика
Ответ на: комментарий от bk_

читал там идёт речь о SOCK_RAW с ним проблем нет, а вот SOL_RAW + ICMP_FILTER на setsockopt там вообще не упоминается, да и сами возможности setsockopt упоминаются вскольз

судя по той писанине

socket(AF_INET, SOCK_RAW, XXX);

где xxx в моём случае IPPROTO_ICMP - сокет должен получать все пакеты для соответствующего протокола, но что происходит на самом деле я написал в первом сообщении.

jetr7
() автор топика
Ответ на: комментарий от jetr7

А какая задача, я так и не понял? Дампить icmp пакеты? Если так, то я бы использовал libpcap (это действительно кроссплатформенный фариант)

bk_ ★★
()
Последнее исправление: bk_ (всего исправлений: 1)
Ответ на: комментарий от bk_

вообщем да, загвоздка в обработке входящих icmp на бзде (тип echo) нутром чую, что должен быть более простой вариант, чем libpcap

jetr7
() автор топика
Ответ на: комментарий от jetr7

Так спроси в рассылке у бздунов. Там спецы точно ответят.

bk_ ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.