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);
で
乾杯、
ステファン
'skb-> transport_header'には何がありますか?どのようにカーネルに接続していますか? Netfilter? – eater
こんにちは@eaterあなたのご意見ありがとうございます。私は研究室でそれをテストしなければならなかった。私はskのために用意したポインタが最初に間違っていることを知りました。正しいものでは、私のskb_peek_tail呼び出しはnullを返します。私はそれをもう少し深く見なければならないと思う。とにかくありがとう。私は途中でカーネルに接続していません。これは、カーネル・コードとして直接実行されるカーネル・モジュールです。 – Phi
カーネルにフックすることで、カーネルモジュールがどのようにネットワークスタックから呼び出されていたかがわかりました。たとえば、モジュールが 'ip_input'の前に呼び出されている場合、' skb-> transport_header'はまだ設定されていない可能性があります。しかし、それは他の何かが間違っているように聞こえる。ところで、コメントを読んで、 'skb_peek_tail()'の使用の危険性を理解していることを確認してください。 – eater