estrinov
Пользователь
Сообщений: 10
|
|
« : 30 Сентябрь, 2014, 09:06:58 » |
|
Здравствуйте! Решился открыть тему, вроде бы по BPF никто не писал. Если ошибаюсь, простите пожалуйста.
В документации: "The device /dev/bpf is a cloning device, meaning you can open it multiple times. It is in principle similar to a cloning interface, except BPF provides no network interface, only a method to open the same device multiple times." Вопросы по BPF следующие: 1. Можно ли многократно присоединять одно и то же bpf-устройство (прим. bpf0) к одному интерфейсу (прим. en0) с целью применения разных фильтров для разных процессов? 2. Можно ли многократно присоединять одно и то же bpf-устройство (прим. bpf0) к разным интерфейсам (прим. en0, en1)? Тесты работают, но видел примеры из Linux, где присоединению предварялся поиск свободного bpf-устройства. Если "...you can open it multiple times." 3. По умолчанию в системе bpf и bpf0. Если "you can open it multiple times", то зачем более одного? Существует ли возможность увеличения? Спасибо.
|
|
|
Записан
|
С уважением, Юрий Эстринов
|
|
|
Алексей Ермолинский
Сотрудник СВД Встраиваемые Системы
Сотрудник СВД ВС
Пользователь
Сообщений: 53
|
|
« Ответ #1 : 01 Октябрь, 2014, 17:30:25 » |
|
Здравствуйте! Для более точного понимания нами сути проблемы опишите, пожалуйста, как и с помощью чего Вы планируете использовать устройства /dev/bpf*.
|
|
|
Записан
|
|
|
|
estrinov
Пользователь
Сообщений: 10
|
|
« Ответ #2 : 02 Октябрь, 2014, 06:47:32 » |
|
Спасибо за отклик. Возможно проблемы-то и нет. В ходе настройки bpf-фильтра необходимо присоединить сетевой интерфейс (например, en0) к открытому устройству bpf (например, bpf0). Т.е. сперва, к примеру, if (0 > (fd = open("/dev/bpf0", O_RDWR))) err(1, "open"); а затем происходит присоединение if (ioctl_socket(fd, BIOCSETIF, &bound_if) > 0) err(1, "SETIF"); где структура bound_if в поле bound_if.ifr_name содержит имя того самого en0.
Задача состоит в том, чтобы разные процессы (либо потоки) могли при помощи bpf фильтров получать только СВОЙ, определяемый фильтром, трафик из ОДНОГО физического интерфейса. Тесты работают нормально, но возникли сомнения в правильности использования одного и того же устройства bpf для каждого из указанных процессов(потоков) с одним физическим интерфейсом. Сомнения возникли из-за того, что под Линуксом есть примеры поиска свободного bpf устройства перед его использованием для фильтрации. Отсюда и мои вопросы по использованию bpf-устройств и возможности увеличения их количества в системе. Спасибо.
|
|
|
Записан
|
С уважением, Юрий Эстринов
|
|
|
estrinov
Пользователь
Сообщений: 10
|
|
« Ответ #3 : 02 Октябрь, 2014, 11:06:54 » |
|
Еще точнее - подобный код в Линуксе кочует и по QNX: // get a bpf device for reading - /dev/bpf is a cloning device for ( ii = 0; ii < 100; ii++ ) { sprintf( bbuf, "/dev/bpf%d", ii ); bpffd = open( bbuf, O_RDWR ); if ( bpffd != -1 ) break; } при поиске первого открывающегося устройства. Кстати, будет открыт всегда только bpf0. Вот и возникли мои вопросы... Спасибо.
|
|
|
Записан
|
С уважением, Юрий Эстринов
|
|
|
Алексей Ермолинский
Сотрудник СВД Встраиваемые Системы
Сотрудник СВД ВС
Пользователь
Сообщений: 53
|
|
« Ответ #4 : 03 Октябрь, 2014, 10:21:47 » |
|
Судя по информации, представленной в описании утилиты tcpdump, при наличии клонирующего устройства требуется доступ к /dev/bpf, при отсутствии - к одному из существующих /dev/bpf*. По поводу корректности использования несколькими процессами одного устройства BPF для получения траффика из одного и того же физического интерфейса - в коде мы этого не проверяли, но несколько копий tcpdump, запущенных с указанием одного и того же интерфейса en*, вполне работают и фильтруют согласно заданным параметрам. Так же корректно tcpdump отрабатывает при подключении к нескольким интерфейсам.
|
|
|
Записан
|
|
|
|
estrinov
Пользователь
Сообщений: 10
|
|
« Ответ #5 : 03 Октябрь, 2014, 11:30:27 » |
|
Алексей, спасибо! Буду придерживаться правила поиска /dev/bpf, при отсутствии - к одному из существующих /dev/bpf* (что, по-видимому, не отрицает совместного использования).
|
|
|
Записан
|
С уважением, Юрий Эстринов
|
|
|
|