2010-12-18 25 views
4

LinuxカーネルのTCP輻輳制御アルゴリズムについては、カーネルモジュールとして認識しています。 コードでは、tcpヘッダーにアクセスし、次の関数を使用してそのようにしたいと考えています。tcp輻輳制御からTCPヘッダーにアクセスするLinuxカーネルモジュール

void get_hdr(struct sock *sk){ 
    struct sk_buff *skb; 
    skb = skb_peek_tail(&sk->sk_receive_queue); 
    if (skb != NULL) 
    printk(KERN_INFO "skb address: %p", skb); 
    struct tcphdr *tcp_header = tcp_hdr(skb); 
    if(tcp_header != 0) 
    printk(KERN_INFO "tcp_header address: %p", tcp_header); 
    else 
    printk(KERN_INFO "tcp_header is NULL"); 
} 

here inside the kernelと同様にこれが基本的に機能するはずです。

skb address: dbd94501 
tcp_header address is NULL 

はどうやらtcp_hdr(skb)への呼び出しが失敗した:

Howerは、私のkern.logを見て、私はそれを参照してください。

私はそれがなぜあるべきかという手がかりはありません。誰かが私が見なければならない、またはTCPヘッダーを取り戻すために何を変えなければならないのか、何か刺激的なヒントを持っていますか?それでもSKB == NULLを持つことができますライン

struct tcphdr *tcp_header = tcp_hdr(skb); 

乾杯、

ステファン

+0

'skb-> transport_header'には何がありますか?どのようにカーネルに接続していますか? Netfilter? – eater

+0

こんにちは@eaterあなたのご意見ありがとうございます。私は研究室でそれをテストしなければならなかった。私はskのために用意したポインタが最初に間違っていることを知りました。正しいものでは、私のskb_peek_tail呼び出しはnullを返します。私はそれをもう少し深く見なければならないと思う。とにかくありがとう。私は途中でカーネルに接続していません。これは、カーネル・コードとして直接実行されるカーネル・モジュールです。 – Phi

+2

カーネルにフックすることで、カーネルモジュールがどのようにネットワークスタックから呼び出されていたかがわかりました。たとえば、モジュールが 'ip_input'の前に呼び出されている場合、' skb-> transport_header'はまだ設定されていない可能性があります。しかし、それは他の何かが間違っているように聞こえる。ところで、コメントを読んで、 'skb_peek_tail()'の使用の危険性を理解していることを確認してください。 – eater

答えて

1

ifセクション全体を中括弧で囲まないのはなぜですか?

void get_hdr(struct sock *sk){ 
struct sk_buff *skb; 
skb = skb_peek_tail(&sk->sk_receive_queue); 
if (skb != NULL) { 
    printk(KERN_INFO "skb address: %p", skb); 
    struct tcphdr *tcp_header = tcp_hdr(skb); 
    if(tcp_header != 0) 
     printk(KERN_INFO "tcp_header address: %p", tcp_header); 
    else 
     printk(KERN_INFO "tcp_header is NULL"); 
} 
} 
1

transport_headerがまったくないパケットである可能性があります。

関連する問題