我们应该构建整个数据包(标题,检查总和等)来使用netmap吗?

时间:2014-10-27 06:37:37

标签: tcp network-programming

我认为netmap允许用户程序员访问用户空间中的数据包,这意味着用户应用程序可以使用此netamp非常快速地读取/发送网络数据包。

netmap:            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);
     }
 }
 }

1 个答案:

答案 0 :(得分:1)

您需要创建整个打包,包括ethernet,ip和tcp标头。 Netmap完全绕过内核网络堆栈,因此您需要自己完成所有工作。