@gibsonman01

Как безопасно подменить таблицу операций сетевого интерфейса?

Сетевой интерфейс в Linux представлен структурой:
struct net_device {
        ...
        const struct net_device_ops *netdev_ops;
        ...
};

Я пишу модуль ядра, который служит фильтром сетевых пакетов.
Как безопасно подменить эту таблицу (я опасаюсь эффектов, связанных с параллелизмом).
Использовать rtnl_lock()?
  • Вопрос задан
  • 203 просмотра
Решения вопроса 1
@theg4sh
Решайте проблемы по мере их поступления. К слову, установка семафора не гарантирует безопасность доступа при параллелизме, а лишь уменьшает практически до 0 вероятность появления коллизий.

Насколько понял, ссылка на net_device_ops вообще меняется не часто, поэтому имхо достаточно будет:
struct net_device dev;
static struct net_device_ops overwrited_netdev_ops;
...
dev->netdev_ops = &overwrited_netdev_ops;


Но вот уже сами функции операций имеют свои семафоры, читать:
https://www.kernel.org/doc/Documentation/networkin...

В догонку, так же стоит почитать сам исходник rtnetlink.c
для лучшего понимания процесса:
lxr.free-electrons.com/source/net/core/rtnetlink.c
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы