私は、ネットリンクによって提供されるユーザ空間モジュールとの双方向通信リンクを持つLinuxカーネルモジュールを開発中です。カーネル空間内のアライメントされていないネットリンクのメッセージサイズを取得する
ユーザースペースからカーネルスペースに送信されたメッセージのメッセージ長が正しく計算されないという問題があります。 「私はドンlen
の計算値は常に整列サイズであるように思わしかし
unsigned char* buf = (unsigned char*)NLMSG_DATA(nlh);
int len = NLMSG_PAYLOAD(nlh, 0);
、:メッセージは、次のようにユーザースペースから送信されます。
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);
そして、このようにカーネル空間に収容されています欲しい。たとえば、ユーザースペースプロセスが14バイトのペイロード(netlinkヘッダーを除く)を持つメッセージを送信することをデバッグ情報から確認できます。ただし、これがカーネルモジュールで受信されると、NLMSG_PAYLOAD
は16バイトの長さを返します。
カーネルモジュールでアライメントされていないペイロードの長さ(つまり実際のペイロードの長さ)を戻す方法はありますか?私はnetlink.h
のマクロを調べましたが、助けになるものは何も表示されません。
nlmsghdr
オブジェクトは、カーネルモジュールのnetlink_rcv_skb()
関数を使用して導出されます。
これを修正するために私が見ることができる唯一の方法は、動作すると思われるペイロード情報の実際の長さに接頭辞を付けることです。
ありがとうございます!これにより問題は直ちに解決されました。私は、マニュアルページを正しく読まなかったと思います! – trigger