Linux Route/Loopback Problem - 2 STAs on same machine
David C Wang
dave
Thu Dec 19 11:14:13 PST 2002
Hi,
I've been unable to resolve this problem for a while. Hopefully
someone can help me out. I've already posted this question to
comp.os.linux.networking with no luck. I'll probably also post
to linux-wlan.
I have 2 wireless interfaces on the *same machine* wlan0 and wlan1
(linux-wlan), and am trying to test an ap (hostap) by having both
interfaces wlan0 and wlan1 speak to each other via the ap. Both
interfaces associate just fine, but i'm having trouble setting up the
linux routes so that the stas can ping each other. I'm hoping that
someone on this list has tried this before.
It seems that linux is ignoring the routing table for local network
devices, and forcing the route through the loopback device. Is there
any way to get around this?
Here's a description of the problem. On the same computer, I have
interfaces wlan0 (192.168.0.10) and wlan1 (192.168.0.11). I want to
ping from wlan0 to wlan1, and make the packet physically hit the
radio, instead of going through the loopback netdevice.
I enable ip_forwarding
echo "1" > /proc/sys/net/ipv4/ip_forward
I clear the kernel routing cache
echo "1" > /proc/sys/net/ipv4/route/flush
Then, I modify my routing tables to say that packets going to
192.168.0.10 (wlan0) should exit through the wlan1 netdevice, and vice
versa:
dave:/home/dave# route add -host 192.168.0.11 dev wlan0
dave:/home/dave# route add -host 192.168.0.10 dev wlan1
dave:/home/dave# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.0.10 0.0.0.0 255.255.255.255 UH 0 0 0 wlan1
192.168.0.11 0.0.0.0 255.255.255.255 UH 0 0 0 wlan0
10.1.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
0.0.0.0 10.1.1.254 0.0.0.0 UG 0 0 0 eth0
Then I ping 192.168.0.10, which should get routed through the second
netdevice wlan1, but the packet still goes through the loopback
netdevice, instead of directly out the physical device.
dave:/home/dave# ping -c 1 192.168.0.10
PING 192.168.0.10 (192.168.0.10): 56 data bytes
64 bytes from 192.168.0.10: icmp_seq=0 ttl=64 time=0.0 ms
--- 192.168.0.10 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.0/0.0/0.0 ms
To verify, I check the Kernel Routing Cache, which indeed shows that
pings to 192.68.0.10 will go through the loopback device.
dave:/home/dave# route -nC|grep -v 10
Kernel IP routing cache
Source Destination Gateway Flags Metric Ref Use Iface
192.168.0.11 192.168.0.11 192.168.0.11 l 0 0 0 lo
192.168.0.11 192.168.0.11 192.168.0.11 l 0 0 0 lo
192.168.0.10 192.168.0.10 192.168.0.10 l 0 0 1 lo
192.168.0.10 192.168.0.10 192.168.0.10 l 0 0 1 lo
I try again by modifying the routing tables to include a gateway for
each device. But I get the same result, and the same output from the
kernel routing cache.
da:/home/dave# route add -host 192.168.0.11 gw 192.168.0.10 dev wlan0
da:/home/dave# route add -host 192.168.0.10 gw 192.168.0.11 dev wlan1
dave:/home/dave# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.0.10 192.168.0.11 255.255.255.255 UGH 0 0 0 wlan1
192.168.0.11 192.168.0.10 255.255.255.255 UGH 0 0 0 wlan0
10.1.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
0.0.0.0 10.1.1.254 0.0.0.0 UG 0 0 0 eth0
I am also aware of the "local" routing table accessible through the
old linux-2.2 "iproute2" interface.
dave:/home/dave# ip route show table local|grep 192
broadcast 192.168.0.255 dev wlan0 proto kernel scope link src
192.168.0.10
broadcast 192.168.0.255 dev wlan1 proto kernel scope link src
192.168.0.11
local 192.168.0.11 dev wlan1 proto kernel scope host src
192.168.0.11
local 192.168.0.10 dev wlan0 proto kernel scope host src
192.168.0.10
broadcast 192.168.0.0 dev wlan0 proto kernel scope link src
192.168.0.10
broadcast 192.168.0.0 dev wlan1 proto kernel scope link src
192.168.0.11
So I try to swap the sources also in this table for each device
dave:/home/dave# ip route change table local local 192.168.0.10 dev
wlan1 \
proto kernel scope host src 192.168.0.11
dave:/home/dave# ip route change table local local 192.168.0.11 dev
wlan0 \
proto kernel scope host src 192.168.0.10
And this is what i get.
dave:/home/dave# ip route show table local|grep 192
broadcast 192.168.0.255 dev wlan0 proto kernel scope link src
192.168.0.10
broadcast 192.168.0.255 dev wlan1 proto kernel scope link src
192.168.0.11
local 192.168.0.11 dev wlan0 proto kernel scope host src
192.168.0.10
local 192.168.0.10 dev wlan1 proto kernel scope host src
192.168.0.11
broadcast 192.168.0.0 dev wlan0 proto kernel scope link src
192.168.0.10
broadcast 192.168.0.0 dev wlan1 proto kernel scope link src
192.168.0.11
Again, when i try to ping it goes through the loopback device. The
routing cache verifies this again.
It seems that linux is ignoring the routing table for local network
devices, and forcing the route through the loopback device. Is there
any way to get around this?
thanks,
-dave
dave at davidwang dot c*m
More information about the Hostap
mailing list