Frage

Ich möchte netlink verwenden, um zwischen einer Anwendung und Kernel-Space zu kommunizieren. Meine Linux-Kernel-Version ist 2.6.28, und die folgende ist mein Code falsch:

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

Die abgekürzte Fehlermeldung lautet:

error: too few arguments to function 'netlink_kernel_create'

In der Datei <linux/netlink.h> die Funktion netlink_kernel_create() ist definiert als

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)

Ich verstehe nicht, was für das erste Argument zu verwenden, net. Kann jemand erklären, was ich soll hier benutzen?

War es hilfreich?

Lösung

Ein struct net enthält Informationen über den Netzwerk-Namespace, eine Reihe von Netzwerk-Ressourcen zur Verfügung, um Prozesse. Beachten Sie, dass es könnte mehr Netzwerk-Namespaces (das heißt, mehr Instanzen des Netzwerk-Stack), aber die meisten Treiber verwenden, um die init_net Namespace.

Ihr Anruf wahrscheinlich so etwas wie die folgende

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

wo nl_rcv_func ist eine Funktion struct sk_buff *skb als einziges Argument nehmen und verarbeitet die empfangenen netlink Nachricht.

Andere Tipps

Sie scheinen nach einem Führer zu haben wie dieses , die ( aus dem Jahr 2005 ist) und durch die Entwicklung des Kernels überholt wurde möglicherweise. Es scheint die interne API einen netlink zu erstellen, die von der Kernel-Seite geändert hat.

So oder überprüfen Sie die Dokumentation / Ordner in Ihrem lokalen Kernel-Baum für einig (hoffentlich frische) Dokumentation, oder lesen Sie den Code selbst. Sie könnten auch Schleppnetz Linux Kernel Mailinglisten-Archive für jede Erwähnung der Änderungen, die scheinen zu geschehen.

Hier ist die tatsächliche implemntation ab 2.6.29, wenn Sie es eher aus nach hinten rätseln würden (und nicht bereits überprüften dies in Ihrem eigenen Baum, natürlich).

Ja, struct net ist in der Tat für die Netto-Namespace, aber es ist nicht richtig, immer verwenden init_net, sollten Sie Ihre eigenen pernet_operations registrieren, wie folgt aus:

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

und schließlich:

register_pernet_subsys(&fib_net_ops);

Ich würde vorschlagen, ioctl für kernel / Benutzerkommunikation. Die ioctl-Schnittstelle ist Standard und die Möglichkeit, zwischen Kernel aktualisiert worden ist gering.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top