現在、Ethernet上で実行されるATMカプセル化レイヤーをデバッグしようとしています。基本的に、ATMセルはイーサネットヘッダーの後に順番に格納されます。しかし、私はドライバがsk_buffsへの素朴なアプローチが壊れていると思う。Linuxでsk_buffパケットのすべてのペイロードを処理する正しい方法はありません
ドライバは盲目的skb->データは、反復処理が、virtio_net.c用のカーネルコードを見ることができることを前提としていますpage_to_skbは、私は次の動作を参照してください。
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);
その後さらに上:
while (len) {
set_skb_frag(skb, page, offset, &len);
page = (struct page *)page->private;
offset = 0;
}
バッファが断片化されており、最初の部分だけがskb-> dataから直接アクセスできるように見えます。
基礎となるデータを取得するにはどうすればよいですか。理想的には、私はmemcpy'ingチャンクを再構成バッファに入れる前に、イーサネットパケットに任意のオフセットでいくつかのバイトを覗き見したいと思います。これを行うにはどうすればよいですか?