“In the Linux (or Unix) world, most network interfaces, such as
eth0 and ppp0, are associated with a physical device that is in
charge of transmitting and receiving data packets. However,
some logical network interfaces don’t feature any physical
packet transmission. The most well-known examples of these
“virtual” interfaces are the shaper and eql interfaces. This
month, we’ll look at how this kind of interface attaches to the
kernel and to the packet-transmission mechanism.”
“From the kernel’s point of view, a network interface is a
software object that can process outgoing packets, with the actual
transmission mechanism hidden inside the interface driver. Even
though most interfaces are associated with physical devices (or,
for the loopback interface, to a software-only data loop), it is
possible to design network-interface drivers that rely on other
interfaces to perform actual packet transmission. The idea of a
“virtual” interface can be useful to implement special-purpose
processing on data packets while avoiding hacking the network
subsystem of the kernel. Although some of what can be accomplished
by a virtual interface is more easily implemented by writing a
netfilter module, not everything can be implemented by netfilters,
and the virtual interface is an additional tool for customizing
network behavior.”
“To support this discussion with a real-world example, I wrote
an insane (INterface SAmple for Network Errors) driver, available
from ftp//ftp.linux.it/pub/People/Rubini/ insane.tar.gz. The
interface simulates semi-random packet loss or intermittent network
failures. (This kind of functionality can be more easily
accomplished with netfilters, and is shown here only to exemplify
the related API.) The code fragments shown here are part of the
insane driver and have been tested with Linux 2.3.42. While the
following description is rather terse, the sample code is
well-commented and tries to fill in some of the gaps left open by
this quick tour of the topic.”