netlink_kernel_create не работает с последним ядром Linux
Я получаю ошибку компиляции при компиляции моего старого kernel
модуль, использующий функции netlink.
int
init_module()
{
/* Initialize the Netlink kernel interface */
nl_sk = netlink_kernel_create(&init_net, 17, 0, recv_cmd, NULL, THIS_MODULE);
if(!nl_sk)
{
printk(KERN_INFO "failed to initialize system (error: 1001)\n");
return -ENOMEM;
}
....
Раньше все работало нормально, но теперь я получаю эту ошибку.
error: too many arguments to function 'netlink_kernel_create'
Информация об ОС
uname -a
Linux ibrar-ahmed 3.8.0-17-generic #27-Ubuntu SMP Sun Apr 7 19:39:35 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
3 ответа
Решение
Просто замени
nl_sk = netlink_kernel_create(&init_net, 17, 0, recv_cmd, NULL, THIS_MODULE);
со следующим
struct netlink_kernel_cfg cfg = {
.input = recv_cmd,
};
nl_sk = netlink_kernel_create(&init_net, 17, &cfg);
и это должно работать. Я столкнулся с теми же проблемами.
Это связано с тем, что в 3.8 прототип netlink_kernel_create был изменен:
netlink_kernel_create (struct net * net, int unit, struct netlink_kernel_cfg * cfg)
(и qv http://lxr.linux.no/linux+v3.8/include/linux/netlink.h#L48)
У вас нет выбора, кроме как переписать модуль ядра и удалить этот дополнительный аргумент (THIS_MODULE), а также реализовать структуру netlink_kernel_cfg.
netlink_kernel_create(struct net *net, int unit, struct netlink_kernel_cfg *cfg)
struct netlink_kernel_cfg cfg = {
.groups = SELNLGRP_MAX,
.flags = NL_CFG_F_NONROOT_RECV,
};
selnl = netlink_kernel_create(&init_net, NETLINK_SELINUX, &cfg);
if (selnl == NULL)
panic("SELinux: Cannot create netlink socket.");