Ich arbeite an einem Linux-Kernel-Modul, das über eine bidirektionale Kommunikationsverbindung mit einem von netlink bereitgestellten Userspace-Modul verfügt.Abrufen nicht ausgerichteter Netlink-Nachrichtengröße im Kernel-Bereich
Ich habe ein Problem mit einer falschen Berechnung der Nachrichtenlänge für Nachrichten, die vom Userspace zum Kernel-Space geschickt werden.
this->sendLock.lock();
this->netlinkTxHeader->nlmsg_len = NLMSG_SPACE(len);
this->netlinkTxIov.iov_len = this->netlinkTxHeader->nlmsg_len;
memcpy(NLMSG_DATA(this->netlinkTxHeader), buf, len);
int32_t status = sendmsg(this->netlinkSock, &this->netlinkTxMsg, 0);
und empfing im Kernel-Raum wie folgt aus::
unsigned char* buf = (unsigned char*)NLMSG_DATA(nlh);
int len = NLMSG_PAYLOAD(nlh, 0);
jedoch der berechnete Wert von len
immer scheint zu sein, die ausgerichtete Größe, die ich don‘Die Nachricht wird von Anwenderseite wie folgt gesendet Ich will. Zum Beispiel kann ich anhand von Debug-Informationen sehen, dass der Userspace-Prozess eine Nachricht mit einer Nutzlast von 14 Byte sendet (ohne Netlink-Header). Wenn dies im Kernelmodul empfangen wird, gibt NLMSG_PAYLOAD
jedoch eine Länge von 16 Byte zurück.
Gibt es eine Möglichkeit, die nicht ausgerichtete Payload-Länge (d. H. Die tatsächliche Payload-Länge) zurück in das Kernel-Modul zu bekommen? Ich habe die Makros in netlink.h
durchgesehen, aber ich sehe nichts, was helfen würde.
Beachten Sie, dass das Objekt nlmsghdr
mithilfe der Funktion netlink_rcv_skb()
im Kernelmodul abgeleitet wird.
Der einzige andere Weg, den ich sehen kann, um dies zu beheben, ist die tatsächliche Länge in der Nutzinformation, die ich denke, würde funktionieren, aber nicht wirklich "richtig" fühlen.
Danke! Dies hat das Problem sofort behoben. Ich schätze, ich habe die Manpages nicht richtig gelesen! – trigger