차이

2012-04-06 8 views
5

sk_buff는 그것을 다음 조각 데이터를 저장할 수있는 두 곳이 있습니다차이

skb_shinfo(head)->frag_list 
skb_shinfo(head)->frags[] 

누군가가 단편화를 처리하기 위해 다음 두 가지 방법의 차이점을 설명해주십시오 수 있습니다.

감사합니다.

답변

4

둘 다 다른 경우에 사용됩니다.

frags는 []

장치가 I/O를, 그리고 당신이는 등 데이터의 결합을하고 싶은 분산이-수집 지원 .. 당신은 2 조각까지로 시작 frags [] 구조를 채울 수 있습니다 n 번째 조각. 첫 번째 단편은 항상 데이터꼬리 포인터로 지정됩니다. 조각의 나머지 부분은 frags 구조로 채워져 있습니다. 분산 형 수집을 사용하지 않는 경우이 변수는 비어 있습니다.

frag_list

이 IP 조각의리스트이다. 이것은 ip_push_pending_frames 동안 채워질 것입니다. 는 [] frag_list은

난을 산란이-수집을 위해/있습니다 O 버퍼 당신의 sk_buffs라는이 ip_push_pending_frames 후

sk_buff0->next = sk_buff1 
sk_buff1->next = sk_buff2 
... 
sk_buffn-1->next = sk_buffn 

sk_buff0->frag_list = sk_buff1 
sk_buff1->next = sk_buff2 
... 
sk_buffn-1->next = sk_buffn 

단순히

frags를 넣어라고이 있죠에있는 말 IP 조각 용

+0

@bjxt에 감사드립니다. 당신의 설명은 아주 분명합니다. 이제 나는 그들이 얼마나 다른지 알고 있습니다. –

2

커널 3.1 당신의 NIC가 __ip_append_data가 skb_shinfo하는 사용자 공간 데이터를 복사합니다 SG의 I/O (머리)를 지원하는 경우> frags는 []

는 - -> frags를, 그렇지 않으면이 기능이 목록을 만들 것입니다 (헤드) 7

skb_shinfo 사용자 공간 데이터로 채워지는 모든 skb가 sk-> sk_write_queue에 대기합니다.

skb_shinfo (헤드) -> frag_list

이 부재는 IP 조각이 사용된다. ip_push_pending_frames()->ip_finish_skb()에서 frag_list에 sk-> sk_write_queue에 대기중인 skbs를 채우고 에 으로 frag_list 처리를 확인하십시오.