2016-08-07 3 views
0

のソケットを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のどのような最大値を見つけることができますか?

答えて

0

ソケットはファイルです。

struct socketの中には、struct file *fileのメンバーがあります。

look at this question、特に答えは"things you never should do in the Kernel"です。カーネルのソケット構造からファイルディスクリプタを取得しようとしている理由が心配しています(通常、正反対)。膨大な量がある特別な場合

カーネルの下で与えられたファイルからファイル記述子を取得するには、あなたがfdtablefiles_fdtable()の検索)を反復処理する必要があります...これはやるべき仕事の膨大な量です、開いているファイルの数。

ファイルディスクリプタ値の最大値は、システムで許可されるファイルの最大数になります、とのようなもので取得することができます。

files_fdtable(current->files)->max_fds; 
+0

こんにちは、あなたは答えてくれてありがとう。私は各接続のための私のデータへのポインタを持つ静的な配列を作成する必要があるので、接続IDのいくつかの王が必要です。ソケットディスクリプタが 'short'で、この配列からデータを取得する必要があるときに私がUsermode(' send'、 'write'などをフックする)にあったとき、' array [65536] 'サイズの静的配列を作成しました'send'関数で 'array [fd]'を使用しました - 非常に速くて安全です。カーネルnetfilterモジュールの代替手段を探しています – Kracken

+0

'socket()'は 'int'('あなたはサイズを効果的にチェックせずにそのサイズに関して仮定をするべきではありません。このコメントを書いている私のシステムでは、 'int'は32ビット長です。つまり、あなたの配列は' int array [2147483648] 'として宣言されていて、スタックオーバーフローの原因になっているはずです。スタックに8GiBを割り当てます。私の指摘は、おそらくあなたのアプローチを変えたいと思うことです。 netfilterモジュールのコードを 'net/netfilter /'ディレクトリにチェックアウトし、あなたのような状況をどのように処理しているかを確認することをお勧めします。 – pah

+0

こんにちは、私は1つのことを見つけました、それは 'sk_buff-> sock-> sk_user_data'です、私はここに私のデータへのポインタを貼り付けることができますが、サーバー側(私はドライバをロードする)に問題があります。 1つのサーバポートと 'sk_buff-> sock'はすべてのクライアント接続で同じですが、私はどこに私のデータへのポインタを貼り付けているすべての接続の'カスタムデータ 'を見つけることができたのでしょうか? – Kracken

関連する問題