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)

(и q.v.http://lxr.linux.no/linux+v3.8 / включить / 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.");