Я работаю на сетевом устройстве.Устройство эмулирует устройство Ethernet.Он принимает пакеты, используя некоторое HW, и передает его, используя некоторое HW.Проблема заключается в том, что устройство может принимать «одни и те же» пакеты более одного раза в течение небольшого промежутка времени (точнее, 3 раза), и по некоторым критериям необходимо решить, какая копия является лучшей, и передавать его и только его.
Мой вопрос: где находится правильное место для этой проверки и как правильно это сделать?
Пакет приходит с идентификатором устройства (32-битный номер) и счетчиком сообщений (12число бит) со скоростью несколько сотен сообщений в секунду.Пара dev_id и msg_counter может использоваться в качестве уникального ключа, поэтому для поиска и сравнения полученных пакетов может использоваться простая хеш-таблица (это моя текущая идея).
Через некоторое предопределенное время устройство передаетполученные пакеты, и мы можем освободить хеш-таблицы из этих записей.
Я впервые пишу сетевое устройство, и я не уверен, где разместить код, отвечающий за проверку пакетов., сохраняя «лучшие» и отбрасывая остальные.
Я также не уверен, где выполнить проверку, в ядре или в пространстве пользователя?Я думаю, что ядро лучше, потому что у меня есть вся информация в пространстве ядра, и мне не нужно вызывать какие-либо специальные функции для выполнения проверки пакетов.Это спасет меня от перехода и копирования из пространства ядра в пространство пользователя.
Я также подумал об использовании интерфейса NAPI для моего драйвера из-за высокой скорости пакетов.