static void init_loopback(struct device *dev) { struct in6_addr addr; struct inet6_dev *idev; struct inet6_ifaddr * ifp; /* ::1 */ memset(&addr, 0, sizeof(struct in6_addr)); addr.s6_addr[15] = 1; if ((idev = ipv6_find_idev(dev)) == NULL) { printk(KERN_DEBUG "init loopback: add_dev failed\n"); return; } ipv6_mc_up(idev); addrconf_lock(); ifp = ipv6_add_addr(idev, &addr, IFA_HOST); if (ifp) { ifp->flags |= ADDR_PERMANENT; ifp->prefix_len = 128; ipv6_ifa_notify(RTM_NEWADDR, ifp); } addrconf_unlock(); }
static struct inet6_dev * ipv6_find_idev(struct device *dev) { struct inet6_dev *idev; if ((idev = ipv6_get_idev(dev)) == NULL) { idev = ipv6_add_dev(dev); if (idev == NULL) return NULL; } if (dev->flags&IFF_UP) ipv6_mc_up(idev); return idev; }
static struct inet6_dev * ipv6_find_idev(struct net_device *dev) { struct inet6_dev *idev; ASSERT_RTNL(); if ((idev = __in6_dev_get(dev)) == NULL) { if ((idev = ipv6_add_dev(dev)) == NULL) return NULL; } if (dev->flags&IFF_UP) ipv6_mc_up(idev); return idev; }
static void addrconf_dev_config(struct device *dev) { struct in6_addr addr; struct inet6_dev * idev; if (dev->type != ARPHRD_ETHER) { /* Alas, we support only Ethernet autoconfiguration. */ return; } idev = addrconf_add_dev(dev); if (idev == NULL) return; ipv6_mc_up(idev); #ifdef CONFIG_IPV6_EUI64 memset(&addr, 0, sizeof(struct in6_addr)); addr.s6_addr[0] = 0xFE; addr.s6_addr[1] = 0x80; if (ipv6_generate_eui64(addr.s6_addr + 8, dev) == 0) addrconf_add_linklocal(idev, &addr); #endif #ifndef CONFIG_IPV6_NO_PB memset(&addr, 0, sizeof(struct in6_addr)); addr.s6_addr[0] = 0xFE; addr.s6_addr[1] = 0x80; memcpy(addr.s6_addr + (sizeof(struct in6_addr) - dev->addr_len), dev->dev_addr, dev->addr_len); addrconf_add_linklocal(idev, &addr); #endif }
static void addrconf_sit_config(struct device *dev) { struct inet6_dev *idev; /* * Configure the tunnel with one of our IPv4 * addresses... we should configure all of * our v4 addrs in the tunnel */ if ((idev = ipv6_find_idev(dev)) == NULL) { printk(KERN_DEBUG "init sit: add_dev failed\n"); return; } ipv6_mc_up(idev); sit_add_v4_addrs(idev); if (dev->flags&IFF_POINTOPOINT) { addrconf_add_mroute(dev); addrconf_add_lroute(dev); } else sit_route_add(dev); }