patch-2.0.31 linux/Documentation/networking/so_bindtodevice.txt
Next file: linux/Documentation/networking/z8530drv.txt
Previous file: linux/Documentation/networking/ipx.txt
Back to the patch index
Back to the overall index
- Lines: 70
- Date:
Tue Aug 12 11:17:41 1997
- Orig file:
v2.0.30/linux/Documentation/networking/so_bindtodevice.txt
- Orig date:
Wed Dec 31 16:00:00 1969
diff -u --recursive --new-file v2.0.30/linux/Documentation/networking/so_bindtodevice.txt linux/Documentation/networking/so_bindtodevice.txt
@@ -0,0 +1,69 @@
+SO_BINDTODEVICE socket option for Linux 2.0.30+
+by Elliot Poger (elliot@poger.com)
+of Stanford's MosquitoNet project (http://mosquitonet.stanford.edu)
+
+Using the SO_BINDTODEVICE socket option allows your user-level Berkeley
+sockets code to explicitly select which network interface is used for
+both input and output on a per-socket basis. I originally wrote it to
+allow the Internet Software Consortium DHCP server
+(http://www.fugue.com/dhcp/) to run on Linux machines with multiple
+interfaces. It has been tested with UDP and TCP sockets.
+
+Usage is as follows:
+
+
+ int skfd;
+ struct ifreq interface;
+
+ skfd = socket(AF_INET, SOCK_DGRAM, 0);
+ strncpy(interface.ifr_ifrn.ifrn_name, "eth1", IFNAMSIZ);
+ if (setsockopt(skfd, SOL_SOCKET, SO_BINDTODEVICE,
+ (char *)&interface, sizeof(interface)) < 0) {
+ perror("sendpacket: setting SO_BINDTODEVICE");
+ exit(1);
+ }
+
+
+Once the BINDTODEVICE socket option has been set for a socket, as above,
+any data sent over this socket is guaranteed to go out of the "eth1"
+interface, and any data received through the socket is guaranteed to
+have arrived on eth1. If you want to send and receive over multiple
+interfaces, keeping them separate, you can open several sockets and bind
+each one to a different interface with SO_BINDTODEVICE. (You _can_ call
+BINDTODEVICE more than once for a socket to change the interface it's
+bound to, but results may be unpredictable because of caching effects
+in the kernel...)
+
+Note that the routing table is still consulted when packets are transmitted.
+Basically, routing proceeds as usual, except that any routes which go
+through a network interface other than the one specified in the BINDTODEVICE
+call are ignored. If you attempt to send a packet to a certain IP address
+through an interface which provides no route to that IP address, you'll get
+a "network unreachable" error. Here is an example of a routing table which
+will allow you to send packets to any IP address through either eth0 or
+eth1:
+
+Destination Gateway Genmask Flags Metric Ref Use Iface
+171.64.69.0 0.0.0.0 255.255.255.192 U 0 0 37 eth0
+171.64.69.192 0.0.0.0 255.255.255.192 U 0 0 677 eth1
+127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 4 lo
+0.0.0.0 171.64.69.1 0.0.0.0 UG 0 0 45 eth0
+0.0.0.0 171.64.69.193 0.0.0.0 UG 1 0 5 eth1
+
+Note that there are actually TWO default routes. The routing table is
+searched from top to bottom, so every time you send out a packet, the first
+(uppermost) matching route which the kernel routing function finds which
+matches the destination IP address is used. In this case, packets sent to
+the IP address 152.2.128.159 will normally be sent through eth0 and gateway
+171.64.69.1; if the socket is bound to the eth1 device, the packets will be
+sent through eth1 and gateway 171.64.69.193; if the socket is bound to some
+other device, you will get a "network unreachable" error.
+
+By the way, you can add multiple default routes and set the order of
+preference as follows:
+
+route add default gateway 171.64.69.1
+route add default gateway 171.64.69.193 metric 1
+
+Routes with a higher "metric" are put lower in the table and thus have a
+lower preference.
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov