FreeBSD:关于NIC环形缓冲区、mbuf和bpf缓冲区的问题

5
我一直在阅读有关数据包捕获/处理和主机堆栈的技术文档,试图理解所有内容。我遇到了一些问题,希望有人能帮忙。
假设您正在运行tcpdump: 当一个数据包从NIC的环形缓冲区(物理NIC内存,对吗?)复制后,它是否立即被存储到mbuf中?然后BPF从mbuf中获取数据包的副本,该副本随后存储在BPF缓冲区中,因此在同一时间内存在两个内存中的副本?我试图理解确切的过程。
还是更像:数据包从NIC同时被复制到mbuf(用于主机堆栈处理)和BPF伪同时?
一旦数据包通过ip/tcp输入函数进行主机堆栈处理,以mbuf作为位置(指向mbuf),即将数据包存储在mbuf中,如果数据包没有被系统寻址,例如通过监视流量通过hub或SPAN / Monitor端口接收,那么数据包将被丢弃并永远不会上升到主机堆栈。
我看到过一些图表,显示了内核“框/将NIC环形缓冲区(RX / TX)与用户空间分开”,这使我开始怀疑环形缓冲区是否实际上是分配给系统内存而不是NIC上的物理内存。
假设环形缓冲区指的是NIC的物理内存,那么设备驱动程序是否确定了NIC环形缓冲区的大小,不考虑物理限制?例如,我可以通过修改驱动程序来缩小缓冲区吗?
谢谢!
1个回答

2
ETHER_BPF_MTAP宏调用bpf_mtap()函数,该函数接受mbuf格式的数据包,bpf将数据从此mbuf复制到内部缓冲区。
但是,mbufs可以使用外部存储器,因此可能会或可能不会将数据从NIC环形缓冲区复制到mbuf中。实际上,mbuf可以包含数据包数据,也可以仅作为具有对接收缓冲区的引用的标头。
此外,当前的NIC在其小型(128/96/...Kb)板载存储器中仅用于FIFO,并立即将所有数据传输到主存储器中的环形缓冲区。因此,您确实可以在设备驱动程序中调整缓冲区大小。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接