2017-07-12 2 views
0

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.

Antwort

1

Siehe man 3 netlink: Sie müssen NLMSG_LENGTH(len) verwenden (und nicht NLMSG_SPACE(len)) das nlmsg_len Feld der nlmsghdr zu berechnen.

+0

Danke! Dies hat das Problem sofort behoben. Ich schätze, ich habe die Manpages nicht richtig gelesen! – trigger

Verwandte Themen