Gary <[EMAIL PROTECTED]> writes:

> I will be very interested to have a way to recover the network if
> someone find the root cause but it seems I reach my technical limit.
> Of course if anyone need more information about my configuration I am
> still in the thread.

I was able to recreate your problem, and to recover from it by doing

# ifconfig eth0 0
# ifconfig eth0 192.168.240.195 netmask 255.255.248.0
# route add default gw 192.168.240.1

from the non-working situation.

I suspect that the problem might be this code in net/ipv4/devinet.c ,
which sets ifa_scope to RT_SCOPE_HOST if you configure a loopback
address (127/8) on any interface.  I guess it's there to protect us from
sending packets with a loopback source address, which woulnd't look too
good:

static int inet_set_ifa(struct net_device *dev, struct in_ifaddr *ifa)
{
        struct in_device *in_dev = __in_dev_get_rtnl(dev);

        ASSERT_RTNL();

        if (!in_dev) {
                inet_free_ifa(ifa);
                return -ENOBUFS;
        }
        ipv4_devconf_setall(in_dev);
        if (ifa->ifa_dev != in_dev) {
                BUG_TRAP(!ifa->ifa_dev);
                in_dev_hold(in_dev);
                ifa->ifa_dev = in_dev;
        }
        if (LOOPBACK(ifa->ifa_local))
                ifa->ifa_scope = RT_SCOPE_HOST;
        return inet_insert_ifa(ifa);
}



The real problem is that there's never anything resetting this scope if
you change the address later.  The attached patch fixes this.


Bjørn

We set the scope to RT_SCOPE_HOST if an IPv4 interface is configured with a 
loopback address (127/8).  This prevents the interface from sending packets 
out the wire.  This patch resets the scope if the address is changed again,
to restore normal functionality.

Signed-off-by: Bjorn Mork <[EMAIL PROTECTED]>

 devinet.c |    1 +
 1 file changed, 1 insertion(+)


--- linux-2.6.24-rc8.orig/net/ipv4/devinet.c	2008-01-16 05:22:48.000000000 +0100
+++ linux-2.6.24-rc8/net/ipv4/devinet.c	2008-01-23 19:17:30.000000000 +0100
@@ -753,6 +753,7 @@
 			inet_del_ifa(in_dev, ifap, 0);
 			ifa->ifa_broadcast = 0;
 			ifa->ifa_anycast = 0;
+			ifa->ifa_scope = 0;
 		}
 
 		ifa->ifa_address = ifa->ifa_local = sin->sin_addr.s_addr;

Reply via email to