Question

Je souhaite utiliser netlink pour communiquer entre une application et l’espace du noyau. La version de mon noyau Linux est la 2.6.28 et voici mon code erroné:

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

Le message d'erreur abrégé est le suivant:

error: too few arguments to function 'netlink_kernel_create'

Dans le fichier < linux / netlink.h > , la fonction netlink_kernel_create () est définie comme

.
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)

Je ne comprends pas quoi utiliser pour le premier argument, net . Quelqu'un peut-il expliquer ce que je devrais utiliser ici?

Était-ce utile?

La solution

Un struct net contient des informations sur l'espace de noms réseau, un ensemble de ressources réseau disponibles pour les processus. Notez qu’il peut exister plusieurs espaces de noms réseau (c’est-à-dire plusieurs instances de la pile réseau), mais la plupart des pilotes utilisent l’espace de noms init_net.

Votre appel devrait probablement ressembler à ceci:

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

nl_rcv_func est une fonction utilisant struct sk_buff * skb comme seul argument et traitant le message netlink reçu.

Autres conseils

Vous semblez avoir suivi un guide tel que celui-ci , qui ( depuis 2005) aurait bien pu être dépassé par le développement du noyau. Il semble que l’API interne pour créer un lien Internet à partir du noyau ait changé.

Recherchez dans le dossier Documentation / de votre arborescence de noyau locale une documentation (espérons-le plus récente) ou lisez le code lui-même. Vous pouvez également parcourir les archives des listes de diffusion du noyau Linux pour toute mention des modifications apportées. semble avoir eu lieu.

Ici est l'implémentation réelle à la date de 2.6.29, si vous préférez résoudre ce problème à l'envers (et que vous n'avez pas déjà vérifié cela dans votre propre arbre, bien sûr).

Oui, struct net est bien pour l'espace de noms net, mais il n'est pas correct d'utiliser toujours init_net, vous devez enregistrer votre propre opération pernet, comme ceci:

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;
}

et enfin:

register_pernet_subsys(&fib_net_ops);

Je suggérerais ioctl de communiquer avec le noyau / les utilisateurs. L'interface ioctl est standard et les chances d'être mis à jour entre les noyaux sont faibles.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top