我对允许用户程序员访问用户空间中的数据包的netmap感到愤怒,这意味着用户应用程序可以使用netamp非常快地读取/发送网络数据包。
网络地图:
http://info.iet.unipi.it/~luigi/netmap/
任何一个非常熟悉NetAmp的人,能告诉我我们应该创建我们要发送的整个包,还是使用堆栈功能发送它。
编辑:下面是如何使用这个api的示例
https://www.freebsd.org/cgi/man.cgi?query=netmap&sektion=4
#include <net/netmap_user.h>
void sender(void)
{
struct netmap_if *nifp;
struct netmap_ring *ring;
struct nmreq nmr;
struct pollfd fds;
fd = open("/dev/netmap", O_RDWR);
bzero(&nmr, sizeof(nmr));
strcpy(nmr.nr_name, "ix0");
nmr.nm_version = NETMAP_API;
ioctl(fd, NIOCREGIF, &nmr);
p = mmap(0, nmr.nr_memsize, fd);
nifp = NETMAP_IF(p, nmr.nr_offset);
ring = NETMAP_TXRING(nifp, 0);
fds.fd = fd;
fds.events = POLLOUT;
for (;;) {
poll(&fds, 1, -1);
while (!nm_ring_empty(ring)) {
i = ring->cur;
buf = NETMAP_BUF(ring, ring->slot[i].buf_index);
// here they are saying to construct the packet
... prepare packet in buf ...
ring->slot[i].len = ... packet length ...
ring->head = ring->cur = nm_ring_next(ring, i);
}
}
}
最佳答案
您需要创建整个压缩包,包括以太网、IP和TCP头。netmap完全绕过内核网络堆栈,所以您需要自己完成所有工作。
关于tcp - 我们应该构建整个数据包(标题,检查总和等)来使用netmap吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26582254/