2017-07-12 19 views
0

私は、ネットリンクによって提供されるユーザ空間モジュールとの双方向通信リンクを持つ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()関数を使用して導出されます。

これを修正するために私が見ることができる唯一の方法は、動作すると思われるペイロード情報の実際の長さに接頭辞を付けることです。

答えて

1

man 3 netlink参照してください:あなたはnlmsghdrnlmsg_lenフィールドを計算するNLMSG_LENGTH(len)(やないNLMSG_SPACE(len))を使用する必要があります。

+0

ありがとうございます!これにより問題は直ちに解決されました。私は、マニュアルページを正しく読まなかったと思います! – trigger

関連する問題