Как мне создать «netlink» между ядром и пользовательским пространством?

Я хочу использовать netlink для связи между приложением и пространством ядра. Моя версия ядра Linux - 2.6.28, и мой код неверен:

nf_sock=netlink_kernel_create(NL_PROTO,0,nl_user_skb,THIS_MODULE);

Сокращенное сообщение об ошибке:

error: too few arguments to function 'netlink_kernel_create'

В файле <linux/netlink.h> функция netlink_kernel_create() определяется как

extern struct sock *netlink_kernel_create(struct net *net,int unit,unsigned int groups,void (*input)(struct sk_buff *skb),struct mutex *cb_mutex,struct module *module)

Я не понимаю, что использовать для первого аргумента, net. Может кто-нибудь объяснить, что я должен использовать здесь?

4 голоса | спросил Charlie Epps 30 AMpThu, 30 Apr 2009 10:40:55 +040040Thursday 2009, 10:40:55

4 ответа


0

A struct net содержит информацию о сетевом пространстве имен, наборе сетевых ресурсов, доступных процессам. Обратите внимание, что может быть несколько сетевых пространств имен (то есть несколько экземпляров сетевого стека), но большинство драйверов используют пространство имен init_net.

Ваш звонок должен выглядеть примерно так

nf_sock = netlink_kernel_create(&init_net,
                                NETLINK_USERSOCK,
                                0,
                                nl_rcv_func,
                                NULL,
                                THIS_MODULE);

где nl_rcv_func - это функция, принимающая struct sk_buff *skb в качестве единственного аргумента и обрабатывает полученное сообщение netlink.

ответил ctuffli 1 Mayam09 2009, 02:12:05
0

Похоже, что вы следовали этому руководству, например этому , которое ( с 2005 года) вполне могли быть опередили разработку ядра. Похоже, что внутренний API для создания сетевой ссылки со стороны ядра изменился.

Либо проверьте папку Documentation /в локальном дереве ядра на наличие некоторой (возможно, более свежей) документации, либо прочитайте сам код. Вы также можете траловать архив списков рассылки ядра Linux для любого упоминания об изменениях, которые похоже, что произошло.

Здесь - фактическая реализация на 2.6.29, если вы предпочитаете загадывать это задом наперед (и, конечно, еще не проверили это в своем дереве).

ответил unwind 30 AMpThu, 30 Apr 2009 10:48:32 +040048Thursday 2009, 10:48:32
0

Да, struct net действительно предназначена для пространства имен net, но не всегда нужно использовать init_net, вы должны зарегистрировать свои собственные pernet_operations, например:

static struct pernet_operations fib_net_ops = {
        .init = fib_net_init,
        .exit = fib_net_exit,
};

static int __net_init fib_net_init(struct net *net)
{
        int error;

#ifdef CONFIG_IP_ROUTE_CLASSID
        net->ipv4.fib_num_tclassid_users = 0;
#endif
        error = ip_fib_net_init(net);
        if (error < 0)
                goto out;
        error = nl_fib_lookup_init(net);
        if (error < 0)
                goto out_nlfl;
        error = fib_proc_init(net);
        if (error < 0)
                goto out_proc;
out:
        return error;

out_proc:
        nl_fib_lookup_exit(net);
out_nlfl:
        ip_fib_net_exit(net);
        goto out;
}

static int __net_init nl_fib_lookup_init(struct net *net)
{
        struct sock *sk;
        struct netlink_kernel_cfg cfg = {
                .input  = nl_fib_input,
        };

        sk = netlink_kernel_create(net, NETLINK_FIB_LOOKUP, &cfg);
        if (sk == NULL)
                return -EAFNOSUPPORT;
        net->ipv4.fibnl = sk;
        return 0;
}

и, наконец,

register_pernet_subsys(&fib_net_ops);
ответил Cong Wang 13 22012vEurope/Moscow11bEurope/MoscowTue, 13 Nov 2012 09:30:38 +0400 2012, 09:30:38
0

Я бы предложил ioctl для взаимодействия между ядром и пользователем. Интерфейс ioctl является стандартным, и вероятность обновления между ядрами мала.

ответил Ilya 30 PMpThu, 30 Apr 2009 13:44:44 +040044Thursday 2009, 13:44:44

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132