2016-08-01 4 views
0

리눅스 커널의 커스텀 프로토콜에서 흐름 제어를 구현하고 있습니다. ACK를 받으면 쓰기 대기열에서 승인 된 패킷을 제거하려고합니다. 다음은 몇 가지 코드입니다.skb_dequeue() 이후의 kfree_skb()가 리눅스 커널을 고정시킵니다.

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

커널 고정 메시지 또는 커널 크래시 덤프를 제공 할 수 있습니까? – Kalu

+0

커널 로그 파일에는 고정이 파일에 대한 쓰기를 중지하기 때문에 아무 것도 포함되어 있지 않습니다. –

답변

1

skbs가 소켓에 대기열로 들어 있으므로 이미 제공된 소켓 API를 사용할 수 있습니다.

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

자세한 내용은 제대로 당신은 당신이 당신의 자신에 루프를 대기열에서 제외/대기열에서 사용자 정의 API를 사용하는 이유 impementation이

Moreove 흐름이 얻을 것이다, tcp_recvmsg 추적 할 수 있습니다. 그냥 include/net/sock.h에 들어가십시오. 필요한 정보를 얻을 수 있기를 바랍니다.

+0

좋은 소식입니다. 생각. 하지만 표준 소켓 API의 일부를 사용하고있는 함수가 아닌가? –

+0

include /'/ linux/skbuff.h'를 통해 더 많은 아이디어를 얻을 수 있습니다. 그렇습니다. API는 표준이지만 리눅스는'skb_queue_walk (& sk-> sk_receive_queue, skb)'와 같은 표준 API를 제공했습니다. – Kalu

관련 문제