Сетевой драйвер Linux - где находится правильное место для проверки полученных пакетов и их отбрасывания при необходимости? - PullRequest
0 голосов
/ 02 мая 2019

Я работаю на сетевом устройстве.Устройство эмулирует устройство Ethernet.Он принимает пакеты, используя некоторое HW, и передает его, используя некоторое HW.Проблема заключается в том, что устройство может принимать «одни и те же» пакеты более одного раза в течение небольшого промежутка времени (точнее, 3 раза), и по некоторым критериям необходимо решить, какая копия является лучшей, и передавать его и только его.

Мой вопрос: где находится правильное место для этой проверки и как правильно это сделать?

Пакет приходит с идентификатором устройства (32-битный номер) и счетчиком сообщений (12число бит) со скоростью несколько сотен сообщений в секунду.Пара dev_id и msg_counter может использоваться в качестве уникального ключа, поэтому для поиска и сравнения полученных пакетов может использоваться простая хеш-таблица (это моя текущая идея).

Через некоторое предопределенное время устройство передаетполученные пакеты, и мы можем освободить хеш-таблицы из этих записей.

Я впервые пишу сетевое устройство, и я не уверен, где разместить код, отвечающий за проверку пакетов., сохраняя «лучшие» и отбрасывая остальные.

Я также не уверен, где выполнить проверку, в ядре или в пространстве пользователя?Я думаю, что ядро ​​лучше, потому что у меня есть вся информация в пространстве ядра, и мне не нужно вызывать какие-либо специальные функции для выполнения проверки пакетов.Это спасет меня от перехода и копирования из пространства ядра в пространство пользователя.

Я также подумал об использовании интерфейса NAPI для моего драйвера из-за высокой скорости пакетов.

...