# $Id: README 10863 2012-04-11 17:10:39Z luigi $

NETMAP FOR LINUX
----------------

This directory contains a version of the "netmap" and "VALE" code for Linux.

Netmap is a BSD-licensed framework that supports line-rate direct packet
I/O even on 10GBit/s interfaces (14.88Mpps) with limited system load,
and includes a libpcap emulation library to port applications.

See

	http://info.iet.unipi.it/~luigi/netmap/

for more details. There you can also find the latest versions
of the code and documentation as well as pre-built TinyCore
images based on linux 3.0.3 and containing the netmap modules
and some test applications.

This version supports r8169, ixgbe, igb, e1000, e1000e and forcedeth.

Netmap relies on a kernel module (netmap_lin.ko) and slightly modified
device drivers. Userspace programs can use the native API (documented
in netmap.4) or a libpcap emulation library.

The FreeBSD and Linux versions share the same codebase, which
is located in ../sys . For Linux we use some additional glue code,
(bsd_glue.h).

Device drivers are taken directly from the Linux distributions,
and patched using the files in the patches/ directory.
Common driver modifications are in the .h files in this directory.


HOW TO BUILD THE CODE
---------------------

1. make sure you have kernel sources/headers matching your installed system

2. do the following
	make clean; make SRC=/usr/src/linux-source KSRC=/usr/src/linux-header
   this produces ./netmap_lin.ko and other kernel modules.

3. to build sample applications, run
	(cd ../examples; make )
   (you will need the pthreads and libpcap-dev packages to build them)

If you want support for additional drivers please have a look at
ixgbe_netmap_linux.h and the patches in patches/
The patch file are named as diff--DRIVER--LOW--HIGH--otherstuff
where DRIVER is the driver name to patch, LOW and HIGH are the
versions to which the patch applies (LOW included, HIGH excluded, so
diff--r8169.c--20638--30300--ok applies from 2.6.38 to 3.3.0 (excluded)

HOW TO USE THE CODE
-------------------

    REMEMBER
	THIS IS EXPERIMENTAL CODE WHICH MAY CRASH YOUR SYSTEM.
	USE IT AT YOUR OWN RISk.

Whether you built your own modules, or are using the prebuilt
TinyCore image, the following steps can be used for initial testing:

1. unload any modules for the network cards you want to use, e.g.
	sudo rmmod ixgbe
	sudo rmmod e1000
	...

2. load netmap and device driver module
	sudo insmod ./netmap_lin.ko
	sudo insmod ./ixgbe/ixgbe.ko
	sudo insmod ./e1000/e1000.ko
	...

3. turn the interface(s) up

	sudo ifconfig eth0 up # and same for others

4. Run test applications -- as an example, pkt-gen is a raw packet
   sender/receiver which can do line rate on a 10G interface

	# send about 500 million packets of 60 bytes each.
	# wait 5s before starting, so the link can go up
	sudo pkt-gen -i eth0 -f tx -n 500111222 -l 60 -w 5
	# you should see about 14.88 Mpps

	sudo pkt-gen -i eth0 -f rx # act as a receiver


COMMON PROBLEMS
----------------

* switching in/out of netmap mode causes the link to go down and up.
  If your card is connected to a switch with spanning tree enabled,
  the switch will likely MUTE THE LINK FOR 10 SECONDS while it is
  detecting the new topology. Either disable the spanning tree on
  the switch or use long pauses before sending data;

* Not all cards can do line rate no matter how fast is your software or
  CPU. Several have hardware limitations that prevent reaching the peak
  speed, especially for small packet sizes. Examples:

  - ixgbe cannot receive at line rate with packet sizes that are
    not multiple of 64 (after CRC stripping).
    This is especially evident with minimum-sized frames (-l 60 )

  - some of the low-end 'e1000' cards can send 1.2 - 1.3Mpps instead
    of the theoretical maximum (1.488Mpps)

  - the 'realtek' cards seem unable to send more than 450-500Kpps
    even though they can receive at least 1.1Mpps

* if the link is not up when the packet generator starts, you will
  see frequent messages about a link reset. While we work on a fix,
  use the '-w' argument on the generator to specify a longer timeout

* the ixgbe driver (and perhaps others) is severely slowed down if the
  remote party is senting flow control frames to slow down traffic.
  If that happens try to use the ethtool command to disable flow control.


REVISION HISTORY
-----------------

20120813 - updated distribution using common code for FreeBSD and Linux,
	and inclusion of drivers from the linux source tree

20120322 - fixed the 'igb' driver, now it can send and receive correctly
	(the problem was in netmap_rx_irq() so it might have affected
	other multiqueue cards).
	Also tested the 'r8169' in transmit mode.
	Added comments on switches and spanning tree.

20120217 - initial version. Only ixgbe, e1000 and e1000e are working.
	Other drivers (igb, r8169, forcedeth) are supplied only as a
	proof of concept.

DETAILS
--------
+ igb: on linux 3.2 and above the igb driver moved to split buffers,
  and netmap was not updated until end of june 2013.
  Symptoms were inability to receive short packets.

+ there are reports of ixgbe and igb unable to read packets.
  We are unable to reproduce the problem.
  - Ubuntu 12.04 LTS 3.5.0-25-generic. igb read problems ?
  - 3.2.0-32-generic with 82598 not working

+ if_e1000_e uses regular descriptor up 3.1 at least
  3.2.32 is reported to use extended descriptors
	(in my repo updated at -r 11975)
	
