Messages in this thread Patch in this message |  | | From | "A.N.Kuznetsov" <> | Subject | Re: /proc/net/arp | Date | Thu, 26 Dec 1996 20:10:49 +0300 (MSK) |
| |
Hello!
> > > > : I have a deamon that reads /proc/net/arp and forwards packets based upon > > : what it sees there. > > > > Bad idea. But in any case: > > I need to find all the arp-cache entries on the remote (server) host so that > the local host (connected to the internet) can proxy-arp them. If there is > another way, please advise. The daemons setup and tear down the routing and > proxy-arp automatically as my remote machines come on-line.
Try to enable "total" proxy arp: arp -s 0.0.0.0 netmask 0.0.0.0 "" dev eth0 (excuse me for "wrong" syntax, I forgot how it is made in net-tools's arp: the idea is to set wildcard proxy entry on eth0) Now your router will answer to ALL arp requests, this nice facility exists since ~2.0.0. If you know, what prefixes should be proxied, you can limit the range: arp -s A.B.C.0 netmask 255.255.255.0 "" dev eth0
How it works. When router receives an arp request, it looks up its routing table, and if route goes via different interface and a matching entry in proxy arp table is found, it answers. Simple, smart and powerful. (I stole the idea from Cisco IOS 8-))
> I use ioctls to > set up and tear down everything, but there isn't a documentated way to > find out what is in the arp cache except for /proc/net/arp! >
There is no other way to read it. I said "bad idea" not about reading /proc/net/arp, but on using arp cache for taking routing decisions.
> > > > ..... > > : 204.178.40.255 0x1 0x0 00:00:00:00:00:00 * eth0 > > : ^^^^^^^^^^^^^^ BROADCAST address!! > > > > This IS the broadcast address..... >
Thank you! I found this bug. You can apply this patch or just make something sort of:
ifconfig eth0 broadcast 204.178.40.0 (just to change it 8)8) ifconfig eth0 broadcast 204.178.40.255
--- ../v2.1.17+/linux/net/ipv4/devinet.c Tue Dec 24 20:33:31 1996 +++ linux/net/ipv4/devinet.c Thu Dec 26 19:42:22 1996 @@ -229,10 +229,6 @@ addr = (*(struct sockaddr_in *)&ifr.ifr_broadaddr).sin_addr.s_addr; - if (addr == dev->pa_brdaddr) { - dev->ip_flags |= IFF_IP_BRD_OK; - return 0; - } if (dev->flags & IFF_UP) ip_rt_change_broadcast(dev, addr); dev->pa_brdaddr = addr; Alexey Kuznetsov.
|  |