У меня есть несколько модулей ядра, которым необходимо взаимодействовать с пользовательским пространством. Следовательно, у каждого модуля есть сокет Netlink.
Моя проблема в том, что эти розетки мешают друг другу. Это связано с тем, что все они регистрируются в одном и том же семействе адресов Netlink (потому что их не так много для начала - макс. 32 и более половины уже зарезервировано), а также потому, что все они привязываются к одному и тому же pid (pid ядра - ноль).
Хотелось бы, чтобы было больше места для адресных семей. Или, еще лучше, я хотел бы привязать свои сокеты к другим pid. Почему Netlink является предпочтительным каналом пользовательского ядра, если одновременно могут быть открыты только 32 сокета?
В документации по libnl-3 говорится
Адрес (порт) netlink состоит из 32-битного целого числа. Порт 0 (ноль) зарезервирован для ядра и относится к сокету на стороне ядра каждого семейства протоколов netlink. Другие номера портов обычно относятся к сокетам, принадлежащим пользовательскому пространству, хотя это не является обязательным.
Это последнее утверждение сейчас кажется ложью. Ядро использует в качестве pid константу и не экспортировать более универсальные функции:
if (netlink_insert(sk, 0))
goto out_sock_release;
Думаю, я могу перекомпилировать ядро и увеличить лимит семейства адресов. Но это модули ядра; Мне не следовало этого делать.
Я что-то упускаю?
nl_table
) и индексируются по номеру протокола. Таким образом, у вас не может быть больше 32 (размер массива) сокетов netlink. Но ничто не мешает вам использовать один сокет и отправлять ему сообщения в соответствии с каким-то предопределенным полем в этих сообщениях. Таким образом, у вас будет несколько виртуальных сокетов. - person Tsyvarev   schedule 02.10.2015