gpt4 book ai didi

c - 在循环中接收 UDP 数据包会使 linux 内核崩溃

转载 作者:太空宇宙 更新时间:2023-11-04 04:28:32 26 4
gpt4 key购买 nike

我已经修改了 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 中定义了另一个接收缓冲区,我现在正在使用它。

关于c - 在循环中接收 UDP 数据包会使 linux 内核崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38894287/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com