Frage

Für ein Projekt, ich versuche UDP-Pakete von Linux-Kernel-Raum zu senden. Ich bin zur Zeit ‚hard-coding‘ mein Code in den Kernel (die ich schätze, ist nicht die beste / sauberste Weg), aber ich versuche, einen einfachen Test zur Arbeit zu kommen (zum Senden „TEST“). Es sollte Ich bin ein Neuling erwähnt werden Hacking auf Kernel - Ich bin nicht, die auf vielen Prinzipien und Techniken clued bis

Jedes Mal, wenn mein Code, um das System laufen wird hängt und ich muß neu starten - keine Maus / Tastatur-Antwort und die Scroll- und Caps Lock-Taste leuchtet zusammen blinken - ich bin mir nicht sicher, was das bedeutet, aber ich nehme an, es ein ist Kernel-Panik?

Der repeat_send Code ist für diesen Test-Code unnötig, aber wenn es funktioniert Ich mag große Nachrichten senden, die mehrere ‚Senden die erfordern können? - Ich bin nicht sicher, dass, wenn könnte eine Ursache für meine Probleme sein

N. B. Dieser Code wird in neighbour.c von linux-source / net / core / Herkunft eingeführt werden, damit die Verwendung von NEIGH_PRINTK1, es ist nur ein Makro-Wrapper rund printk.

Ich bin hämmern wirklich meinen Kopf gegen eine Mauer hier, ich nicht offensichtlich etwas erkennen kann, kann jemand mich in die richtige Richtung (oder Stelle, die blendend offensichtliche Fehler!)?

Hier ist, was ich bisher:

void mymethod()
{
    struct socket sock;
    struct sockaddr_in addr_in;
    int ret_val;
    unsigned short port = htons(2048);
    unsigned int host = in_aton("192.168.1.254");
    unsigned int length = 5;
    char *buf = "TEST\0";
    struct msghdr msg;
    struct iovec iov;
    int len = 0, written = 0, left = length;
    mm_segment_t oldmm;

    NEIGH_PRINTK1("forwarding sk_buff at: %p.\n", skb);

    if ((ret_val = sock_create(PF_INET, SOCK_DGRAM, IPPROTO_UDP, &sock)) < 0) {
        NEIGH_PRINTK1("Error during creation of socket; terminating. code: %d\n", ret_val);
        return;
    }

    memset(&addr_in, 0, sizeof(struct sockaddr_in));
    addr_in.sin_family=AF_INET;
    addr_in.sin_port = port;
    addr_in.sin_addr.s_addr = host;

    if((ret_val = sock.ops->bind(&sock, (struct sockaddr *)&addr_in, sizeof(struct sockaddr_in))) < 0) {
    NEIGH_PRINTK1("Error trying to bind socket. code: %d\n", ret_val);
    goto close;
    }

    memset(&msg, 0, sizeof(struct msghdr));
    msg.msg_flags = 0;
    msg.msg_name = &addr_in;
    msg.msg_namelen = sizeof(struct sockaddr_in);
    msg.msg_iov = &iov;
    msg.msg_iovlen = 1;
    msg.msg_control = NULL;
    msg.msg_controllen = 0;

repeat_send:
    msg.msg_iov->iov_len = left;
    msg.msg_iov->iov_base = (char *)buf + written;

    oldmm = get_fs(); 
    set_fs(KERNEL_DS);
    len = sock_sendmsg(&sock, &msg, left);
    set_fs(oldmm);

    if (len == -ERESTARTSYS)
        goto repeat_send;
    if (len > 0) {
        written += len;
        left -= len;
        if (left)
            goto repeat_send;
    }

close:
    sock_release(&sock);
}

Jede Hilfe wäre sehr groß geschätzt werden, Dank!

War es hilfreich?

Lösung

Sie können es einfacher finden, die netpoll API für UDP. Schauen Sie sich auf netconsole für ein Beispiel dafür, wie es verwendet wird. Die APIs Sie verwenden sind bestimmt für User-Space (Sie sollten nie mit Segmentbeschreibern spielen müssen, um Netzwerkdaten zu senden!)

Andere Tipps

Führen Sie den Code, wenn Sie in einem Textmodus-Konsole sind (das heißt drücken Sie Strg + Alt + F1 auf der Textkonsole zu gehen). Auf diese Weise eine Kernel-Panik wird den Stack-Trace und alle zusätzliche Informationen drucken, was schief gelaufen ist.

Wenn das hilft Ihnen nicht, aktualisieren Sie Ihre Frage mit dem Stack-Trace.

Ich bin nicht viel von einem Linux-Kernel-Entwickler, aber können Sie einige printk ist da drin und beobachten dmesg werfen, bevor es nach unten geht? Oder haben Sie darüber nachgedacht, mit einem Kernel-Debugger Einhaken?

Ich glaube, Sie sollten versuchen, alle Variablen außerhalb mymethod () Funktion zu setzen und sie statisch zu machen. Denken Sie daran, dass die Größe des Kernel-Stack ist begrenzt tun 8KiB, wenn man so viel von / zu großen lokalen Variablen können Stack-Überlauf und Systemabsturz führen.

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