Tôi hiện đang cố gắng gỡ lỗi lớp đóng gói ATM chạy trên đầu Ethernet. Về cơ bản, các tế bào ATM được lưu trữ theo thứ tự sau tiêu đề ethernet. Tuy nhiên tôi nghi ngờ các trình điều khiển ngây thơ cách tiếp cận để sk_buffs bị hỏng.Cách chính xác để xử lý tất cả tải trọng của gói sk_buff trong Linux
Người tài xế một cách mù quáng giả định rằng skb-> Xóa dữ liệu có thể được lặp qua nhưng nhìn vào mã kernel cho virtio_net.c: page_to_skb Tôi thấy những hành vi sau đây:
memcpy(hdr, p, hdr_len);
len -= hdr_len;
p += offset;
copy = len;
if (copy > skb_tailroom(skb))
copy = skb_tailroom(skb);
memcpy(skb_put(skb, copy), p, copy);
Sau đó thêm vào:
while (len) {
set_skb_frag(skb, page, offset, &len);
page = (struct page *)page->private;
offset = 0;
}
Có vẻ như bộ đệm bị phân mảnh chỉ với phần đầu tiên có thể truy cập trực tiếp từ dữ liệu skb->.
Tôi nên sử dụng thông tin gì để lấy dữ liệu cơ bản. Lý tưởng nhất là tôi muốn liếc vài byte tại các vị trí tùy ý vào gói ethernet trước khi ghi nhớ các đoạn mã vào bộ đệm khôi phục mà tôi duy trì. Tôi nên sử dụng cái gì để làm điều này?