addrconf.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:46k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * IPv6 Address [auto]configuration
  3.  * Linux INET6 implementation
  4.  *
  5.  * Authors:
  6.  * Pedro Roque <roque@di.fc.ul.pt>
  7.  * Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>
  8.  *
  9.  * $Id: addrconf.c,v 1.69 2001/10/31 21:55:54 davem Exp $
  10.  *
  11.  * This program is free software; you can redistribute it and/or
  12.  *      modify it under the terms of the GNU General Public License
  13.  *      as published by the Free Software Foundation; either version
  14.  *      2 of the License, or (at your option) any later version.
  15.  */
  16. /*
  17.  * Changes:
  18.  *
  19.  * Janos Farkas : delete timer on ifdown
  20.  * <chexum@bankinf.banki.hu>
  21.  * Andi Kleen : kill doube kfree on module
  22.  * unload.
  23.  * Maciej W. Rozycki : FDDI support
  24.  * sekiya@USAGI : Don't send too many RS
  25.  * packets.
  26.  * yoshfuji@USAGI :       Fixed interval between DAD
  27.  * packets.
  28.  */
  29. #include <linux/config.h>
  30. #include <linux/errno.h>
  31. #include <linux/types.h>
  32. #include <linux/socket.h>
  33. #include <linux/sockios.h>
  34. #include <linux/sched.h>
  35. #include <linux/net.h>
  36. #include <linux/in6.h>
  37. #include <linux/netdevice.h>
  38. #include <linux/if_arp.h>
  39. #include <linux/route.h>
  40. #include <linux/inetdevice.h>
  41. #include <linux/init.h>
  42. #ifdef CONFIG_SYSCTL
  43. #include <linux/sysctl.h>
  44. #endif
  45. #include <linux/delay.h>
  46. #include <linux/notifier.h>
  47. #include <linux/proc_fs.h>
  48. #include <net/sock.h>
  49. #include <net/snmp.h>
  50. #include <net/ipv6.h>
  51. #include <net/protocol.h>
  52. #include <net/ndisc.h>
  53. #include <net/ip6_route.h>
  54. #include <net/addrconf.h>
  55. #include <net/ip.h>
  56. #include <linux/if_tunnel.h>
  57. #include <linux/rtnetlink.h>
  58. #include <asm/uaccess.h>
  59. /* Set to 3 to get tracing... */
  60. #define ACONF_DEBUG 2
  61. #if ACONF_DEBUG >= 3
  62. #define ADBG(x) printk x
  63. #else
  64. #define ADBG(x)
  65. #endif
  66. #ifdef CONFIG_SYSCTL
  67. static void addrconf_sysctl_register(struct inet6_dev *idev, struct ipv6_devconf *p);
  68. static void addrconf_sysctl_unregister(struct ipv6_devconf *p);
  69. #endif
  70. int inet6_dev_count;
  71. int inet6_ifa_count;
  72. /*
  73.  * Configured unicast address hash table
  74.  */
  75. static struct inet6_ifaddr *inet6_addr_lst[IN6_ADDR_HSIZE];
  76. static rwlock_t addrconf_hash_lock = RW_LOCK_UNLOCKED;
  77. /* Protects inet6 devices */
  78. rwlock_t addrconf_lock = RW_LOCK_UNLOCKED;
  79. void addrconf_verify(unsigned long);
  80. static struct timer_list addr_chk_timer = { function: addrconf_verify };
  81. static int addrconf_ifdown(struct net_device *dev, int how);
  82. static void addrconf_dad_start(struct inet6_ifaddr *ifp);
  83. static void addrconf_dad_timer(unsigned long data);
  84. static void addrconf_dad_completed(struct inet6_ifaddr *ifp);
  85. static void addrconf_rs_timer(unsigned long data);
  86. static void ipv6_ifa_notify(int event, struct inet6_ifaddr *ifa);
  87. static struct notifier_block *inet6addr_chain;
  88. struct ipv6_devconf ipv6_devconf =
  89. {
  90. 0, /* forwarding */
  91. IPV6_DEFAULT_HOPLIMIT, /* hop limit */
  92. IPV6_MIN_MTU, /* mtu */
  93. 1, /* accept RAs */
  94. 1, /* accept redirects */
  95. 1, /* autoconfiguration */
  96. 1, /* dad transmits */
  97. MAX_RTR_SOLICITATIONS, /* router solicits */
  98. RTR_SOLICITATION_INTERVAL, /* rtr solicit interval */
  99. MAX_RTR_SOLICITATION_DELAY, /* rtr solicit delay */
  100. };
  101. static struct ipv6_devconf ipv6_devconf_dflt =
  102. {
  103. 0, /* forwarding */
  104. IPV6_DEFAULT_HOPLIMIT, /* hop limit */
  105. IPV6_MIN_MTU, /* mtu */
  106. 1, /* accept RAs */
  107. 1, /* accept redirects */
  108. 1, /* autoconfiguration */
  109. 1, /* dad transmits */
  110. MAX_RTR_SOLICITATIONS, /* router solicits */
  111. RTR_SOLICITATION_INTERVAL, /* rtr solicit interval */
  112. MAX_RTR_SOLICITATION_DELAY, /* rtr solicit delay */
  113. };
  114. int ipv6_addr_type(struct in6_addr *addr)
  115. {
  116. u32 st;
  117. st = addr->s6_addr32[0];
  118. /* Consider all addresses with the first three bits different of
  119.    000 and 111 as unicasts.
  120.  */
  121. if ((st & __constant_htonl(0xE0000000)) != __constant_htonl(0x00000000) &&
  122.     (st & __constant_htonl(0xE0000000)) != __constant_htonl(0xE0000000))
  123. return IPV6_ADDR_UNICAST;
  124. if ((st & __constant_htonl(0xFF000000)) == __constant_htonl(0xFF000000)) {
  125. int type = IPV6_ADDR_MULTICAST;
  126. switch((st & __constant_htonl(0x00FF0000))) {
  127. case __constant_htonl(0x00010000):
  128. type |= IPV6_ADDR_LOOPBACK;
  129. break;
  130. case __constant_htonl(0x00020000):
  131. type |= IPV6_ADDR_LINKLOCAL;
  132. break;
  133. case __constant_htonl(0x00050000):
  134. type |= IPV6_ADDR_SITELOCAL;
  135. break;
  136. };
  137. return type;
  138. }
  139. if ((st & __constant_htonl(0xFFC00000)) == __constant_htonl(0xFE800000))
  140. return (IPV6_ADDR_LINKLOCAL | IPV6_ADDR_UNICAST);
  141. if ((st & __constant_htonl(0xFFC00000)) == __constant_htonl(0xFEC00000))
  142. return (IPV6_ADDR_SITELOCAL | IPV6_ADDR_UNICAST);
  143. if ((addr->s6_addr32[0] | addr->s6_addr32[1]) == 0) {
  144. if (addr->s6_addr32[2] == 0) {
  145. if (addr->in6_u.u6_addr32[3] == 0)
  146. return IPV6_ADDR_ANY;
  147. if (addr->s6_addr32[3] == __constant_htonl(0x00000001))
  148. return (IPV6_ADDR_LOOPBACK | IPV6_ADDR_UNICAST);
  149. return (IPV6_ADDR_COMPATv4 | IPV6_ADDR_UNICAST);
  150. }
  151. if (addr->s6_addr32[2] == __constant_htonl(0x0000ffff))
  152. return IPV6_ADDR_MAPPED;
  153. }
  154. return IPV6_ADDR_RESERVED;
  155. }
  156. static void addrconf_del_timer(struct inet6_ifaddr *ifp)
  157. {
  158. if (del_timer(&ifp->timer))
  159. __in6_ifa_put(ifp);
  160. }
  161. enum addrconf_timer_t
  162. {
  163. AC_NONE,
  164. AC_DAD,
  165. AC_RS,
  166. };
  167. static void addrconf_mod_timer(struct inet6_ifaddr *ifp,
  168.        enum addrconf_timer_t what,
  169.        unsigned long when)
  170. {
  171. if (!del_timer(&ifp->timer))
  172. in6_ifa_hold(ifp);
  173. switch (what) {
  174. case AC_DAD:
  175. ifp->timer.function = addrconf_dad_timer;
  176. break;
  177. case AC_RS:
  178. ifp->timer.function = addrconf_rs_timer;
  179. break;
  180. default:;
  181. }
  182. ifp->timer.expires = jiffies + when;
  183. add_timer(&ifp->timer);
  184. }
  185. /* Nobody refers to this device, we may destroy it. */
  186. void in6_dev_finish_destroy(struct inet6_dev *idev)
  187. {
  188. struct net_device *dev = idev->dev;
  189. BUG_TRAP(idev->addr_list==NULL);
  190. BUG_TRAP(idev->mc_list==NULL);
  191. #ifdef NET_REFCNT_DEBUG
  192. printk(KERN_DEBUG "in6_dev_finish_destroy: %sn", dev ? dev->name : "NIL");
  193. #endif
  194. dev_put(dev);
  195. if (!idev->dead) {
  196. printk("Freeing alive inet6 device %pn", idev);
  197. return;
  198. }
  199. inet6_dev_count--;
  200. kfree(idev);
  201. }
  202. static struct inet6_dev * ipv6_add_dev(struct net_device *dev)
  203. {
  204. struct inet6_dev *ndev;
  205. ASSERT_RTNL();
  206. if (dev->mtu < IPV6_MIN_MTU)
  207. return NULL;
  208. ndev = kmalloc(sizeof(struct inet6_dev), GFP_KERNEL);
  209. if (ndev) {
  210. memset(ndev, 0, sizeof(struct inet6_dev));
  211. ndev->lock = RW_LOCK_UNLOCKED;
  212. ndev->dev = dev;
  213. memcpy(&ndev->cnf, &ipv6_devconf_dflt, sizeof(ndev->cnf));
  214. ndev->cnf.mtu6 = dev->mtu;
  215. ndev->cnf.sysctl = NULL;
  216. ndev->nd_parms = neigh_parms_alloc(dev, &nd_tbl);
  217. if (ndev->nd_parms == NULL) {
  218. kfree(ndev);
  219. return NULL;
  220. }
  221. inet6_dev_count++;
  222. /* We refer to the device */
  223. dev_hold(dev);
  224. write_lock_bh(&addrconf_lock);
  225. dev->ip6_ptr = ndev;
  226. /* One reference from device */
  227. in6_dev_hold(ndev);
  228. write_unlock_bh(&addrconf_lock);
  229. ipv6_mc_init_dev(ndev);
  230. #ifdef CONFIG_SYSCTL
  231. neigh_sysctl_register(dev, ndev->nd_parms, NET_IPV6, NET_IPV6_NEIGH, "ipv6");
  232. addrconf_sysctl_register(ndev, &ndev->cnf);
  233. #endif
  234. }
  235. return ndev;
  236. }
  237. static struct inet6_dev * ipv6_find_idev(struct net_device *dev)
  238. {
  239. struct inet6_dev *idev;
  240. ASSERT_RTNL();
  241. if ((idev = __in6_dev_get(dev)) == NULL) {
  242. if ((idev = ipv6_add_dev(dev)) == NULL)
  243. return NULL;
  244. }
  245. if (dev->flags&IFF_UP)
  246. ipv6_mc_up(idev);
  247. return idev;
  248. }
  249. static void addrconf_forward_change(struct inet6_dev *idev)
  250. {
  251. struct net_device *dev;
  252. if (idev)
  253. return;
  254. read_lock(&dev_base_lock);
  255. for (dev=dev_base; dev; dev=dev->next) {
  256. read_lock(&addrconf_lock);
  257. idev = __in6_dev_get(dev);
  258. if (idev)
  259. idev->cnf.forwarding = ipv6_devconf.forwarding;
  260. read_unlock(&addrconf_lock);
  261. }
  262. read_unlock(&dev_base_lock);
  263. }
  264. /* Nobody refers to this ifaddr, destroy it */
  265. void inet6_ifa_finish_destroy(struct inet6_ifaddr *ifp)
  266. {
  267. BUG_TRAP(ifp->if_next==NULL);
  268. BUG_TRAP(ifp->lst_next==NULL);
  269. #ifdef NET_REFCNT_DEBUG
  270. printk(KERN_DEBUG "inet6_ifa_finish_destroyn");
  271. #endif
  272. in6_dev_put(ifp->idev);
  273. if (del_timer(&ifp->timer))
  274. printk("Timer is still running, when freeing ifa=%pn", ifp);
  275. if (!ifp->dead) {
  276. printk("Freeing alive inet6 address %pn", ifp);
  277. return;
  278. }
  279. inet6_ifa_count--;
  280. kfree(ifp);
  281. }
  282. /* On success it returns ifp with increased reference count */
  283. static struct inet6_ifaddr *
  284. ipv6_add_addr(struct inet6_dev *idev, struct in6_addr *addr, int pfxlen,
  285.       int scope, unsigned flags)
  286. {
  287. struct inet6_ifaddr *ifa;
  288. int hash;
  289. ifa = kmalloc(sizeof(struct inet6_ifaddr), GFP_ATOMIC);
  290. if (ifa == NULL) {
  291. ADBG(("ipv6_add_addr: malloc failedn"));
  292. return NULL;
  293. }
  294. memset(ifa, 0, sizeof(struct inet6_ifaddr));
  295. ipv6_addr_copy(&ifa->addr, addr);
  296. spin_lock_init(&ifa->lock);
  297. init_timer(&ifa->timer);
  298. ifa->timer.data = (unsigned long) ifa;
  299. ifa->scope = scope;
  300. ifa->prefix_len = pfxlen;
  301. ifa->flags = flags | IFA_F_TENTATIVE;
  302. read_lock(&addrconf_lock);
  303. if (idev->dead) {
  304. read_unlock(&addrconf_lock);
  305. kfree(ifa);
  306. return NULL;
  307. }
  308. inet6_ifa_count++;
  309. ifa->idev = idev;
  310. in6_dev_hold(idev);
  311. /* For caller */
  312. in6_ifa_hold(ifa);
  313. /* Add to big hash table */
  314. hash = ipv6_addr_hash(addr);
  315. write_lock_bh(&addrconf_hash_lock);
  316. ifa->lst_next = inet6_addr_lst[hash];
  317. inet6_addr_lst[hash] = ifa;
  318. in6_ifa_hold(ifa);
  319. write_unlock_bh(&addrconf_hash_lock);
  320. write_lock_bh(&idev->lock);
  321. /* Add to inet6_dev unicast addr list. */
  322. ifa->if_next = idev->addr_list;
  323. idev->addr_list = ifa;
  324. in6_ifa_hold(ifa);
  325. write_unlock_bh(&idev->lock);
  326. read_unlock(&addrconf_lock);
  327. notifier_call_chain(&inet6addr_chain,NETDEV_UP,ifa);
  328. return ifa;
  329. }
  330. /* This function wants to get referenced ifp and releases it before return */
  331. static void ipv6_del_addr(struct inet6_ifaddr *ifp)
  332. {
  333. struct inet6_ifaddr *ifa, **ifap;
  334. struct inet6_dev *idev = ifp->idev;
  335. int hash;
  336. hash = ipv6_addr_hash(&ifp->addr);
  337. ifp->dead = 1;
  338. write_lock_bh(&addrconf_hash_lock);
  339. for (ifap = &inet6_addr_lst[hash]; (ifa=*ifap) != NULL;
  340.      ifap = &ifa->lst_next) {
  341. if (ifa == ifp) {
  342. *ifap = ifa->lst_next;
  343. __in6_ifa_put(ifp);
  344. ifa->lst_next = NULL;
  345. break;
  346. }
  347. }
  348. write_unlock_bh(&addrconf_hash_lock);
  349. write_lock_bh(&idev->lock);
  350. for (ifap = &idev->addr_list; (ifa=*ifap) != NULL;
  351.      ifap = &ifa->if_next) {
  352. if (ifa == ifp) {
  353. *ifap = ifa->if_next;
  354. __in6_ifa_put(ifp);
  355. ifa->if_next = NULL;
  356. break;
  357. }
  358. }
  359. write_unlock_bh(&idev->lock);
  360. ipv6_ifa_notify(RTM_DELADDR, ifp);
  361. notifier_call_chain(&inet6addr_chain,NETDEV_DOWN,ifp);
  362. addrconf_del_timer(ifp);
  363. in6_ifa_put(ifp);
  364. }
  365. /*
  366.  * Choose an apropriate source address
  367.  * should do:
  368.  * i) get an address with an apropriate scope
  369.  * ii) see if there is a specific route for the destination and use
  370.  * an address of the attached interface 
  371.  * iii) don't use deprecated addresses
  372.  */
  373. int ipv6_get_saddr(struct dst_entry *dst,
  374.    struct in6_addr *daddr, struct in6_addr *saddr)
  375. {
  376. int scope;
  377. struct inet6_ifaddr *ifp = NULL;
  378. struct inet6_ifaddr *match = NULL;
  379. struct net_device *dev = NULL;
  380. struct inet6_dev *idev;
  381. struct rt6_info *rt;
  382. int err;
  383. rt = (struct rt6_info *) dst;
  384. if (rt)
  385. dev = rt->rt6i_dev;
  386. scope = ipv6_addr_scope(daddr);
  387. if (rt && (rt->rt6i_flags & RTF_ALLONLINK)) {
  388. /*
  389.  * route for the "all destinations on link" rule
  390.  * when no routers are present
  391.  */
  392. scope = IFA_LINK;
  393. }
  394. /*
  395.  * known dev
  396.  * search dev and walk through dev addresses
  397.  */
  398. if (dev) {
  399. if (dev->flags & IFF_LOOPBACK)
  400. scope = IFA_HOST;
  401. read_lock(&addrconf_lock);
  402. idev = __in6_dev_get(dev);
  403. if (idev) {
  404. read_lock_bh(&idev->lock);
  405. for (ifp=idev->addr_list; ifp; ifp=ifp->if_next) {
  406. if (ifp->scope == scope) {
  407. if (!(ifp->flags & (IFA_F_DEPRECATED|IFA_F_TENTATIVE))) {
  408. in6_ifa_hold(ifp);
  409. read_unlock_bh(&idev->lock);
  410. read_unlock(&addrconf_lock);
  411. goto out;
  412. }
  413. if (!match && !(ifp->flags & IFA_F_TENTATIVE)) {
  414. match = ifp;
  415. in6_ifa_hold(ifp);
  416. }
  417. }
  418. }
  419. read_unlock_bh(&idev->lock);
  420. }
  421. read_unlock(&addrconf_lock);
  422. }
  423. if (scope == IFA_LINK)
  424. goto out;
  425. /*
  426.  * dev == NULL or search failed for specified dev
  427.  */
  428. read_lock(&dev_base_lock);
  429. read_lock(&addrconf_lock);
  430. for (dev = dev_base; dev; dev=dev->next) {
  431. idev = __in6_dev_get(dev);
  432. if (idev) {
  433. read_lock_bh(&idev->lock);
  434. for (ifp=idev->addr_list; ifp; ifp=ifp->if_next) {
  435. if (ifp->scope == scope) {
  436. if (!(ifp->flags&(IFA_F_DEPRECATED|IFA_F_TENTATIVE))) {
  437. in6_ifa_hold(ifp);
  438. read_unlock_bh(&idev->lock);
  439. goto out_unlock_base;
  440. }
  441. if (!match && !(ifp->flags&IFA_F_TENTATIVE)) {
  442. match = ifp;
  443. in6_ifa_hold(ifp);
  444. }
  445. }
  446. }
  447. read_unlock_bh(&idev->lock);
  448. }
  449. }
  450. out_unlock_base:
  451. read_unlock(&addrconf_lock);
  452. read_unlock(&dev_base_lock);
  453. out:
  454. if (ifp == NULL) {
  455. ifp = match;
  456. match = NULL;
  457. }
  458. err = -EADDRNOTAVAIL;
  459. if (ifp) {
  460. ipv6_addr_copy(saddr, &ifp->addr);
  461. err = 0;
  462. in6_ifa_put(ifp);
  463. }
  464. if (match)
  465. in6_ifa_put(match);
  466. return err;
  467. }
  468. int ipv6_get_lladdr(struct net_device *dev, struct in6_addr *addr)
  469. {
  470. struct inet6_dev *idev;
  471. int err = -EADDRNOTAVAIL;
  472. read_lock(&addrconf_lock);
  473. if ((idev = __in6_dev_get(dev)) != NULL) {
  474. struct inet6_ifaddr *ifp;
  475. read_lock_bh(&idev->lock);
  476. for (ifp=idev->addr_list; ifp; ifp=ifp->if_next) {
  477. if (ifp->scope == IFA_LINK && !(ifp->flags&IFA_F_TENTATIVE)) {
  478. ipv6_addr_copy(addr, &ifp->addr);
  479. err = 0;
  480. break;
  481. }
  482. }
  483. read_unlock_bh(&idev->lock);
  484. }
  485. read_unlock(&addrconf_lock);
  486. return err;
  487. }
  488. int ipv6_chk_addr(struct in6_addr *addr, struct net_device *dev)
  489. {
  490. struct inet6_ifaddr * ifp;
  491. u8 hash = ipv6_addr_hash(addr);
  492. read_lock_bh(&addrconf_hash_lock);
  493. for(ifp = inet6_addr_lst[hash]; ifp; ifp=ifp->lst_next) {
  494. if (ipv6_addr_cmp(&ifp->addr, addr) == 0 &&
  495.     !(ifp->flags&IFA_F_TENTATIVE)) {
  496. if (dev == NULL || ifp->idev->dev == dev ||
  497.     !(ifp->scope&(IFA_LINK|IFA_HOST)))
  498. break;
  499. }
  500. }
  501. read_unlock_bh(&addrconf_hash_lock);
  502. return ifp != NULL;
  503. }
  504. struct inet6_ifaddr * ipv6_get_ifaddr(struct in6_addr *addr, struct net_device *dev)
  505. {
  506. struct inet6_ifaddr * ifp;
  507. u8 hash = ipv6_addr_hash(addr);
  508. read_lock_bh(&addrconf_hash_lock);
  509. for(ifp = inet6_addr_lst[hash]; ifp; ifp=ifp->lst_next) {
  510. if (ipv6_addr_cmp(&ifp->addr, addr) == 0) {
  511. if (dev == NULL || ifp->idev->dev == dev ||
  512.     !(ifp->scope&(IFA_LINK|IFA_HOST))) {
  513. in6_ifa_hold(ifp);
  514. break;
  515. }
  516. }
  517. }
  518. read_unlock_bh(&addrconf_hash_lock);
  519. return ifp;
  520. }
  521. /* Gets referenced address, destroys ifaddr */
  522. void addrconf_dad_failure(struct inet6_ifaddr *ifp)
  523. {
  524. if (net_ratelimit())
  525. printk(KERN_INFO "%s: duplicate address detected!n", ifp->idev->dev->name);
  526. if (ifp->flags&IFA_F_PERMANENT) {
  527. spin_lock_bh(&ifp->lock);
  528. addrconf_del_timer(ifp);
  529. ifp->flags |= IFA_F_TENTATIVE;
  530. spin_unlock_bh(&ifp->lock);
  531. in6_ifa_put(ifp);
  532. } else
  533. ipv6_del_addr(ifp);
  534. }
  535. /* Join to solicited addr multicast group. */
  536. static void addrconf_join_solict(struct net_device *dev, struct in6_addr *addr)
  537. {
  538. struct in6_addr maddr;
  539. if (dev->flags&(IFF_LOOPBACK|IFF_NOARP))
  540. return;
  541. addrconf_addr_solict_mult(addr, &maddr);
  542. ipv6_dev_mc_inc(dev, &maddr);
  543. }
  544. static void addrconf_leave_solict(struct net_device *dev, struct in6_addr *addr)
  545. {
  546. struct in6_addr maddr;
  547. if (dev->flags&(IFF_LOOPBACK|IFF_NOARP))
  548. return;
  549. addrconf_addr_solict_mult(addr, &maddr);
  550. ipv6_dev_mc_dec(dev, &maddr);
  551. }
  552. static int ipv6_generate_eui64(u8 *eui, struct net_device *dev)
  553. {
  554. switch (dev->type) {
  555. case ARPHRD_ETHER:
  556. case ARPHRD_FDDI:
  557. case ARPHRD_IEEE802_TR:
  558. if (dev->addr_len != ETH_ALEN)
  559. return -1;
  560. memcpy(eui, dev->dev_addr, 3);
  561. memcpy(eui + 5, dev->dev_addr+3, 3);
  562. eui[3] = 0xFF;
  563. eui[4] = 0xFE;
  564. eui[0] ^= 2;
  565. return 0;
  566. }
  567. return -1;
  568. }
  569. static int ipv6_inherit_eui64(u8 *eui, struct inet6_dev *idev)
  570. {
  571. int err = -1;
  572. struct inet6_ifaddr *ifp;
  573. read_lock_bh(&idev->lock);
  574. for (ifp=idev->addr_list; ifp; ifp=ifp->if_next) {
  575. if (ifp->scope == IFA_LINK && !(ifp->flags&IFA_F_TENTATIVE)) {
  576. memcpy(eui, ifp->addr.s6_addr+8, 8);
  577. err = 0;
  578. break;
  579. }
  580. }
  581. read_unlock_bh(&idev->lock);
  582. return err;
  583. }
  584. /*
  585.  * Add prefix route.
  586.  */
  587. static void
  588. addrconf_prefix_route(struct in6_addr *pfx, int plen, struct net_device *dev,
  589.       unsigned long expires, unsigned flags)
  590. {
  591. struct in6_rtmsg rtmsg;
  592. memset(&rtmsg, 0, sizeof(rtmsg));
  593. memcpy(&rtmsg.rtmsg_dst, pfx, sizeof(struct in6_addr));
  594. rtmsg.rtmsg_dst_len = plen;
  595. rtmsg.rtmsg_metric = IP6_RT_PRIO_ADDRCONF;
  596. rtmsg.rtmsg_ifindex = dev->ifindex;
  597. rtmsg.rtmsg_info = expires;
  598. rtmsg.rtmsg_flags = RTF_UP|flags;
  599. rtmsg.rtmsg_type = RTMSG_NEWROUTE;
  600. /* Prevent useless cloning on PtP SIT.
  601.    This thing is done here expecting that the whole
  602.    class of non-broadcast devices need not cloning.
  603.  */
  604. if (dev->type == ARPHRD_SIT && (dev->flags&IFF_POINTOPOINT))
  605. rtmsg.rtmsg_flags |= RTF_NONEXTHOP;
  606. ip6_route_add(&rtmsg);
  607. }
  608. /* Create "default" multicast route to the interface */
  609. static void addrconf_add_mroute(struct net_device *dev)
  610. {
  611. struct in6_rtmsg rtmsg;
  612. memset(&rtmsg, 0, sizeof(rtmsg));
  613. ipv6_addr_set(&rtmsg.rtmsg_dst,
  614.       __constant_htonl(0xFF000000), 0, 0, 0);
  615. rtmsg.rtmsg_dst_len = 8;
  616. rtmsg.rtmsg_metric = IP6_RT_PRIO_ADDRCONF;
  617. rtmsg.rtmsg_ifindex = dev->ifindex;
  618. rtmsg.rtmsg_flags = RTF_UP|RTF_ADDRCONF;
  619. rtmsg.rtmsg_type = RTMSG_NEWROUTE;
  620. ip6_route_add(&rtmsg);
  621. }
  622. static void sit_route_add(struct net_device *dev)
  623. {
  624. struct in6_rtmsg rtmsg;
  625. memset(&rtmsg, 0, sizeof(rtmsg));
  626. rtmsg.rtmsg_type = RTMSG_NEWROUTE;
  627. rtmsg.rtmsg_metric = IP6_RT_PRIO_ADDRCONF;
  628. /* prefix length - 96 bytes "::d.d.d.d" */
  629. rtmsg.rtmsg_dst_len = 96;
  630. rtmsg.rtmsg_flags = RTF_UP|RTF_NONEXTHOP;
  631. rtmsg.rtmsg_ifindex = dev->ifindex;
  632. ip6_route_add(&rtmsg);
  633. }
  634. static void addrconf_add_lroute(struct net_device *dev)
  635. {
  636. struct in6_addr addr;
  637. ipv6_addr_set(&addr,  __constant_htonl(0xFE800000), 0, 0, 0);
  638. addrconf_prefix_route(&addr, 10, dev, 0, RTF_ADDRCONF);
  639. }
  640. static struct inet6_dev *addrconf_add_dev(struct net_device *dev)
  641. {
  642. struct inet6_dev *idev;
  643. ASSERT_RTNL();
  644. if ((idev = ipv6_find_idev(dev)) == NULL)
  645. return NULL;
  646. /* Add default multicast route */
  647. addrconf_add_mroute(dev);
  648. /* Add link local route */
  649. addrconf_add_lroute(dev);
  650. return idev;
  651. }
  652. void addrconf_prefix_rcv(struct net_device *dev, u8 *opt, int len)
  653. {
  654. struct prefix_info *pinfo;
  655. struct rt6_info *rt;
  656. __u32 valid_lft;
  657. __u32 prefered_lft;
  658. int addr_type;
  659. unsigned long rt_expires;
  660. struct inet6_dev *in6_dev;
  661. pinfo = (struct prefix_info *) opt;
  662. if (len < sizeof(struct prefix_info)) {
  663. ADBG(("addrconf: prefix option too shortn"));
  664. return;
  665. }
  666. /*
  667.  * Validation checks ([ADDRCONF], page 19)
  668.  */
  669. addr_type = ipv6_addr_type(&pinfo->prefix);
  670. if (addr_type & (IPV6_ADDR_MULTICAST|IPV6_ADDR_LINKLOCAL))
  671. return;
  672. valid_lft = ntohl(pinfo->valid);
  673. prefered_lft = ntohl(pinfo->prefered);
  674. if (prefered_lft > valid_lft) {
  675. if (net_ratelimit())
  676. printk(KERN_WARNING "addrconf: prefix option has invalid lifetimen");
  677. return;
  678. }
  679. in6_dev = in6_dev_get(dev);
  680. if (in6_dev == NULL) {
  681. if (net_ratelimit())
  682. printk(KERN_DEBUG "addrconf: device %s not configuredn", dev->name);
  683. return;
  684. }
  685. /*
  686.  * Two things going on here:
  687.  * 1) Add routes for on-link prefixes
  688.  * 2) Configure prefixes with the auto flag set
  689.  */
  690. /* Avoid arithemtic overflow. Really, we could
  691.    save rt_expires in seconds, likely valid_lft,
  692.    but it would require division in fib gc, that it
  693.    not good.
  694.  */
  695. if (valid_lft >= 0x7FFFFFFF/HZ)
  696. rt_expires = 0;
  697. else
  698. rt_expires = jiffies + valid_lft * HZ;
  699. rt = rt6_lookup(&pinfo->prefix, NULL, dev->ifindex, 1);
  700. if (rt && ((rt->rt6i_flags & (RTF_GATEWAY | RTF_DEFAULT)) == 0)) {
  701. if (rt->rt6i_flags&RTF_EXPIRES) {
  702. if (pinfo->onlink == 0 || valid_lft == 0) {
  703. ip6_del_rt(rt);
  704. rt = NULL;
  705. } else {
  706. rt->rt6i_expires = rt_expires;
  707. }
  708. }
  709. } else if (pinfo->onlink && valid_lft) {
  710. addrconf_prefix_route(&pinfo->prefix, pinfo->prefix_len,
  711.       dev, rt_expires, RTF_ADDRCONF|RTF_EXPIRES);
  712. }
  713. if (rt)
  714. dst_release(&rt->u.dst);
  715. /* Try to figure out our local address for this prefix */
  716. if (pinfo->autoconf && in6_dev->cnf.autoconf) {
  717. struct inet6_ifaddr * ifp;
  718. struct in6_addr addr;
  719. int plen;
  720. plen = pinfo->prefix_len >> 3;
  721. if (pinfo->prefix_len == 64) {
  722. memcpy(&addr, &pinfo->prefix, 8);
  723. if (ipv6_generate_eui64(addr.s6_addr + 8, dev) &&
  724.     ipv6_inherit_eui64(addr.s6_addr + 8, in6_dev)) {
  725. in6_dev_put(in6_dev);
  726. return;
  727. }
  728. goto ok;
  729. }
  730. if (net_ratelimit())
  731. printk(KERN_DEBUG "IPv6 addrconf: prefix with wrong length %dn",
  732.        pinfo->prefix_len);
  733. in6_dev_put(in6_dev);
  734. return;
  735. ok:
  736. ifp = ipv6_get_ifaddr(&addr, dev);
  737. if (ifp == NULL && valid_lft) {
  738. ifp = ipv6_add_addr(in6_dev, &addr, pinfo->prefix_len,
  739.     addr_type&IPV6_ADDR_SCOPE_MASK, 0);
  740. if (ifp == NULL) {
  741. in6_dev_put(in6_dev);
  742. return;
  743. }
  744. addrconf_dad_start(ifp);
  745. }
  746. if (ifp && valid_lft == 0) {
  747. ipv6_del_addr(ifp);
  748. ifp = NULL;
  749. }
  750. if (ifp) {
  751. int flags;
  752. spin_lock(&ifp->lock);
  753. ifp->valid_lft = valid_lft;
  754. ifp->prefered_lft = prefered_lft;
  755. ifp->tstamp = jiffies;
  756. flags = ifp->flags;
  757. ifp->flags &= ~IFA_F_DEPRECATED;
  758. spin_unlock(&ifp->lock);
  759. if (!(flags&IFA_F_TENTATIVE))
  760. ipv6_ifa_notify((flags&IFA_F_DEPRECATED) ?
  761. 0 : RTM_NEWADDR, ifp);
  762. in6_ifa_put(ifp);
  763. }
  764. }
  765. in6_dev_put(in6_dev);
  766. }
  767. /*
  768.  * Set destination address.
  769.  * Special case for SIT interfaces where we create a new "virtual"
  770.  * device.
  771.  */
  772. int addrconf_set_dstaddr(void *arg)
  773. {
  774. struct in6_ifreq ireq;
  775. struct net_device *dev;
  776. int err = -EINVAL;
  777. rtnl_lock();
  778. err = -EFAULT;
  779. if (copy_from_user(&ireq, arg, sizeof(struct in6_ifreq)))
  780. goto err_exit;
  781. dev = __dev_get_by_index(ireq.ifr6_ifindex);
  782. err = -ENODEV;
  783. if (dev == NULL)
  784. goto err_exit;
  785. if (dev->type == ARPHRD_SIT) {
  786. struct ifreq ifr;
  787. mm_segment_t oldfs;
  788. struct ip_tunnel_parm p;
  789. err = -EADDRNOTAVAIL;
  790. if (!(ipv6_addr_type(&ireq.ifr6_addr) & IPV6_ADDR_COMPATv4))
  791. goto err_exit;
  792. memset(&p, 0, sizeof(p));
  793. p.iph.daddr = ireq.ifr6_addr.s6_addr32[3];
  794. p.iph.saddr = 0;
  795. p.iph.version = 4;
  796. p.iph.ihl = 5;
  797. p.iph.protocol = IPPROTO_IPV6;
  798. p.iph.ttl = 64;
  799. ifr.ifr_ifru.ifru_data = (void*)&p;
  800. oldfs = get_fs(); set_fs(KERNEL_DS);
  801. err = dev->do_ioctl(dev, &ifr, SIOCADDTUNNEL);
  802. set_fs(oldfs);
  803. if (err == 0) {
  804. err = -ENOBUFS;
  805. if ((dev = __dev_get_by_name(p.name)) == NULL)
  806. goto err_exit;
  807. err = dev_open(dev);
  808. }
  809. }
  810. err_exit:
  811. rtnl_unlock();
  812. return err;
  813. }
  814. /*
  815.  * Manual configuration of address on an interface
  816.  */
  817. static int inet6_addr_add(int ifindex, struct in6_addr *pfx, int plen)
  818. {
  819. struct inet6_ifaddr *ifp;
  820. struct inet6_dev *idev;
  821. struct net_device *dev;
  822. int scope;
  823. ASSERT_RTNL();
  824. if ((dev = __dev_get_by_index(ifindex)) == NULL)
  825. return -ENODEV;
  826. if (!(dev->flags&IFF_UP))
  827. return -ENETDOWN;
  828. if ((idev = addrconf_add_dev(dev)) == NULL)
  829. return -ENOBUFS;
  830. scope = ipv6_addr_scope(pfx);
  831. if ((ifp = ipv6_add_addr(idev, pfx, plen, scope, IFA_F_PERMANENT)) != NULL) {
  832. addrconf_dad_start(ifp);
  833. in6_ifa_put(ifp);
  834. return 0;
  835. }
  836. return -ENOBUFS;
  837. }
  838. static int inet6_addr_del(int ifindex, struct in6_addr *pfx, int plen)
  839. {
  840. struct inet6_ifaddr *ifp;
  841. struct inet6_dev *idev;
  842. struct net_device *dev;
  843. if ((dev = __dev_get_by_index(ifindex)) == NULL)
  844. return -ENODEV;
  845. if ((idev = __in6_dev_get(dev)) == NULL)
  846. return -ENXIO;
  847. read_lock_bh(&idev->lock);
  848. for (ifp = idev->addr_list; ifp; ifp=ifp->if_next) {
  849. if (ifp->prefix_len == plen &&
  850.     (!memcmp(pfx, &ifp->addr, sizeof(struct in6_addr)))) {
  851. in6_ifa_hold(ifp);
  852. read_unlock_bh(&idev->lock);
  853. ipv6_del_addr(ifp);
  854. /* If the last address is deleted administratively,
  855.    disable IPv6 on this interface.
  856.  */
  857. if (idev->addr_list == NULL)
  858. addrconf_ifdown(idev->dev, 1);
  859. return 0;
  860. }
  861. }
  862. read_unlock_bh(&idev->lock);
  863. return -EADDRNOTAVAIL;
  864. }
  865. int addrconf_add_ifaddr(void *arg)
  866. {
  867. struct in6_ifreq ireq;
  868. int err;
  869. if (!capable(CAP_NET_ADMIN))
  870. return -EPERM;
  871. if (copy_from_user(&ireq, arg, sizeof(struct in6_ifreq)))
  872. return -EFAULT;
  873. rtnl_lock();
  874. err = inet6_addr_add(ireq.ifr6_ifindex, &ireq.ifr6_addr, ireq.ifr6_prefixlen);
  875. rtnl_unlock();
  876. return err;
  877. }
  878. int addrconf_del_ifaddr(void *arg)
  879. {
  880. struct in6_ifreq ireq;
  881. int err;
  882. if (!capable(CAP_NET_ADMIN))
  883. return -EPERM;
  884. if (copy_from_user(&ireq, arg, sizeof(struct in6_ifreq)))
  885. return -EFAULT;
  886. rtnl_lock();
  887. err = inet6_addr_del(ireq.ifr6_ifindex, &ireq.ifr6_addr, ireq.ifr6_prefixlen);
  888. rtnl_unlock();
  889. return err;
  890. }
  891. static void sit_add_v4_addrs(struct inet6_dev *idev)
  892. {
  893. struct inet6_ifaddr * ifp;
  894. struct in6_addr addr;
  895. struct net_device *dev;
  896. int scope;
  897. ASSERT_RTNL();
  898. memset(&addr, 0, sizeof(struct in6_addr));
  899. memcpy(&addr.s6_addr32[3], idev->dev->dev_addr, 4);
  900. if (idev->dev->flags&IFF_POINTOPOINT) {
  901. addr.s6_addr32[0] = __constant_htonl(0xfe800000);
  902. scope = IFA_LINK;
  903. } else {
  904. scope = IPV6_ADDR_COMPATv4;
  905. }
  906. if (addr.s6_addr32[3]) {
  907. ifp = ipv6_add_addr(idev, &addr, 128, scope, IFA_F_PERMANENT);
  908. if (ifp) {
  909. spin_lock_bh(&ifp->lock);
  910. ifp->flags &= ~IFA_F_TENTATIVE;
  911. spin_unlock_bh(&ifp->lock);
  912. ipv6_ifa_notify(RTM_NEWADDR, ifp);
  913. in6_ifa_put(ifp);
  914. }
  915. return;
  916. }
  917.         for (dev = dev_base; dev != NULL; dev = dev->next) {
  918. struct in_device * in_dev = __in_dev_get(dev);
  919. if (in_dev && (dev->flags & IFF_UP)) {
  920. struct in_ifaddr * ifa;
  921. int flag = scope;
  922. for (ifa = in_dev->ifa_list; ifa; ifa = ifa->ifa_next) {
  923. int plen;
  924. addr.s6_addr32[3] = ifa->ifa_local;
  925. if (ifa->ifa_scope == RT_SCOPE_LINK)
  926. continue;
  927. if (ifa->ifa_scope >= RT_SCOPE_HOST) {
  928. if (idev->dev->flags&IFF_POINTOPOINT)
  929. continue;
  930. flag |= IFA_HOST;
  931. }
  932. if (idev->dev->flags&IFF_POINTOPOINT)
  933. plen = 10;
  934. else
  935. plen = 96;
  936. ifp = ipv6_add_addr(idev, &addr, plen, flag,
  937.     IFA_F_PERMANENT);
  938. if (ifp) {
  939. spin_lock_bh(&ifp->lock);
  940. ifp->flags &= ~IFA_F_TENTATIVE;
  941. spin_unlock_bh(&ifp->lock);
  942. ipv6_ifa_notify(RTM_NEWADDR, ifp);
  943. in6_ifa_put(ifp);
  944. }
  945. }
  946. }
  947.         }
  948. }
  949. static void init_loopback(struct net_device *dev)
  950. {
  951. struct in6_addr addr;
  952. struct inet6_dev  *idev;
  953. struct inet6_ifaddr * ifp;
  954. /* ::1 */
  955. ASSERT_RTNL();
  956. memset(&addr, 0, sizeof(struct in6_addr));
  957. addr.s6_addr[15] = 1;
  958. if ((idev = ipv6_find_idev(dev)) == NULL) {
  959. printk(KERN_DEBUG "init loopback: add_dev failedn");
  960. return;
  961. }
  962. ifp = ipv6_add_addr(idev, &addr, 128, IFA_HOST, IFA_F_PERMANENT);
  963. if (ifp) {
  964. spin_lock_bh(&ifp->lock);
  965. ifp->flags &= ~IFA_F_TENTATIVE;
  966. spin_unlock_bh(&ifp->lock);
  967. ipv6_ifa_notify(RTM_NEWADDR, ifp);
  968. in6_ifa_put(ifp);
  969. }
  970. }
  971. static void addrconf_add_linklocal(struct inet6_dev *idev, struct in6_addr *addr)
  972. {
  973. struct inet6_ifaddr * ifp;
  974. ifp = ipv6_add_addr(idev, addr, 10, IFA_LINK, IFA_F_PERMANENT);
  975. if (ifp) {
  976. addrconf_dad_start(ifp);
  977. in6_ifa_put(ifp);
  978. }
  979. }
  980. static void addrconf_dev_config(struct net_device *dev)
  981. {
  982. struct in6_addr addr;
  983. struct inet6_dev    * idev;
  984. ASSERT_RTNL();
  985. if ((dev->type != ARPHRD_ETHER) && 
  986.     (dev->type != ARPHRD_FDDI) &&
  987.     (dev->type != ARPHRD_IEEE802_TR)) {
  988. /* Alas, we support only Ethernet autoconfiguration. */
  989. return;
  990. }
  991. idev = addrconf_add_dev(dev);
  992. if (idev == NULL)
  993. return;
  994. memset(&addr, 0, sizeof(struct in6_addr));
  995. addr.s6_addr[0] = 0xFE;
  996. addr.s6_addr[1] = 0x80;
  997. if (ipv6_generate_eui64(addr.s6_addr + 8, dev) == 0)
  998. addrconf_add_linklocal(idev, &addr);
  999. }
  1000. static void addrconf_sit_config(struct net_device *dev)
  1001. {
  1002. struct inet6_dev *idev;
  1003. ASSERT_RTNL();
  1004. /* 
  1005.  * Configure the tunnel with one of our IPv4 
  1006.  * addresses... we should configure all of 
  1007.  * our v4 addrs in the tunnel
  1008.  */
  1009. if ((idev = ipv6_find_idev(dev)) == NULL) {
  1010. printk(KERN_DEBUG "init sit: add_dev failedn");
  1011. return;
  1012. }
  1013. sit_add_v4_addrs(idev);
  1014. if (dev->flags&IFF_POINTOPOINT) {
  1015. addrconf_add_mroute(dev);
  1016. addrconf_add_lroute(dev);
  1017. } else
  1018. sit_route_add(dev);
  1019. }
  1020. int addrconf_notify(struct notifier_block *this, unsigned long event, 
  1021.     void * data)
  1022. {
  1023. struct net_device *dev;
  1024. dev = (struct net_device *) data;
  1025. switch(event) {
  1026. case NETDEV_UP:
  1027. switch(dev->type) {
  1028. case ARPHRD_SIT:
  1029. addrconf_sit_config(dev);
  1030. break;
  1031. case ARPHRD_LOOPBACK:
  1032. init_loopback(dev);
  1033. break;
  1034. default:
  1035. addrconf_dev_config(dev);
  1036. break;
  1037. };
  1038. break;
  1039. case NETDEV_CHANGEMTU:
  1040. if (dev->mtu >= IPV6_MIN_MTU) {
  1041. struct inet6_dev *idev;
  1042. if ((idev = __in6_dev_get(dev)) == NULL)
  1043. break;
  1044. idev->cnf.mtu6 = dev->mtu;
  1045. rt6_mtu_change(dev, dev->mtu);
  1046. break;
  1047. }
  1048. /* MTU falled under IPV6_MIN_MTU. Stop IPv6 on this interface. */
  1049. case NETDEV_DOWN:
  1050. case NETDEV_UNREGISTER:
  1051. /*
  1052.  * Remove all addresses from this interface.
  1053.  */
  1054. addrconf_ifdown(dev, event != NETDEV_DOWN);
  1055. break;
  1056. case NETDEV_CHANGE:
  1057. break;
  1058. };
  1059. return NOTIFY_OK;
  1060. }
  1061. static int addrconf_ifdown(struct net_device *dev, int how)
  1062. {
  1063. struct inet6_dev *idev;
  1064. struct inet6_ifaddr *ifa, **bifa;
  1065. int i;
  1066. ASSERT_RTNL();
  1067. rt6_ifdown(dev);
  1068. neigh_ifdown(&nd_tbl, dev);
  1069. idev = __in6_dev_get(dev);
  1070. if (idev == NULL)
  1071. return -ENODEV;
  1072. /* Step 1: remove reference to ipv6 device from parent device.
  1073.            Do not dev_put!
  1074.  */
  1075. if (how == 1) {
  1076. write_lock_bh(&addrconf_lock);
  1077. dev->ip6_ptr = NULL;
  1078. idev->dead = 1;
  1079. write_unlock_bh(&addrconf_lock);
  1080. }
  1081. /* Step 2: clear hash table */
  1082. for (i=0; i<IN6_ADDR_HSIZE; i++) {
  1083. bifa = &inet6_addr_lst[i];
  1084. write_lock_bh(&addrconf_hash_lock);
  1085. while ((ifa = *bifa) != NULL) {
  1086. if (ifa->idev == idev) {
  1087. *bifa = ifa->lst_next;
  1088. ifa->lst_next = NULL;
  1089. addrconf_del_timer(ifa);
  1090. in6_ifa_put(ifa);
  1091. continue;
  1092. }
  1093. bifa = &ifa->lst_next;
  1094. }
  1095. write_unlock_bh(&addrconf_hash_lock);
  1096. }
  1097. /* Step 3: clear address list */
  1098. write_lock_bh(&idev->lock);
  1099. while ((ifa = idev->addr_list) != NULL) {
  1100. idev->addr_list = ifa->if_next;
  1101. ifa->if_next = NULL;
  1102. ifa->dead = 1;
  1103. addrconf_del_timer(ifa);
  1104. write_unlock_bh(&idev->lock);
  1105. ipv6_ifa_notify(RTM_DELADDR, ifa);
  1106. in6_ifa_put(ifa);
  1107. write_lock_bh(&idev->lock);
  1108. }
  1109. write_unlock_bh(&idev->lock);
  1110. /* Step 4: Discard multicast list */
  1111. if (how == 1)
  1112. ipv6_mc_destroy_dev(idev);
  1113. else
  1114. ipv6_mc_down(idev);
  1115. /* Shot the device (if unregistered) */
  1116. if (how == 1) {
  1117. neigh_parms_release(&nd_tbl, idev->nd_parms);
  1118. #ifdef CONFIG_SYSCTL
  1119. addrconf_sysctl_unregister(&idev->cnf);
  1120. #endif
  1121. in6_dev_put(idev);
  1122. }
  1123. return 0;
  1124. }
  1125. static void addrconf_rs_timer(unsigned long data)
  1126. {
  1127. struct inet6_ifaddr *ifp = (struct inet6_ifaddr *) data;
  1128. if (ifp->idev->cnf.forwarding)
  1129. goto out;
  1130. if (ifp->idev->if_flags & IF_RA_RCVD) {
  1131. /*
  1132.  * Announcement received after solicitation
  1133.  * was sent
  1134.  */
  1135. goto out;
  1136. }
  1137. spin_lock(&ifp->lock);
  1138. if (ifp->probes++ < ifp->idev->cnf.rtr_solicits) {
  1139. struct in6_addr all_routers;
  1140. /* The wait after the last probe can be shorter */
  1141. addrconf_mod_timer(ifp, AC_RS,
  1142.    (ifp->probes == ifp->idev->cnf.rtr_solicits) ?
  1143.    ifp->idev->cnf.rtr_solicit_delay :
  1144.    ifp->idev->cnf.rtr_solicit_interval);
  1145. spin_unlock(&ifp->lock);
  1146. ipv6_addr_all_routers(&all_routers);
  1147. ndisc_send_rs(ifp->idev->dev, &ifp->addr, &all_routers);
  1148. } else {
  1149. struct in6_rtmsg rtmsg;
  1150. spin_unlock(&ifp->lock);
  1151. printk(KERN_DEBUG "%s: no IPv6 routers presentn",
  1152.        ifp->idev->dev->name);
  1153. memset(&rtmsg, 0, sizeof(struct in6_rtmsg));
  1154. rtmsg.rtmsg_type = RTMSG_NEWROUTE;
  1155. rtmsg.rtmsg_metric = IP6_RT_PRIO_ADDRCONF;
  1156. rtmsg.rtmsg_flags = (RTF_ALLONLINK | RTF_ADDRCONF | 
  1157.      RTF_DEFAULT | RTF_UP);
  1158. rtmsg.rtmsg_ifindex = ifp->idev->dev->ifindex;
  1159. ip6_route_add(&rtmsg);
  1160. }
  1161. out:
  1162. in6_ifa_put(ifp);
  1163. }
  1164. /*
  1165.  * Duplicate Address Detection
  1166.  */
  1167. static void addrconf_dad_start(struct inet6_ifaddr *ifp)
  1168. {
  1169. struct net_device *dev;
  1170. unsigned long rand_num;
  1171. dev = ifp->idev->dev;
  1172. addrconf_join_solict(dev, &ifp->addr);
  1173. if (ifp->prefix_len != 128 && (ifp->flags&IFA_F_PERMANENT))
  1174. addrconf_prefix_route(&ifp->addr, ifp->prefix_len, dev, 0, RTF_ADDRCONF);
  1175. net_srandom(ifp->addr.s6_addr32[3]);
  1176. rand_num = net_random() % (ifp->idev->cnf.rtr_solicit_delay ? : 1);
  1177. spin_lock_bh(&ifp->lock);
  1178. if (dev->flags&(IFF_NOARP|IFF_LOOPBACK) ||
  1179.     !(ifp->flags&IFA_F_TENTATIVE)) {
  1180. ifp->flags &= ~IFA_F_TENTATIVE;
  1181. spin_unlock_bh(&ifp->lock);
  1182. addrconf_dad_completed(ifp);
  1183. return;
  1184. }
  1185. ifp->probes = ifp->idev->cnf.dad_transmits;
  1186. addrconf_mod_timer(ifp, AC_DAD, rand_num);
  1187. spin_unlock_bh(&ifp->lock);
  1188. }
  1189. static void addrconf_dad_timer(unsigned long data)
  1190. {
  1191. struct inet6_ifaddr *ifp = (struct inet6_ifaddr *) data;
  1192. struct in6_addr unspec;
  1193. struct in6_addr mcaddr;
  1194. spin_lock_bh(&ifp->lock);
  1195. if (ifp->probes == 0) {
  1196. /*
  1197.  * DAD was successful
  1198.  */
  1199. ifp->flags &= ~IFA_F_TENTATIVE;
  1200. spin_unlock_bh(&ifp->lock);
  1201. addrconf_dad_completed(ifp);
  1202. in6_ifa_put(ifp);
  1203. return;
  1204. }
  1205. ifp->probes--;
  1206. addrconf_mod_timer(ifp, AC_DAD, ifp->idev->nd_parms->retrans_time);
  1207. spin_unlock_bh(&ifp->lock);
  1208. /* send a neighbour solicitation for our addr */
  1209. memset(&unspec, 0, sizeof(unspec));
  1210. addrconf_addr_solict_mult(&ifp->addr, &mcaddr);
  1211. ndisc_send_ns(ifp->idev->dev, NULL, &ifp->addr, &mcaddr, &unspec);
  1212. in6_ifa_put(ifp);
  1213. }
  1214. static void addrconf_dad_completed(struct inet6_ifaddr *ifp)
  1215. {
  1216. struct net_device * dev = ifp->idev->dev;
  1217. /*
  1218.  * Configure the address for reception. Now it is valid.
  1219.  */
  1220. ipv6_ifa_notify(RTM_NEWADDR, ifp);
  1221. /* If added prefix is link local and forwarding is off,
  1222.    start sending router solicitations.
  1223.  */
  1224. if (ifp->idev->cnf.forwarding == 0 &&
  1225.     (dev->flags&IFF_LOOPBACK) == 0 &&
  1226.     (ipv6_addr_type(&ifp->addr) & IPV6_ADDR_LINKLOCAL)) {
  1227. struct in6_addr all_routers;
  1228. ipv6_addr_all_routers(&all_routers);
  1229. /*
  1230.  * If a host as already performed a random delay
  1231.  * [...] as part of DAD [...] there is no need
  1232.  * to delay again before sending the first RS
  1233.  */
  1234. ndisc_send_rs(ifp->idev->dev, &ifp->addr, &all_routers);
  1235. spin_lock_bh(&ifp->lock);
  1236. ifp->probes = 1;
  1237. ifp->idev->if_flags |= IF_RS_SENT;
  1238. addrconf_mod_timer(ifp, AC_RS, ifp->idev->cnf.rtr_solicit_interval);
  1239. spin_unlock_bh(&ifp->lock);
  1240. }
  1241. }
  1242. #ifdef CONFIG_PROC_FS
  1243. static int iface_proc_info(char *buffer, char **start, off_t offset,
  1244.    int length)
  1245. {
  1246. struct inet6_ifaddr *ifp;
  1247. int i;
  1248. int len = 0;
  1249. off_t pos=0;
  1250. off_t begin=0;
  1251. for (i=0; i < IN6_ADDR_HSIZE; i++) {
  1252. read_lock_bh(&addrconf_hash_lock);
  1253. for (ifp=inet6_addr_lst[i]; ifp; ifp=ifp->lst_next) {
  1254. int j;
  1255. for (j=0; j<16; j++) {
  1256. sprintf(buffer + len, "%02x",
  1257. ifp->addr.s6_addr[j]);
  1258. len += 2;
  1259. }
  1260. len += sprintf(buffer + len,
  1261.        " %02x %02x %02x %02x %8sn",
  1262.        ifp->idev->dev->ifindex,
  1263.        ifp->prefix_len,
  1264.        ifp->scope,
  1265.        ifp->flags,
  1266.        ifp->idev->dev->name);
  1267. pos=begin+len;
  1268. if(pos<offset) {
  1269. len=0;
  1270. begin=pos;
  1271. }
  1272. if(pos>offset+length) {
  1273. read_unlock_bh(&addrconf_hash_lock);
  1274. goto done;
  1275. }
  1276. }
  1277. read_unlock_bh(&addrconf_hash_lock);
  1278. }
  1279. done:
  1280. *start=buffer+(offset-begin);
  1281. len-=(offset-begin);
  1282. if(len>length)
  1283. len=length;
  1284. if(len<0)
  1285. len=0;
  1286. return len;
  1287. }
  1288. #endif /* CONFIG_PROC_FS */
  1289. /*
  1290.  * Periodic address status verification
  1291.  */
  1292. void addrconf_verify(unsigned long foo)
  1293. {
  1294. struct inet6_ifaddr *ifp;
  1295. unsigned long now = jiffies;
  1296. int i;
  1297. for (i=0; i < IN6_ADDR_HSIZE; i++) {
  1298. restart:
  1299. write_lock(&addrconf_hash_lock);
  1300. for (ifp=inet6_addr_lst[i]; ifp; ifp=ifp->lst_next) {
  1301. unsigned long age;
  1302. if (ifp->flags & IFA_F_PERMANENT)
  1303. continue;
  1304. age = (now - ifp->tstamp) / HZ;
  1305. if (age > ifp->valid_lft) {
  1306. in6_ifa_hold(ifp);
  1307. write_unlock(&addrconf_hash_lock);
  1308. ipv6_del_addr(ifp);
  1309. goto restart;
  1310. } else if (age > ifp->prefered_lft) {
  1311. int deprecate = 0;
  1312. spin_lock(&ifp->lock);
  1313. if (!(ifp->flags&IFA_F_DEPRECATED)) {
  1314. deprecate = 1;
  1315. ifp->flags |= IFA_F_DEPRECATED;
  1316. }
  1317. spin_unlock(&ifp->lock);
  1318. if (deprecate) {
  1319. in6_ifa_hold(ifp);
  1320. write_unlock(&addrconf_hash_lock);
  1321. ipv6_ifa_notify(0, ifp);
  1322. in6_ifa_put(ifp);
  1323. goto restart;
  1324. }
  1325. }
  1326. }
  1327. write_unlock(&addrconf_hash_lock);
  1328. }
  1329. mod_timer(&addr_chk_timer, jiffies + ADDR_CHECK_FREQUENCY);
  1330. }
  1331. static int
  1332. inet6_rtm_deladdr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
  1333. {
  1334. struct rtattr **rta = arg;
  1335. struct ifaddrmsg *ifm = NLMSG_DATA(nlh);
  1336. struct in6_addr *pfx;
  1337. pfx = NULL;
  1338. if (rta[IFA_ADDRESS-1]) {
  1339. if (RTA_PAYLOAD(rta[IFA_ADDRESS-1]) < sizeof(*pfx))
  1340. return -EINVAL;
  1341. pfx = RTA_DATA(rta[IFA_ADDRESS-1]);
  1342. }
  1343. if (rta[IFA_LOCAL-1]) {
  1344. if (pfx && memcmp(pfx, RTA_DATA(rta[IFA_LOCAL-1]), sizeof(*pfx)))
  1345. return -EINVAL;
  1346. pfx = RTA_DATA(rta[IFA_LOCAL-1]);
  1347. }
  1348. if (pfx == NULL)
  1349. return -EINVAL;
  1350. return inet6_addr_del(ifm->ifa_index, pfx, ifm->ifa_prefixlen);
  1351. }
  1352. static int
  1353. inet6_rtm_newaddr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
  1354. {
  1355. struct rtattr  **rta = arg;
  1356. struct ifaddrmsg *ifm = NLMSG_DATA(nlh);
  1357. struct in6_addr *pfx;
  1358. pfx = NULL;
  1359. if (rta[IFA_ADDRESS-1]) {
  1360. if (RTA_PAYLOAD(rta[IFA_ADDRESS-1]) < sizeof(*pfx))
  1361. return -EINVAL;
  1362. pfx = RTA_DATA(rta[IFA_ADDRESS-1]);
  1363. }
  1364. if (rta[IFA_LOCAL-1]) {
  1365. if (pfx && memcmp(pfx, RTA_DATA(rta[IFA_LOCAL-1]), sizeof(*pfx)))
  1366. return -EINVAL;
  1367. pfx = RTA_DATA(rta[IFA_LOCAL-1]);
  1368. }
  1369. if (pfx == NULL)
  1370. return -EINVAL;
  1371. return inet6_addr_add(ifm->ifa_index, pfx, ifm->ifa_prefixlen);
  1372. }
  1373. static int inet6_fill_ifaddr(struct sk_buff *skb, struct inet6_ifaddr *ifa,
  1374.      u32 pid, u32 seq, int event)
  1375. {
  1376. struct ifaddrmsg *ifm;
  1377. struct nlmsghdr  *nlh;
  1378. struct ifa_cacheinfo ci;
  1379. unsigned char  *b = skb->tail;
  1380. nlh = NLMSG_PUT(skb, pid, seq, event, sizeof(*ifm));
  1381. ifm = NLMSG_DATA(nlh);
  1382. ifm->ifa_family = AF_INET6;
  1383. ifm->ifa_prefixlen = ifa->prefix_len;
  1384. ifm->ifa_flags = ifa->flags;
  1385. ifm->ifa_scope = RT_SCOPE_UNIVERSE;
  1386. if (ifa->scope&IFA_HOST)
  1387. ifm->ifa_scope = RT_SCOPE_HOST;
  1388. else if (ifa->scope&IFA_LINK)
  1389. ifm->ifa_scope = RT_SCOPE_LINK;
  1390. else if (ifa->scope&IFA_SITE)
  1391. ifm->ifa_scope = RT_SCOPE_SITE;
  1392. ifm->ifa_index = ifa->idev->dev->ifindex;
  1393. RTA_PUT(skb, IFA_ADDRESS, 16, &ifa->addr);
  1394. if (!(ifa->flags&IFA_F_PERMANENT)) {
  1395. ci.ifa_prefered = ifa->prefered_lft;
  1396. ci.ifa_valid = ifa->valid_lft;
  1397. if (ci.ifa_prefered != 0xFFFFFFFF) {
  1398. long tval = (jiffies - ifa->tstamp)/HZ;
  1399. ci.ifa_prefered -= tval;
  1400. if (ci.ifa_valid != 0xFFFFFFFF)
  1401. ci.ifa_valid -= tval;
  1402. }
  1403. RTA_PUT(skb, IFA_CACHEINFO, sizeof(ci), &ci);
  1404. }
  1405. nlh->nlmsg_len = skb->tail - b;
  1406. return skb->len;
  1407. nlmsg_failure:
  1408. rtattr_failure:
  1409. skb_trim(skb, b - skb->data);
  1410. return -1;
  1411. }
  1412. static int inet6_dump_ifaddr(struct sk_buff *skb, struct netlink_callback *cb)
  1413. {
  1414. int idx, ip_idx;
  1415. int s_idx, s_ip_idx;
  1416.   struct inet6_ifaddr *ifa;
  1417. s_idx = cb->args[0];
  1418. s_ip_idx = ip_idx = cb->args[1];
  1419. for (idx=0; idx < IN6_ADDR_HSIZE; idx++) {
  1420. if (idx < s_idx)
  1421. continue;
  1422. if (idx > s_idx)
  1423. s_ip_idx = 0;
  1424. read_lock_bh(&addrconf_hash_lock);
  1425. for (ifa=inet6_addr_lst[idx], ip_idx = 0; ifa;
  1426.      ifa = ifa->lst_next, ip_idx++) {
  1427. if (ip_idx < s_ip_idx)
  1428. continue;
  1429. if (inet6_fill_ifaddr(skb, ifa, NETLINK_CB(cb->skb).pid,
  1430.       cb->nlh->nlmsg_seq, RTM_NEWADDR) <= 0) {
  1431. read_unlock_bh(&addrconf_hash_lock);
  1432. goto done;
  1433. }
  1434. }
  1435. read_unlock_bh(&addrconf_hash_lock);
  1436. }
  1437. done:
  1438. cb->args[0] = idx;
  1439. cb->args[1] = ip_idx;
  1440. return skb->len;
  1441. }
  1442. static void inet6_ifa_notify(int event, struct inet6_ifaddr *ifa)
  1443. {
  1444. struct sk_buff *skb;
  1445. int size = NLMSG_SPACE(sizeof(struct ifaddrmsg)+128);
  1446. skb = alloc_skb(size, GFP_ATOMIC);
  1447. if (!skb) {
  1448. netlink_set_err(rtnl, 0, RTMGRP_IPV6_IFADDR, ENOBUFS);
  1449. return;
  1450. }
  1451. if (inet6_fill_ifaddr(skb, ifa, 0, 0, event) < 0) {
  1452. kfree_skb(skb);
  1453. netlink_set_err(rtnl, 0, RTMGRP_IPV6_IFADDR, EINVAL);
  1454. return;
  1455. }
  1456. NETLINK_CB(skb).dst_groups = RTMGRP_IPV6_IFADDR;
  1457. netlink_broadcast(rtnl, skb, 0, RTMGRP_IPV6_IFADDR, GFP_ATOMIC);
  1458. }
  1459. static struct rtnetlink_link inet6_rtnetlink_table[RTM_MAX-RTM_BASE+1] =
  1460. {
  1461. { NULL, NULL, },
  1462. { NULL, NULL, },
  1463. { NULL, NULL, },
  1464. { NULL, NULL, },
  1465. { inet6_rtm_newaddr, NULL, },
  1466. { inet6_rtm_deladdr, NULL, },
  1467. { NULL, inet6_dump_ifaddr, },
  1468. { NULL, NULL, },
  1469. { inet6_rtm_newroute, NULL, },
  1470. { inet6_rtm_delroute, NULL, },
  1471. { inet6_rtm_getroute, inet6_dump_fib, },
  1472. { NULL, NULL, },
  1473. };
  1474. static void ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp)
  1475. {
  1476. inet6_ifa_notify(event ? : RTM_NEWADDR, ifp);
  1477. switch (event) {
  1478. case RTM_NEWADDR:
  1479. ip6_rt_addr_add(&ifp->addr, ifp->idev->dev);
  1480. break;
  1481. case RTM_DELADDR:
  1482. addrconf_leave_solict(ifp->idev->dev, &ifp->addr);
  1483. if (!ipv6_chk_addr(&ifp->addr, ifp->idev->dev))
  1484. ip6_rt_addr_del(&ifp->addr, ifp->idev->dev);
  1485. break;
  1486. }
  1487. }
  1488. #ifdef CONFIG_SYSCTL
  1489. static
  1490. int addrconf_sysctl_forward(ctl_table *ctl, int write, struct file * filp,
  1491.    void *buffer, size_t *lenp)
  1492. {
  1493. int *valp = ctl->data;
  1494. int val = *valp;
  1495. int ret;
  1496. ret = proc_dointvec(ctl, write, filp, buffer, lenp);
  1497. if (write && *valp != val && valp != &ipv6_devconf_dflt.forwarding) {
  1498. struct inet6_dev *idev = NULL;
  1499. if (valp != &ipv6_devconf.forwarding) {
  1500. struct net_device *dev = dev_get_by_index(ctl->ctl_name);
  1501. if (dev) {
  1502. idev = in6_dev_get(dev);
  1503. dev_put(dev);
  1504. }
  1505. if (idev == NULL)
  1506. return ret;
  1507. } else
  1508. ipv6_devconf_dflt.forwarding = ipv6_devconf.forwarding;
  1509. addrconf_forward_change(idev);
  1510. if (*valp)
  1511. rt6_purge_dflt_routers(0);
  1512. if (idev)
  1513. in6_dev_put(idev);
  1514. }
  1515.         return ret;
  1516. }
  1517. static struct addrconf_sysctl_table
  1518. {
  1519. struct ctl_table_header *sysctl_header;
  1520. ctl_table addrconf_vars[11];
  1521. ctl_table addrconf_dev[2];
  1522. ctl_table addrconf_conf_dir[2];
  1523. ctl_table addrconf_proto_dir[2];
  1524. ctl_table addrconf_root_dir[2];
  1525. } addrconf_sysctl = {
  1526. NULL,
  1527.         {{NET_IPV6_FORWARDING, "forwarding",
  1528.          &ipv6_devconf.forwarding, sizeof(int), 0644, NULL,
  1529.          &addrconf_sysctl_forward},
  1530. {NET_IPV6_HOP_LIMIT, "hop_limit",
  1531.          &ipv6_devconf.hop_limit, sizeof(int), 0644, NULL,
  1532.          &proc_dointvec},
  1533. {NET_IPV6_MTU, "mtu",
  1534.          &ipv6_devconf.mtu6, sizeof(int), 0644, NULL,
  1535.          &proc_dointvec},
  1536. {NET_IPV6_ACCEPT_RA, "accept_ra",
  1537.          &ipv6_devconf.accept_ra, sizeof(int), 0644, NULL,
  1538.          &proc_dointvec},
  1539. {NET_IPV6_ACCEPT_REDIRECTS, "accept_redirects",
  1540.          &ipv6_devconf.accept_redirects, sizeof(int), 0644, NULL,
  1541.          &proc_dointvec},
  1542. {NET_IPV6_AUTOCONF, "autoconf",
  1543.          &ipv6_devconf.autoconf, sizeof(int), 0644, NULL,
  1544.          &proc_dointvec},
  1545. {NET_IPV6_DAD_TRANSMITS, "dad_transmits",
  1546.          &ipv6_devconf.dad_transmits, sizeof(int), 0644, NULL,
  1547.          &proc_dointvec},
  1548. {NET_IPV6_RTR_SOLICITS, "router_solicitations",
  1549.          &ipv6_devconf.rtr_solicits, sizeof(int), 0644, NULL,
  1550.          &proc_dointvec},
  1551. {NET_IPV6_RTR_SOLICIT_INTERVAL, "router_solicitation_interval",
  1552.          &ipv6_devconf.rtr_solicit_interval, sizeof(int), 0644, NULL,
  1553.          &proc_dointvec_jiffies},
  1554. {NET_IPV6_RTR_SOLICIT_DELAY, "router_solicitation_delay",
  1555.          &ipv6_devconf.rtr_solicit_delay, sizeof(int), 0644, NULL,
  1556.          &proc_dointvec_jiffies},
  1557. {0}},
  1558. {{NET_PROTO_CONF_ALL, "all", NULL, 0, 0555, addrconf_sysctl.addrconf_vars},{0}},
  1559. {{NET_IPV6_CONF, "conf", NULL, 0, 0555, addrconf_sysctl.addrconf_dev},{0}},
  1560. {{NET_IPV6, "ipv6", NULL, 0, 0555, addrconf_sysctl.addrconf_conf_dir},{0}},
  1561. {{CTL_NET, "net", NULL, 0, 0555, addrconf_sysctl.addrconf_proto_dir},{0}}
  1562. };
  1563. static void addrconf_sysctl_register(struct inet6_dev *idev, struct ipv6_devconf *p)
  1564. {
  1565. int i;
  1566. struct net_device *dev = idev ? idev->dev : NULL;
  1567. struct addrconf_sysctl_table *t;
  1568. t = kmalloc(sizeof(*t), GFP_KERNEL);
  1569. if (t == NULL)
  1570. return;
  1571. memcpy(t, &addrconf_sysctl, sizeof(*t));
  1572. for (i=0; i<sizeof(t->addrconf_vars)/sizeof(t->addrconf_vars[0])-1; i++) {
  1573. t->addrconf_vars[i].data += (char*)p - (char*)&ipv6_devconf;
  1574. t->addrconf_vars[i].de = NULL;
  1575. }
  1576. if (dev) {
  1577. t->addrconf_dev[0].procname = dev->name;
  1578. t->addrconf_dev[0].ctl_name = dev->ifindex;
  1579. } else {
  1580. t->addrconf_dev[0].procname = "default";
  1581. t->addrconf_dev[0].ctl_name = NET_PROTO_CONF_DEFAULT;
  1582. }
  1583. t->addrconf_dev[0].child = t->addrconf_vars;
  1584. t->addrconf_dev[0].de = NULL;
  1585. t->addrconf_conf_dir[0].child = t->addrconf_dev;
  1586. t->addrconf_conf_dir[0].de = NULL;
  1587. t->addrconf_proto_dir[0].child = t->addrconf_conf_dir;
  1588. t->addrconf_proto_dir[0].de = NULL;
  1589. t->addrconf_root_dir[0].child = t->addrconf_proto_dir;
  1590. t->addrconf_root_dir[0].de = NULL;
  1591. t->sysctl_header = register_sysctl_table(t->addrconf_root_dir, 0);
  1592. if (t->sysctl_header == NULL)
  1593. kfree(t);
  1594. else
  1595. p->sysctl = t;
  1596. }
  1597. static void addrconf_sysctl_unregister(struct ipv6_devconf *p)
  1598. {
  1599. if (p->sysctl) {
  1600. struct addrconf_sysctl_table *t = p->sysctl;
  1601. p->sysctl = NULL;
  1602. unregister_sysctl_table(t->sysctl_header);
  1603. kfree(t);
  1604. }
  1605. }
  1606. #endif
  1607. /*
  1608.  *      Device notifier
  1609.  */
  1610. int register_inet6addr_notifier(struct notifier_block *nb)
  1611. {
  1612.         return notifier_chain_register(&inet6addr_chain, nb);
  1613. }
  1614. int unregister_inet6addr_notifier(struct notifier_block *nb)
  1615. {
  1616.         return notifier_chain_unregister(&inet6addr_chain,nb);
  1617. }
  1618. /*
  1619.  * Init / cleanup code
  1620.  */
  1621. void __init addrconf_init(void)
  1622. {
  1623. #ifdef MODULE
  1624. struct net_device *dev;
  1625. /* This takes sense only during module load. */
  1626. rtnl_lock();
  1627. for (dev = dev_base; dev; dev = dev->next) {
  1628. if (!(dev->flags&IFF_UP))
  1629. continue;
  1630. switch (dev->type) {
  1631. case ARPHRD_LOOPBACK:
  1632. init_loopback(dev);
  1633. break;
  1634. case ARPHRD_ETHER:
  1635. case ARPHRD_FDDI:
  1636. case ARPHRD_IEEE802_TR:
  1637. addrconf_dev_config(dev);
  1638. break;
  1639. default:;
  1640. /* Ignore all other */
  1641. }
  1642. }
  1643. rtnl_unlock();
  1644. #endif
  1645. #ifdef CONFIG_PROC_FS
  1646. proc_net_create("if_inet6", 0, iface_proc_info);
  1647. #endif
  1648. addr_chk_timer.expires = jiffies + ADDR_CHECK_FREQUENCY;
  1649. add_timer(&addr_chk_timer);
  1650. rtnetlink_links[PF_INET6] = inet6_rtnetlink_table;
  1651. #ifdef CONFIG_SYSCTL
  1652. addrconf_sysctl.sysctl_header =
  1653. register_sysctl_table(addrconf_sysctl.addrconf_root_dir, 0);
  1654. addrconf_sysctl_register(NULL, &ipv6_devconf_dflt);
  1655. #endif
  1656. }
  1657. #ifdef MODULE
  1658. void addrconf_cleanup(void)
  1659. {
  1660.   struct net_device *dev;
  1661.   struct inet6_dev *idev;
  1662.   struct inet6_ifaddr *ifa;
  1663. int i;
  1664. rtnetlink_links[PF_INET6] = NULL;
  1665. #ifdef CONFIG_SYSCTL
  1666. addrconf_sysctl_unregister(&ipv6_devconf_dflt);
  1667. addrconf_sysctl_unregister(&ipv6_devconf);
  1668. #endif
  1669. rtnl_lock();
  1670. /*
  1671.  * clean dev list.
  1672.  */
  1673. for (dev=dev_base; dev; dev=dev->next) {
  1674. if ((idev = __in6_dev_get(dev)) == NULL)
  1675. continue;
  1676. addrconf_ifdown(dev, 1);
  1677. }
  1678. /*
  1679.  * Check hash table.
  1680.  */
  1681. write_lock_bh(&addrconf_hash_lock);
  1682. for (i=0; i < IN6_ADDR_HSIZE; i++) {
  1683. for (ifa=inet6_addr_lst[i]; ifa; ) {
  1684. struct inet6_ifaddr *bifa;
  1685. bifa = ifa;
  1686. ifa = ifa->lst_next;
  1687. printk(KERN_DEBUG "bug: IPv6 address leakage detected: ifa=%pn", bifa);
  1688. /* Do not free it; something is wrong.
  1689.    Now we can investigate it with debugger.
  1690.  */
  1691. }
  1692. }
  1693. write_unlock_bh(&addrconf_hash_lock);
  1694. del_timer(&addr_chk_timer);
  1695. rtnl_unlock();
  1696. #ifdef CONFIG_PROC_FS
  1697. proc_net_remove("if_inet6");
  1698. #endif
  1699. }
  1700. #endif /* MODULE */