2016-08-11 1 views
1

Linux 커널에서 UDP 코드를 수정하여 패킷 송수신을 처리하는 송신 및 수신 버퍼를 구현했습니다. 언제 새 코드에서 소켓에 수신 버퍼로부터 여러 개의 패킷을 전달하려고 할 때마다 커널 충돌이 발생합니다. 내 코드는 : 나는 코드에서 while 루프을 제거 할 때 난 단지 버퍼에서 하나 개의 패킷을 보내도록 관리하지만루프에서 UDP 패킷을 수신하면 Linux 커널이 충돌 함

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; 

그러나 는 코드가 잘 실행됩니다. 또한, 패킷이 소켓으로 전달되는 동안, 즉 bh_lock_sock(sk) 이후에 충돌이 발생합니다. 소켓 잠금과 잠금 해제 사이의 줄을 주석으로 설명했습니다.

루프에 문제가있을 수 있습니까?

감사합니다.

답변

0

내가 잘못한 것을 알았습니다. UDP를 실제로 사용하지 않는다고 가정 할 때 sk->sk_receive_queue을 수신 버퍼로 사용했습니다. 따라서 함수 __udp_queue_rcv_skb이 호출되었을 때, 목록 sk->sk_receive_queue을 사용할 것이고 따라서 이미 채워진 대기열을 방해하게 될 것입니다.

방금 ​​struct udp_opt에 다른 수신 버퍼를 정의했으며 지금 사용하고 있습니다.

관련 문제