のソケットをLinuxカーネルのsk_buff
構造体に入れることは可能ですか? 私は、私はこのコードを使用してsocket
を得ることができます知っている:sk_buffのソケットのソケットIDを取得する
const struct tcphdr *th = tcp_hdr(skb);
struct sock *sk = __inet_lookup_skb(&tcp_hashinfo, skb, th->source, th->dest);
if (sk)
struct socket* = sk->sk_socket;
どこでIDと、このIDのどのような最大値を見つけることができますか?
こんにちは、あなたは答えてくれてありがとう。私は各接続のための私のデータへのポインタを持つ静的な配列を作成する必要があるので、接続IDのいくつかの王が必要です。ソケットディスクリプタが 'short'で、この配列からデータを取得する必要があるときに私がUsermode(' send'、 'write'などをフックする)にあったとき、' array [65536] 'サイズの静的配列を作成しました'send'関数で 'array [fd]'を使用しました - 非常に速くて安全です。カーネルnetfilterモジュールの代替手段を探しています – Kracken
'socket()'は 'int'('あなたはサイズを効果的にチェックせずにそのサイズに関して仮定をするべきではありません。このコメントを書いている私のシステムでは、 'int'は32ビット長です。つまり、あなたの配列は' int array [2147483648] 'として宣言されていて、スタックオーバーフローの原因になっているはずです。スタックに8GiBを割り当てます。私の指摘は、おそらくあなたのアプローチを変えたいと思うことです。 netfilterモジュールのコードを 'net/netfilter /'ディレクトリにチェックアウトし、あなたのような状況をどのように処理しているかを確認することをお勧めします。 – pah
こんにちは、私は1つのことを見つけました、それは 'sk_buff-> sock-> sk_user_data'です、私はここに私のデータへのポインタを貼り付けることができますが、サーバー側(私はドライバをロードする)に問題があります。 1つのサーバポートと 'sk_buff-> sock'はすべてのクライアント接続で同じですが、私はどこに私のデータへのポインタを貼り付けているすべての接続の'カスタムデータ 'を見つけることができたのでしょうか? – Kracken