2016-08-01 1 views
0

私はLinuxカーネルのカスタムプロトコルでフロー制御を実装しています。私はACKを受け取ったときに、書込み待ち行列からACKパケットを取り除きたい。ここにいくつかのコードがありますskb_dequeue()後のkfree_skb()はLinuxカーネルをフリーズします

for(i = (ack->sequence - qp->first_unack); i>0&&sk->sk_write_queue.qlen>0; i++){ 
    skb_del = skb_dequeue(&sk->sk_write_queue); 
    qp->first_unack++; 
    kfree_skb(skb_del); 
} 

私はこのコードからカーネルフリーズを取得します。しかし、私がkfree(skb_del)をコメントアウトすると、すべてうまくいく。なぜこのようなことが起こっているのでしょうか?どのように私はメモリを解放することができますか?

+0

を得ることを願っていますinclude/net/sock.hあなたは凍結が良いファイル – Kalu

+0

を与えることができて行きますアイディア。標準ソケットAPIの一部を使用している関数ではありませんか? –

答えて

1

スキップがソケットにキューイングされるので、すでに提供されているソケットAPIを使用できます。

sk_eat_skb(struct sock *sk, struct sk_buff *skb, bool copied_early) // copied_ealy = 0 

詳細については、あなたが適切にあなたがあなた自身でループをデキュー/キューイングからカスタムAPIを使用している理由impementationが

Moreoveを流れてそこに着くなり、tcp_recvmsg追跡することができます。ただ、私はあなたが必要な詳細

+0

への書き込みを停止したとして、カーネルのログファイルが何も含まれていないカーネルフリーズメッセージまたはカーネルクラッシュダンプ –

+0

あなたはインクルード '/ linux/skbuff.h'を調べることができます。もっと多くのアイデアが得られます。はい、APIは標準ですが、Linuxは 'skb_queue_walk(&sk-> sk_receive_queue、skb)'のような標準APIを提供しています。 – Kalu

関連する問題