2012-04-06 12 views
5

Các sk_buff có hai nơi mà nó có thể lưu trữ dữ liệu phân mảnh tiếp theo:Sự khác nhau giữa frags skbuff và frag_list

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

Có thể ai đó hãy giải thích sự khác biệt giữa hai cách để xử lý phân mảnh.

Cảm ơn và Trân trọng!

Trả lời

4

Cả hai được sử dụng cho các trường hợp khác nhau.

frags []

Khi điện thoại của bạn hỗ trợ phân tán tập hợp I/O, và bạn muốn nó để làm các cách kết hợp dữ liệu vv .. bạn có thể cư frags [] cấu trúc bắt đầu với đoạn thứ 2 đến mảnh thứ n. Đoạn đầu tiên luôn được chỉ định bởi các con trỏ dữ liệuđuôi. Phần còn lại của các mảnh được lấp đầy trong cấu trúc frags []. Nếu bạn không sử dụng tập hợp phân tán, biến này trống.

frag_list

Đây là danh sách của những mảnh IP. Điều này sẽ được lấp đầy trong ip_push_pending_frames. Say sk_buffs bạn đang ở trong sự sắp xếp này

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

Sau ip_push_pending_frames được gọi

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

một cách đơn giản

frags [] là dành cho phân tán tập hợp I/O bộ đệm

frag_list là đối với các đoạn ip

+0

Cảm ơn rất nhiều @bjxt! lời giải thích của bạn rất rõ ràng. Bây giờ tôi biết chúng khác nhau như thế nào –

2

hạt nhân 3.1 7

skb_shinfo (đầu) -> frags []

Nếu NIC của bạn hỗ trợ SG I/O __ip_append_data sẽ sao chép dữ liệu không gian sử dụng để skb_shinfo (đầu) -> frags, nếu chức năng này sẽ tạo ra một danh sách của skbs chứa đầy dữ liệu không gian người dùng và tất cả các skbs sẽ được xếp hàng trong sk-> sk_write_queue.

skb_shinfo (đầu) -> frag_list

thành viên này được sử dụng bởi các mảnh IP. Kiểm tra ip_push_pending_frames()->ip_finish_skb() để điền danh sách frag_list với các skbs xếp hàng trong sk-> sk_write_queue và kiểm tra ip_fragment() để xử lý danh sách frag_list.

Các vấn đề liên quan