簡體   English   中英

在循環中接收UDP數據包會導致Linux內核崩潰

[英]Receiving UDP packets in a loop crashes linux kernel

我已經在linux內核中修改了UDP代碼,以實現發送和接收緩沖區來處理數據包的無序傳遞。 在新代碼中,每當我嘗試從接收緩沖區向套接字傳遞多個數據包時,就會出現內核崩潰。 我的代碼片段:

while(!skb_queue_empty(&sk->sk_receive_queue)){
    skb = skb_peek(&sk->sk_receive_queue);
    qb = QUIC_SKB_CB(skb);

    //Check if this is the packet to be received
    if(qb->sequence != qp->first_rcv){
        printk("First packet in queue not yet received\nFirst packet seq %u\nExpected packet seq %u\n", qb->sequence, qp->first_rcv);
        //break;
        goto drop;
    }

    skb_unlink(skb, &sk->sk_receive_queue);
    if (sk_rcvqueues_full(sk, skb, sk->sk_rcvbuf))
        goto drop;


    rc = 0;

    ipv4_pktinfo_prepare(sk, skb);
    bh_lock_sock(sk);
    if (!sock_owned_by_user(sk))
        rc = __udp_queue_rcv_skb(sk, skb);
    else if (sk_add_backlog(sk, skb, sk->sk_rcvbuf)) {
        bh_unlock_sock(sk);
        goto drop;
    }
    bh_unlock_sock(sk);
    printk("Packets left in read buffer = %u\n", skb_queue_len(&sk->sk_receive_queue));
}

return rc;

但是, 當我從代碼中刪除while循環時 ,代碼運行正常,但我只設法從緩沖區發送一個數據包。 此外,崩潰發生在bh_lock_sock(sk) ,即數據包被傳遞到套接字時。 我通過評論鎖定和解鎖套接字之間的界限來解決這個問題。

循環可能出現什么問題?

謝謝。

我弄清楚我做錯了什么。 我使用sk->sk_receive_queue作為接收緩沖區,假設UDP沒有真正使用它。 因此,當調用函數__udp_queue_rcv_skb時,它將使用列表sk->sk_receive_queue ,從而干擾我已經填充的隊列。

我剛剛在struct udp_opt定義了另一個接收緩沖區,我現在正在使用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM