--- zzzz-none-000/linux-2.6.28.10/net/ipv6/addrconf.c 2009-05-02 18:54:43.000000000 +0000 +++ puma5-6360-529/linux-2.6.28.10/net/ipv6/addrconf.c 2011-09-01 12:45:17.000000000 +0000 @@ -174,6 +174,9 @@ #endif .max_addresses = IPV6_MAX_ADDRESSES, .accept_ra_defrtr = 1, +#ifdef CONFIG_IPV6_MULTIPLE_TABLES + .ra_defrtr_table = RT6_TABLE_UNSPEC, +#endif .accept_ra_pinfo = 1, #ifdef CONFIG_IPV6_ROUTER_PREF .accept_ra_rtr_pref = 1, @@ -208,6 +211,9 @@ #endif .max_addresses = IPV6_MAX_ADDRESSES, .accept_ra_defrtr = 1, +#ifdef CONFIG_IPV6_MULTIPLE_TABLES + .ra_defrtr_table = RT6_TABLE_UNSPEC, +#endif .accept_ra_pinfo = 1, #ifdef CONFIG_IPV6_ROUTER_PREF .accept_ra_rtr_pref = 1, @@ -1757,6 +1763,9 @@ if ((idev = ipv6_find_idev(dev)) == NULL) return NULL; + if (idev->cnf.disable_ipv6) + return idev; + /* Add default multicast route */ addrconf_add_mroute(dev); @@ -2355,11 +2364,14 @@ if (idev == NULL) return; + if (idev->cnf.disable_ipv6) + return; + memset(&addr, 0, sizeof(struct in6_addr)); addr.s6_addr32[0] = htonl(0xFE800000); if (ipv6_generate_eui64(addr.s6_addr + 8, dev) == 0) - addrconf_add_linklocal(idev, &addr); + addrconf_add_linklocal(idev, &addr); } #if defined(CONFIG_IPV6_SIT) || defined(CONFIG_IPV6_SIT_MODULE) @@ -2456,7 +2468,7 @@ struct inet6_dev *idev = __in6_dev_get(dev); int run_pending = 0; int err; - + switch(event) { case NETDEV_REGISTER: if (!idev && dev->mtu >= IPV6_MIN_MTU) { @@ -2485,7 +2497,8 @@ if (idev) { idev->if_flags |= IF_READY; - run_pending = 1; + if (!idev->cnf.disable_ipv6) + run_pending = 1; } } else { if (!addrconf_qdisc_ok(dev)) { @@ -2506,7 +2519,8 @@ "link becomes ready\n", dev->name); - run_pending = 1; + if (idev && !idev->cnf.disable_ipv6) + run_pending = 1; } switch(dev->type) { @@ -3070,6 +3084,30 @@ } #endif +#if defined(CONFIG_MACH_FUSIV) +/* + * Get net device if v6 address is configured on any interface + */ +struct net_device *ipv6_dev_find(struct net *net, struct in6_addr *addr) +{ + struct net_device *dev = NULL; + struct inet6_ifaddr * ifp; + u8 hash = ipv6_addr_hash(addr); + read_lock_bh(&addrconf_hash_lock); + for (ifp = inet6_addr_lst[hash]; ifp; ifp = ifp->lst_next) { + if (!net_eq(dev_net(ifp->idev->dev), net)) + continue; + if (ipv6_addr_equal(&ifp->addr, addr)) { + dev = ifp->idev->dev; + break; + } + } + read_unlock_bh(&addrconf_hash_lock); + return dev; +} +EXPORT_SYMBOL(ipv6_dev_find); +#endif + /* * Periodic address status verification */ @@ -4176,6 +4214,16 @@ .mode = 0644, .proc_handler = &proc_dointvec, }, +#ifdef CONFIG_IPV6_MULTIPLE_TABLES + { + .ctl_name = NET_IPV6_RA_DEFRTR_TABLE, + .procname = "ra_defrtr_table", + .data = &ipv6_devconf.ra_defrtr_table, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = &proc_dointvec, + }, +#endif { .ctl_name = NET_IPV6_ACCEPT_RA_PINFO, .procname = "accept_ra_pinfo",