Re: No proxy-arp with alias interfaces -- why?

Hannu Koivisto (azure@iki.fi)
13 Oct 1998 18:25:50 +0300


Andi Kleen <ak@muc.de> writes:

| The fix is easy, just change pppd to not set the ATF_COM flag in the
| SIOCSARP ioctl. If it is set the kernel thinks it contains a valid hardware
| address, and if it can't find that address it will return ENODEV (as in
| your case).

Hmmm. But it seems that pppd does not set the ATF_COM flag in
SIOCSARP ioctl. This is the function in question:

"""
int sifproxyarp (int unit, u_int32_t his_adr)
{
struct arpreq arpreq;

if (has_proxy_arp == 0)
{
memset (&arpreq, '\0', sizeof(arpreq));

SET_SA_FAMILY(arpreq.arp_pa, AF_INET);
((struct sockaddr_in *) &arpreq.arp_pa)->sin_addr.s_addr = his_adr;
arpreq.arp_flags = ATF_PERM | ATF_PUBL;
/*
* Get the hardware address of an interface on the same subnet
* as our local address.
*/
if (!get_ether_addr(his_adr, &arpreq.arp_ha, arpreq.arp_dev))
{
syslog(LOG_ERR, "Cannot determine ethernet address for proxy ARP");
return 0;
}

if (ioctl(sock_fd, SIOCSARP, (caddr_t)&arpreq) < 0)
{
if ( ! ok_error ( errno ))
{
syslog(LOG_ERR, "ioctl(SIOCSARP): %m(%d)", errno);
}
return 0;
}
}

proxy_arp_addr = his_adr;
has_proxy_arp = 1;
return 1;
}
"""

I tried to decipher arp_ioctl() in kernel sources to understand
what else could be the reason but trying to understand
networking code is really not what I'm best at :)

If you have other suggestions, I'd be pleased to hear about
them.

Thanks,
//Hannu

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.rutgers.edu
Please read the FAQ at http://www.tux.org/lkml/