ChangeSet 1.2199.14.43, 2005/03/25 20:50:14-08:00, [EMAIL PROTECTED]
[NET]: Forgot to remove doc file when I killed ethertap.
Noticed by Chris Wright.
Signed-off-by: David S. Miller <[EMAIL PROTECTED]>
ethertap.txt | 261 -----------------------------------------------------------
1 files changed, 261 deletions(-)
diff -Nru a/Documentation/networking/ethertap.txt
b/Documentation/networking/ethertap.txt
--- a/Documentation/networking/ethertap.txt 2005-03-26 17:27:05 -08:00
+++ /dev/null Wed Dec 31 16:00:00 196900
@@ -1,268 +0,0 @@
-NOTE: Ethertap is now an obsolete facility, and is scheduled
- to be removed in the 2.5.x kernel series. Those writing
- applications using ethertap should convert their code to
- use the TUN/TAP driver instead, see 'tuntap.txt' in this
- directory for more details. -DaveM
-
-Ethertap programming mini-HOWTO
--------------------------------
-
-The ethertap driver was written by Jay Schulist <[EMAIL PROTECTED]>,
-you should contact him for further information. This document was written by
-bert hubert <[EMAIL PROTECTED]>. Updates are welcome.
-
-What ethertap can do for you
-----------------------------
-
-Ethertap allows you to easily run your own network stack from userspace.
-Tunnels can benefit greatly from this. You can also use it to do network
-experiments. The alternative would be to use a raw socket to send data and
-use libpcap to receive it. Using ethertap saves you this multiplicity and
-also does ARP for you if you want.
-
-The more technical blurb:
-
-Ethertap provides packet reception and transmission for user space programs.
-It can be viewed as a simple Ethernet device, which instead of receiving
-packets from a network wire, it receives them from user space.
-
-Ethertap can be used for anything from AppleTalk to IPX to even building
-bridging tunnels. It also has many other general purpose uses.
-
-Configuring your kernel
------------------------
-
-Firstly, you need this in Networking Options:
-
- #
- # Code maturity level options
- #
- CONFIG_EXPERIMENTAL=y
-
-Then you need Netlink support:
-
- CONFIG_NETLINK=y
-
-This allows the kernel to exchange data with userspace applications. There
-are two ways of doing this, the new way works with netlink sockets and I
-have no experience with that yet. ANK uses it in his excellent iproute2
-package, see for example rtmon.c. iproute2 can be found on
-ftp://ftp.tux.org/pub/net/ip-routing/iproute2*
-
-The new way is described, partly in netlink(7), available on
-http://www.europe.redhat.com/documentation/man-pages/man7/netlink.7.php3
-
-There is also a Netlink-HOWTO, available on
http://snafu.freedom.org/linux2.2/docs/netlink-HOWTO.html
-Sadly I know of no code using ethertap with this new interface.
-
-The older way works by opening character special files with major node 36.
-Enable this with:
-
- CONFIG_NETLINK_DEV=m
-
-Please be advised that this support is going to be dropped somewhere in the
-future!
-
-Then finally in the Network Devices section,
-
- CONFIG_ETHERTAP=m
-
-You can include it directly in the kernel if you want, of course, no need
-for modules.
-
-Setting it all up
------------------
-
-First we need to create the /dev/tap0 device node:
-
- # mknod /dev/tap0 c 36 16
- # mknod /dev/tap1 c 36 17
- (etc)
-
-Include the relevant modules (ethertap.o, netlink_dev.o, perhaps netlink.o),
-and bring up your tap0 device:
-
- # ifconfig tap0 10.0.0.123 up
-
-Now your device is up and running, you can ping it as well. This is what
-confused me to no end, because nothing is connected to our ethertap as yet,
-how is it that we can ping it?
-
-It turns out that the ethertap is just like a regular network interface -
-even when it's down you can ping it. We need to route stuff to it:
-
- # route add -host 10.0.0.124 gw 10.0.0.123
-
-Now we can read /dev/tap0 and when we ping 10.0.0.124 from our
-localhost, output should appear on the screen.
-
- # cat /dev/tap0
- :�VU:[EMAIL PROTECTED]'
-
-
-Getting this to work from other hosts
--------------------------------------
-
-For this to work, you often need proxy ARP.
-
- # echo 1 > /proc/sys/net/ipv4/conf/eth0/proxy_arp
-
-eth0 here stands for the interface that connects to 'other hosts'.
-
-Chances are that you are trying this on a non-routing desktop computer, so
-you need to enable ip forwarding:
-
- # echo 1 > /proc/sys/net/ipv4/ip_forward
-
-You should now be able to ping 10.0.0.124 from other hosts on your
-10.0.0.0/8 subnet. If you are using public ip space, it should work from
-everywhere.
-
-ARP
----
-
-If we were to take things very literally, your tcp/ip pseudo stack would
-also have to implement ARP and MAC addresses. This is often a bit silly as
-the ethertap device is a figment of our imagination anyway. However, should
-you want to go 'all the way', you can add the 'arp' flag to ifconfig:
-
- # ifconfig tap0 10.0.0.123 up arp
-
-This may also be useful when implementing a bridge, which needs to bridge
-ARP packets as well.
-
-The sample program below will no longer work then, because it does not
-implement ARP.
-
-Sample program
---------------
-
-A sample program is included somewhere in the bowels of the netfilter
-source. I've extracted this program and list it here. It implements a very
-tiny part of the IP stack and can respond to any pings it receives. It gets
-confused if it receives ARP, as it tries to parse it by treating it as an IP
-packet.
-
-/* Simple program to listen to /dev/tap0 and reply to pings. */
-#include <fcntl.h>
-#include <netinet/ip.h>
-#include <netinet/ip_icmp.h>
-#if defined(__GLIBC__) && (__GLIBC__ == 2)
-#include <netinet/tcp.h>
-#include <netinet/udp.h>
-#else
-#include <linux/tcp.h>
-#include <linux/udp.h>
-#endif
-#include <string.h>
-#include <stdio.h>
-#include <errno.h>
-#include <unistd.h>
-
-u_int16_t csum_partial(void *buffer, unsigned int len, u_int16_t prevsum)
-{
- u_int32_t sum = 0;
- u_int16_t *ptr = buffer;
-
- while (len > 1) {
- sum += *ptr++;
- len -= 2;
- }
- if (len) {
- union {
- u_int8_t byte;
- u_int16_t wyde;
- } odd;
- odd.wyde = 0;
- odd.byte = *((u_int8_t *)ptr);
- sum += odd.wyde;
- }
- sum = (sum >> 16) + (sum & 0xFFFF);
- sum += prevsum;
- return (sum + (sum >> 16));
-}
-
-int main()
-{
- int fd, len;
- union {
- struct {
- char etherhdr[16];
- struct iphdr ip;
- } fmt;
- unsigned char raw[65536];
- } u;
-
- fd = open("/dev/tap0", O_RDWR);
- if (fd < 0) {
- perror("Opening `/dev/tap0'");
- return 1;
- }
-
- /* u.fmt.ip.ihl in host order! Film at 11. */
- while ((len = read(fd, &u, sizeof(u))) > 0) {
- u_int32_t tmp;
- struct icmphdr *icmp
- = (void *)((u_int32_t *)&u.fmt.ip + u.fmt.ip.ihl );
- struct tcphdr *tcp = (void *)icmp;
- struct udphdr *udp = (void *)icmp;
-
- fprintf(stderr, "SRC = %u.%u.%u.%u DST = %u.%u.%u.%u\n",
- (ntohl(u.fmt.ip.saddr) >> 24) & 0xFF,
- (ntohl(u.fmt.ip.saddr) >> 16) & 0xFF,
- (ntohl(u.fmt.ip.saddr) >> 8) & 0xFF,
- (ntohl(u.fmt.ip.saddr) >> 0) & 0xFF,
- (ntohl(u.fmt.ip.daddr) >> 24) & 0xFF,
- (ntohl(u.fmt.ip.daddr) >> 16) & 0xFF,
- (ntohl(u.fmt.ip.daddr) >> 8) & 0xFF,
- (ntohl(u.fmt.ip.daddr) >> 0) & 0xFF);
-
- switch (u.fmt.ip.protocol) {
- case IPPROTO_ICMP:
- if (icmp->type == ICMP_ECHO) {
- fprintf(stderr, "PONG! (iphdr = %u bytes)\n",
- (unsigned int)((char *)icmp
- - (char *)&u.fmt.ip));
-
- /* Turn it around */
- tmp = u.fmt.ip.saddr;
- u.fmt.ip.saddr = u.fmt.ip.daddr;
- u.fmt.ip.daddr = tmp;
-
- icmp->type = ICMP_ECHOREPLY;
- icmp->checksum = 0;
- icmp->checksum
- = ~csum_partial(icmp,
- ntohs(u.fmt.ip.tot_len)
- - u.fmt.ip.ihl*4, 0);
-
- {
- unsigned int i;
- for (i = 44;
- i < ntohs(u.fmt.ip.tot_len); i++){
- printf("%u:0x%02X ", i,
- ((unsigned char *)
- &u.fmt.ip)[i]);
- }
- printf("\n");
- }
- write(fd, &u, len);
- }
- break;
- case IPPROTO_TCP:
- fprintf(stderr, "TCP: %u -> %u\n", ntohs(tcp->source),
- ntohs(tcp->dest));
- break;
-
- case IPPROTO_UDP:
- fprintf(stderr, "UDP: %u -> %u\n", ntohs(udp->source),
- ntohs(udp->dest));
- break;
- }
- }
- if (len < 0)
- perror("Reading from `/dev/tap0'");
- else fprintf(stderr, "Empty read from `/dev/tap0'");
- return len < 0 ? 1 : 0;
-}
-
-
To unsubscribe from this list: send the line "unsubscribe bk-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html