Date created: Saturday, April 30, 2016 4:30:34 PM. Last modified: Friday, January 3, 2020 3:34:58 PM
Netmap Notes
Ubuntu 14 install:
uname -a Linux ubuntu-test 3.13.0-55-generic #94-Ubuntu SMP Thu Jun 18 00:28:41 UTC 2015 i686 i686 i686 GNU/Linux sudo apt-get install linux-headers-3.13.0-55 sudo apt-get install linux-source-3.13.0 $ ./configure --no-drivers kernel directory /lib/modules/3.13.0-55-generic/build linux version 30d0b [3.13.11] module file netmap.ko subsystems generic monitor pipe vale no-drivers make make apps sudo make install sudo insmod ./netmap.ko lsmod | grep netmap.ko
Hello World, dump packets as hex to the terminal:
// Basic Netmap Receiver
// James Bensley 2016-05
#define NETMAP_WITH_LIBS
#include <net/netmap_user.h>
#include <sys/poll.h>
int main()
{
struct nm_desc *nm_desc;
struct netmap_ring *ring;
struct pollfd fds;
char *nm_pkt_buf;
uint8_t nm_ring_index, nm_pack_len;
nm_desc = nm_open("netmap:eth0", NULL, 0, 0);
while (1) {
fds.fd = NETMAP_FD(nm_desc);
fds.events = POLLIN;
poll(&fds, 1, -1);
ring = NETMAP_RXRING(nm_desc->nifp, 0);
while (!nm_ring_empty(ring)) {
nm_ring_index = ring->cur;
nm_pkt_buf = NETMAP_BUF(ring, ring->slot[nm_ring_index].buf_idx);
nm_pack_len = ring->slot[nm_ring_index].len;
printf("len: %d\n", nm_pack_len);
for(int x = 0; x<nm_pack_len; x++) {
printf("%02x ", (unsigned int)nm_pkt_buf[x]);
}
printf ("\n");
ring->head = ring->cur = nm_ring_next(ring, nm_ring_index);
}
}
return 0;
}
Basic Hello World style traffic generator:
// Basic Netmap Sender
// James Bensley 2016-05
#define NETMAP_WITH_LIBS
#include <net/netmap_user.h>
#include <sys/poll.h>
int main()
{
struct nm_desc *nm_desc;
struct netmap_ring *ring;
struct pollfd fds;
char *nm_pkt_buf;
uint8_t nm_ring_index, nm_pack_len;
nm_desc = nm_open("netmap:eth0", NULL, 0, 0);
ring = NETMAP_TXRING(nm_desc->nifp, 0);
fds.fd = NETMAP_FD(nm_desc);
fds.events = POLLOUT;
char payload[64] = {0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x12, 0x34, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40};
while (1) {
poll(&fds, 1, -1);
while (!nm_ring_empty(ring)) {
nm_ring_index = ring->cur;
nm_pkt_buf = NETMAP_BUF(ring, ring->slot[nm_ring_index].buf_idx);
memcpy((void*)nm_pkt_buf, (void*)&payload, sizeof(payload));
ring->slot[nm_ring_index].len = sizeof(payload);
ring->head = ring->cur = nm_ring_next(ring, nm_ring_index);
}
}
return 0;
}
Previous page: Linux Debug Levels
Next page: Sizeof Reference