我对允许用户程序员访问用户空间中的数据包的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/

10-10 09:40