sysctl: fix neighbour table sysctls.
[linux-2.6.git] / net / ipv6 / ndisc.c
1 /*
2  *      Neighbour Discovery for IPv6
3  *      Linux INET6 implementation
4  *
5  *      Authors:
6  *      Pedro Roque             <roque@di.fc.ul.pt>
7  *      Mike Shaver             <shaver@ingenia.com>
8  *
9  *      This program is free software; you can redistribute it and/or
10  *      modify it under the terms of the GNU General Public License
11  *      as published by the Free Software Foundation; either version
12  *      2 of the License, or (at your option) any later version.
13  */
14
15 /*
16  *      Changes:
17  *
18  *      Pierre Ynard                    :       export userland ND options
19  *                                              through netlink (RDNSS support)
20  *      Lars Fenneberg                  :       fixed MTU setting on receipt
21  *                                              of an RA.
22  *      Janos Farkas                    :       kmalloc failure checks
23  *      Alexey Kuznetsov                :       state machine reworked
24  *                                              and moved to net/core.
25  *      Pekka Savola                    :       RFC2461 validation
26  *      YOSHIFUJI Hideaki @USAGI        :       Verify ND options properly
27  */
28
29 /* Set to 3 to get tracing... */
30 #define ND_DEBUG 1
31
32 #define ND_PRINTK(fmt, args...) do { if (net_ratelimit()) { printk(fmt, ## args); } } while(0)
33 #define ND_NOPRINTK(x...) do { ; } while(0)
34 #define ND_PRINTK0 ND_PRINTK
35 #define ND_PRINTK1 ND_NOPRINTK
36 #define ND_PRINTK2 ND_NOPRINTK
37 #define ND_PRINTK3 ND_NOPRINTK
38 #if ND_DEBUG >= 1
39 #undef ND_PRINTK1
40 #define ND_PRINTK1 ND_PRINTK
41 #endif
42 #if ND_DEBUG >= 2
43 #undef ND_PRINTK2
44 #define ND_PRINTK2 ND_PRINTK
45 #endif
46 #if ND_DEBUG >= 3
47 #undef ND_PRINTK3
48 #define ND_PRINTK3 ND_PRINTK
49 #endif
50
51 #include <linux/module.h>
52 #include <linux/errno.h>
53 #include <linux/types.h>
54 #include <linux/socket.h>
55 #include <linux/sockios.h>
56 #include <linux/sched.h>
57 #include <linux/net.h>
58 #include <linux/in6.h>
59 #include <linux/route.h>
60 #include <linux/init.h>
61 #include <linux/rcupdate.h>
62 #ifdef CONFIG_SYSCTL
63 #include <linux/sysctl.h>
64 #endif
65
66 #include <linux/if_addr.h>
67 #include <linux/if_arp.h>
68 #include <linux/ipv6.h>
69 #include <linux/icmpv6.h>
70 #include <linux/jhash.h>
71
72 #include <net/sock.h>
73 #include <net/snmp.h>
74
75 #include <net/ipv6.h>
76 #include <net/protocol.h>
77 #include <net/ndisc.h>
78 #include <net/ip6_route.h>
79 #include <net/addrconf.h>
80 #include <net/icmp.h>
81
82 #include <net/netlink.h>
83 #include <linux/rtnetlink.h>
84
85 #include <net/flow.h>
86 #include <net/ip6_checksum.h>
87 #include <linux/proc_fs.h>
88
89 #include <linux/netfilter.h>
90 #include <linux/netfilter_ipv6.h>
91
92 static struct socket *ndisc_socket;
93
94 static u32 ndisc_hash(const void *pkey, const struct net_device *dev);
95 static int ndisc_constructor(struct neighbour *neigh);
96 static void ndisc_solicit(struct neighbour *neigh, struct sk_buff *skb);
97 static void ndisc_error_report(struct neighbour *neigh, struct sk_buff *skb);
98 static int pndisc_constructor(struct pneigh_entry *n);
99 static void pndisc_destructor(struct pneigh_entry *n);
100 static void pndisc_redo(struct sk_buff *skb);
101
102 static struct neigh_ops ndisc_generic_ops = {
103         .family =               AF_INET6,
104         .solicit =              ndisc_solicit,
105         .error_report =         ndisc_error_report,
106         .output =               neigh_resolve_output,
107         .connected_output =     neigh_connected_output,
108         .hh_output =            dev_queue_xmit,
109         .queue_xmit =           dev_queue_xmit,
110 };
111
112 static struct neigh_ops ndisc_hh_ops = {
113         .family =               AF_INET6,
114         .solicit =              ndisc_solicit,
115         .error_report =         ndisc_error_report,
116         .output =               neigh_resolve_output,
117         .connected_output =     neigh_resolve_output,
118         .hh_output =            dev_queue_xmit,
119         .queue_xmit =           dev_queue_xmit,
120 };
121
122
123 static struct neigh_ops ndisc_direct_ops = {
124         .family =               AF_INET6,
125         .output =               dev_queue_xmit,
126         .connected_output =     dev_queue_xmit,
127         .hh_output =            dev_queue_xmit,
128         .queue_xmit =           dev_queue_xmit,
129 };
130
131 struct neigh_table nd_tbl = {
132         .family =       AF_INET6,
133         .entry_size =   sizeof(struct neighbour) + sizeof(struct in6_addr),
134         .key_len =      sizeof(struct in6_addr),
135         .hash =         ndisc_hash,
136         .constructor =  ndisc_constructor,
137         .pconstructor = pndisc_constructor,
138         .pdestructor =  pndisc_destructor,
139         .proxy_redo =   pndisc_redo,
140         .id =           "ndisc_cache",
141         .parms = {
142                 .tbl =                  &nd_tbl,
143                 .base_reachable_time =  30 * HZ,
144                 .retrans_time =  1 * HZ,
145                 .gc_staletime = 60 * HZ,
146                 .reachable_time =               30 * HZ,
147                 .delay_probe_time =      5 * HZ,
148                 .queue_len =             3,
149                 .ucast_probes =  3,
150                 .mcast_probes =  3,
151                 .anycast_delay =         1 * HZ,
152                 .proxy_delay =          (8 * HZ) / 10,
153                 .proxy_qlen =           64,
154         },
155         .gc_interval =    30 * HZ,
156         .gc_thresh1 =    128,
157         .gc_thresh2 =    512,
158         .gc_thresh3 =   1024,
159 };
160
161 /* ND options */
162 struct ndisc_options {
163         struct nd_opt_hdr *nd_opt_array[__ND_OPT_ARRAY_MAX];
164 #ifdef CONFIG_IPV6_ROUTE_INFO
165         struct nd_opt_hdr *nd_opts_ri;
166         struct nd_opt_hdr *nd_opts_ri_end;
167 #endif
168         struct nd_opt_hdr *nd_useropts;
169         struct nd_opt_hdr *nd_useropts_end;
170 };
171
172 #define nd_opts_src_lladdr      nd_opt_array[ND_OPT_SOURCE_LL_ADDR]
173 #define nd_opts_tgt_lladdr      nd_opt_array[ND_OPT_TARGET_LL_ADDR]
174 #define nd_opts_pi              nd_opt_array[ND_OPT_PREFIX_INFO]
175 #define nd_opts_pi_end          nd_opt_array[__ND_OPT_PREFIX_INFO_END]
176 #define nd_opts_rh              nd_opt_array[ND_OPT_REDIRECT_HDR]
177 #define nd_opts_mtu             nd_opt_array[ND_OPT_MTU]
178
179 #define NDISC_OPT_SPACE(len) (((len)+2+7)&~7)
180
181 /*
182  * Return the padding between the option length and the start of the
183  * link addr.  Currently only IP-over-InfiniBand needs this, although
184  * if RFC 3831 IPv6-over-Fibre Channel is ever implemented it may
185  * also need a pad of 2.
186  */
187 static int ndisc_addr_option_pad(unsigned short type)
188 {
189         switch (type) {
190         case ARPHRD_INFINIBAND: return 2;
191         default:                return 0;
192         }
193 }
194
195 static inline int ndisc_opt_addr_space(struct net_device *dev)
196 {
197         return NDISC_OPT_SPACE(dev->addr_len + ndisc_addr_option_pad(dev->type));
198 }
199
200 static u8 *ndisc_fill_addr_option(u8 *opt, int type, void *data, int data_len,
201                                   unsigned short addr_type)
202 {
203         int space = NDISC_OPT_SPACE(data_len);
204         int pad   = ndisc_addr_option_pad(addr_type);
205
206         opt[0] = type;
207         opt[1] = space>>3;
208
209         memset(opt + 2, 0, pad);
210         opt   += pad;
211         space -= pad;
212
213         memcpy(opt+2, data, data_len);
214         data_len += 2;
215         opt += data_len;
216         if ((space -= data_len) > 0)
217                 memset(opt, 0, space);
218         return opt + space;
219 }
220
221 static struct nd_opt_hdr *ndisc_next_option(struct nd_opt_hdr *cur,
222                                             struct nd_opt_hdr *end)
223 {
224         int type;
225         if (!cur || !end || cur >= end)
226                 return NULL;
227         type = cur->nd_opt_type;
228         do {
229                 cur = ((void *)cur) + (cur->nd_opt_len << 3);
230         } while(cur < end && cur->nd_opt_type != type);
231         return (cur <= end && cur->nd_opt_type == type ? cur : NULL);
232 }
233
234 static inline int ndisc_is_useropt(struct nd_opt_hdr *opt)
235 {
236         return (opt->nd_opt_type == ND_OPT_RDNSS);
237 }
238
239 static struct nd_opt_hdr *ndisc_next_useropt(struct nd_opt_hdr *cur,
240                                              struct nd_opt_hdr *end)
241 {
242         if (!cur || !end || cur >= end)
243                 return NULL;
244         do {
245                 cur = ((void *)cur) + (cur->nd_opt_len << 3);
246         } while(cur < end && !ndisc_is_useropt(cur));
247         return (cur <= end && ndisc_is_useropt(cur) ? cur : NULL);
248 }
249
250 static struct ndisc_options *ndisc_parse_options(u8 *opt, int opt_len,
251                                                  struct ndisc_options *ndopts)
252 {
253         struct nd_opt_hdr *nd_opt = (struct nd_opt_hdr *)opt;
254
255         if (!nd_opt || opt_len < 0 || !ndopts)
256                 return NULL;
257         memset(ndopts, 0, sizeof(*ndopts));
258         while (opt_len) {
259                 int l;
260                 if (opt_len < sizeof(struct nd_opt_hdr))
261                         return NULL;
262                 l = nd_opt->nd_opt_len << 3;
263                 if (opt_len < l || l == 0)
264                         return NULL;
265                 switch (nd_opt->nd_opt_type) {
266                 case ND_OPT_SOURCE_LL_ADDR:
267                 case ND_OPT_TARGET_LL_ADDR:
268                 case ND_OPT_MTU:
269                 case ND_OPT_REDIRECT_HDR:
270                         if (ndopts->nd_opt_array[nd_opt->nd_opt_type]) {
271                                 ND_PRINTK2(KERN_WARNING
272                                            "%s(): duplicated ND6 option found: type=%d\n",
273                                            __FUNCTION__,
274                                            nd_opt->nd_opt_type);
275                         } else {
276                                 ndopts->nd_opt_array[nd_opt->nd_opt_type] = nd_opt;
277                         }
278                         break;
279                 case ND_OPT_PREFIX_INFO:
280                         ndopts->nd_opts_pi_end = nd_opt;
281                         if (!ndopts->nd_opt_array[nd_opt->nd_opt_type])
282                                 ndopts->nd_opt_array[nd_opt->nd_opt_type] = nd_opt;
283                         break;
284 #ifdef CONFIG_IPV6_ROUTE_INFO
285                 case ND_OPT_ROUTE_INFO:
286                         ndopts->nd_opts_ri_end = nd_opt;
287                         if (!ndopts->nd_opts_ri)
288                                 ndopts->nd_opts_ri = nd_opt;
289                         break;
290 #endif
291                 default:
292                         if (ndisc_is_useropt(nd_opt)) {
293                                 ndopts->nd_useropts_end = nd_opt;
294                                 if (!ndopts->nd_useropts)
295                                         ndopts->nd_useropts = nd_opt;
296                         } else {
297                                 /*
298                                  * Unknown options must be silently ignored,
299                                  * to accommodate future extension to the
300                                  * protocol.
301                                  */
302                                 ND_PRINTK2(KERN_NOTICE
303                                            "%s(): ignored unsupported option; type=%d, len=%d\n",
304                                            __FUNCTION__,
305                                            nd_opt->nd_opt_type, nd_opt->nd_opt_len);
306                         }
307                 }
308                 opt_len -= l;
309                 nd_opt = ((void *)nd_opt) + l;
310         }
311         return ndopts;
312 }
313
314 static inline u8 *ndisc_opt_addr_data(struct nd_opt_hdr *p,
315                                       struct net_device *dev)
316 {
317         u8 *lladdr = (u8 *)(p + 1);
318         int lladdrlen = p->nd_opt_len << 3;
319         int prepad = ndisc_addr_option_pad(dev->type);
320         if (lladdrlen != NDISC_OPT_SPACE(dev->addr_len + prepad))
321                 return NULL;
322         return (lladdr + prepad);
323 }
324
325 int ndisc_mc_map(struct in6_addr *addr, char *buf, struct net_device *dev, int dir)
326 {
327         switch (dev->type) {
328         case ARPHRD_ETHER:
329         case ARPHRD_IEEE802:    /* Not sure. Check it later. --ANK */
330         case ARPHRD_FDDI:
331                 ipv6_eth_mc_map(addr, buf);
332                 return 0;
333         case ARPHRD_IEEE802_TR:
334                 ipv6_tr_mc_map(addr,buf);
335                 return 0;
336         case ARPHRD_ARCNET:
337                 ipv6_arcnet_mc_map(addr, buf);
338                 return 0;
339         case ARPHRD_INFINIBAND:
340                 ipv6_ib_mc_map(addr, buf);
341                 return 0;
342         default:
343                 if (dir) {
344                         memcpy(buf, dev->broadcast, dev->addr_len);
345                         return 0;
346                 }
347         }
348         return -EINVAL;
349 }
350
351 EXPORT_SYMBOL(ndisc_mc_map);
352
353 static u32 ndisc_hash(const void *pkey, const struct net_device *dev)
354 {
355         const u32 *p32 = pkey;
356         u32 addr_hash, i;
357
358         addr_hash = 0;
359         for (i = 0; i < (sizeof(struct in6_addr) / sizeof(u32)); i++)
360                 addr_hash ^= *p32++;
361
362         return jhash_2words(addr_hash, dev->ifindex, nd_tbl.hash_rnd);
363 }
364
365 static int ndisc_constructor(struct neighbour *neigh)
366 {
367         struct in6_addr *addr = (struct in6_addr*)&neigh->primary_key;
368         struct net_device *dev = neigh->dev;
369         struct inet6_dev *in6_dev;
370         struct neigh_parms *parms;
371         int is_multicast = ipv6_addr_is_multicast(addr);
372
373         rcu_read_lock();
374         in6_dev = in6_dev_get(dev);
375         if (in6_dev == NULL) {
376                 rcu_read_unlock();
377                 return -EINVAL;
378         }
379
380         parms = in6_dev->nd_parms;
381         __neigh_parms_put(neigh->parms);
382         neigh->parms = neigh_parms_clone(parms);
383         rcu_read_unlock();
384
385         neigh->type = is_multicast ? RTN_MULTICAST : RTN_UNICAST;
386         if (!dev->header_ops) {
387                 neigh->nud_state = NUD_NOARP;
388                 neigh->ops = &ndisc_direct_ops;
389                 neigh->output = neigh->ops->queue_xmit;
390         } else {
391                 if (is_multicast) {
392                         neigh->nud_state = NUD_NOARP;
393                         ndisc_mc_map(addr, neigh->ha, dev, 1);
394                 } else if (dev->flags&(IFF_NOARP|IFF_LOOPBACK)) {
395                         neigh->nud_state = NUD_NOARP;
396                         memcpy(neigh->ha, dev->dev_addr, dev->addr_len);
397                         if (dev->flags&IFF_LOOPBACK)
398                                 neigh->type = RTN_LOCAL;
399                 } else if (dev->flags&IFF_POINTOPOINT) {
400                         neigh->nud_state = NUD_NOARP;
401                         memcpy(neigh->ha, dev->broadcast, dev->addr_len);
402                 }
403                 if (dev->header_ops->cache)
404                         neigh->ops = &ndisc_hh_ops;
405                 else
406                         neigh->ops = &ndisc_generic_ops;
407                 if (neigh->nud_state&NUD_VALID)
408                         neigh->output = neigh->ops->connected_output;
409                 else
410                         neigh->output = neigh->ops->output;
411         }
412         in6_dev_put(in6_dev);
413         return 0;
414 }
415
416 static int pndisc_constructor(struct pneigh_entry *n)
417 {
418         struct in6_addr *addr = (struct in6_addr*)&n->key;
419         struct in6_addr maddr;
420         struct net_device *dev = n->dev;
421
422         if (dev == NULL || __in6_dev_get(dev) == NULL)
423                 return -EINVAL;
424         addrconf_addr_solict_mult(addr, &maddr);
425         ipv6_dev_mc_inc(dev, &maddr);
426         return 0;
427 }
428
429 static void pndisc_destructor(struct pneigh_entry *n)
430 {
431         struct in6_addr *addr = (struct in6_addr*)&n->key;
432         struct in6_addr maddr;
433         struct net_device *dev = n->dev;
434
435         if (dev == NULL || __in6_dev_get(dev) == NULL)
436                 return;
437         addrconf_addr_solict_mult(addr, &maddr);
438         ipv6_dev_mc_dec(dev, &maddr);
439 }
440
441 /*
442  *      Send a Neighbour Advertisement
443  */
444
445 static inline void ndisc_flow_init(struct flowi *fl, u8 type,
446                             struct in6_addr *saddr, struct in6_addr *daddr,
447                             int oif)
448 {
449         memset(fl, 0, sizeof(*fl));
450         ipv6_addr_copy(&fl->fl6_src, saddr);
451         ipv6_addr_copy(&fl->fl6_dst, daddr);
452         fl->proto               = IPPROTO_ICMPV6;
453         fl->fl_icmp_type        = type;
454         fl->fl_icmp_code        = 0;
455         fl->oif                 = oif;
456         security_sk_classify_flow(ndisc_socket->sk, fl);
457 }
458
459 static void __ndisc_send(struct net_device *dev,
460                          struct neighbour *neigh,
461                          struct in6_addr *daddr, struct in6_addr *saddr,
462                          struct icmp6hdr *icmp6h, struct in6_addr *target,
463                          int llinfo)
464 {
465         struct flowi fl;
466         struct dst_entry *dst;
467         struct sock *sk = ndisc_socket->sk;
468         struct sk_buff *skb;
469         struct icmp6hdr *hdr;
470         struct inet6_dev *idev;
471         int len;
472         int err;
473         u8 *opt, type;
474
475         type = icmp6h->icmp6_type;
476
477         ndisc_flow_init(&fl, type, saddr, daddr,
478                         dev->ifindex);
479
480         dst = ndisc_dst_alloc(dev, neigh, daddr, ip6_output);
481         if (!dst)
482                 return;
483
484         err = xfrm_lookup(&dst, &fl, NULL, 0);
485         if (err < 0)
486                 return;
487
488         if (!dev->addr_len)
489                 llinfo = 0;
490
491         len = sizeof(struct icmp6hdr) + (target ? sizeof(*target) : 0);
492         if (llinfo)
493                 len += ndisc_opt_addr_space(dev);
494
495         skb = sock_alloc_send_skb(sk,
496                                   (MAX_HEADER + sizeof(struct ipv6hdr) +
497                                    len + LL_RESERVED_SPACE(dev)),
498                                   1, &err);
499         if (!skb) {
500                 ND_PRINTK0(KERN_ERR
501                            "ICMPv6 ND: %s() failed to allocate an skb.\n",
502                            __FUNCTION__);
503                 dst_release(dst);
504                 return;
505         }
506
507         skb_reserve(skb, LL_RESERVED_SPACE(dev));
508         ip6_nd_hdr(sk, skb, dev, saddr, daddr, IPPROTO_ICMPV6, len);
509
510         skb->transport_header = skb->tail;
511         skb_put(skb, len);
512
513         hdr = (struct icmp6hdr *)skb_transport_header(skb);
514         memcpy(hdr, icmp6h, sizeof(*hdr));
515
516         opt = skb_transport_header(skb) + sizeof(struct icmp6hdr);
517         if (target) {
518                 ipv6_addr_copy((struct in6_addr *)opt, target);
519                 opt += sizeof(*target);
520         }
521
522         if (llinfo)
523                 ndisc_fill_addr_option(opt, llinfo, dev->dev_addr,
524                                        dev->addr_len, dev->type);
525
526         hdr->icmp6_cksum = csum_ipv6_magic(saddr, daddr, len,
527                                            IPPROTO_ICMPV6,
528                                            csum_partial((__u8 *) hdr,
529                                                         len, 0));
530
531         skb->dst = dst;
532
533         idev = in6_dev_get(dst->dev);
534         IP6_INC_STATS(idev, IPSTATS_MIB_OUTREQUESTS);
535
536         err = NF_HOOK(PF_INET6, NF_IP6_LOCAL_OUT, skb, NULL, dst->dev, dst_output);
537         if (!err) {
538                 ICMP6MSGOUT_INC_STATS(idev, type);
539                 ICMP6_INC_STATS(idev, ICMP6_MIB_OUTMSGS);
540         }
541
542         if (likely(idev != NULL))
543                 in6_dev_put(idev);
544 }
545
546 static void ndisc_send_na(struct net_device *dev, struct neighbour *neigh,
547                    struct in6_addr *daddr, struct in6_addr *solicited_addr,
548                    int router, int solicited, int override, int inc_opt)
549 {
550         struct in6_addr tmpaddr;
551         struct inet6_ifaddr *ifp;
552         struct in6_addr *src_addr;
553         struct icmp6hdr icmp6h = {
554                 .icmp6_type = NDISC_NEIGHBOUR_ADVERTISEMENT,
555         };
556
557         /* for anycast or proxy, solicited_addr != src_addr */
558         ifp = ipv6_get_ifaddr(solicited_addr, dev, 1);
559         if (ifp) {
560                 src_addr = solicited_addr;
561                 if (ifp->flags & IFA_F_OPTIMISTIC)
562                         override = 0;
563                 in6_ifa_put(ifp);
564         } else {
565                 if (ipv6_dev_get_saddr(dev, daddr, &tmpaddr))
566                         return;
567                 src_addr = &tmpaddr;
568         }
569
570         icmp6h.icmp6_router = router;
571         icmp6h.icmp6_solicited = solicited;
572         icmp6h.icmp6_override = override;
573
574         __ndisc_send(dev, neigh, daddr, src_addr,
575                      &icmp6h, solicited_addr,
576                      inc_opt ? ND_OPT_TARGET_LL_ADDR : 0);
577 }
578
579 void ndisc_send_ns(struct net_device *dev, struct neighbour *neigh,
580                    struct in6_addr *solicit,
581                    struct in6_addr *daddr, struct in6_addr *saddr)
582 {
583         struct in6_addr addr_buf;
584         struct icmp6hdr icmp6h = {
585                 .icmp6_type = NDISC_NEIGHBOUR_SOLICITATION,
586         };
587
588         if (saddr == NULL) {
589                 if (ipv6_get_lladdr(dev, &addr_buf,
590                                    (IFA_F_TENTATIVE|IFA_F_OPTIMISTIC)))
591                         return;
592                 saddr = &addr_buf;
593         }
594
595         __ndisc_send(dev, neigh, daddr, saddr,
596                      &icmp6h, solicit,
597                      !ipv6_addr_any(saddr) ? ND_OPT_SOURCE_LL_ADDR : 0);
598 }
599
600 void ndisc_send_rs(struct net_device *dev, struct in6_addr *saddr,
601                    struct in6_addr *daddr)
602 {
603         struct icmp6hdr icmp6h = {
604                 .icmp6_type = NDISC_ROUTER_SOLICITATION,
605         };
606         int send_sllao = dev->addr_len;
607
608 #ifdef CONFIG_IPV6_OPTIMISTIC_DAD
609         /*
610          * According to section 2.2 of RFC 4429, we must not
611          * send router solicitations with a sllao from
612          * optimistic addresses, but we may send the solicitation
613          * if we don't include the sllao.  So here we check
614          * if our address is optimistic, and if so, we
615          * supress the inclusion of the sllao.
616          */
617         if (send_sllao) {
618                 struct inet6_ifaddr *ifp = ipv6_get_ifaddr(saddr, dev, 1);
619                 if (ifp) {
620                         if (ifp->flags & IFA_F_OPTIMISTIC)  {
621                                 send_sllao = 0;
622                         }
623                         in6_ifa_put(ifp);
624                 } else {
625                         send_sllao = 0;
626                 }
627         }
628 #endif
629         __ndisc_send(dev, NULL, daddr, saddr,
630                      &icmp6h, NULL,
631                      send_sllao ? ND_OPT_SOURCE_LL_ADDR : 0);
632 }
633
634
635 static void ndisc_error_report(struct neighbour *neigh, struct sk_buff *skb)
636 {
637         /*
638          *      "The sender MUST return an ICMP
639          *       destination unreachable"
640          */
641         dst_link_failure(skb);
642         kfree_skb(skb);
643 }
644
645 /* Called with locked neigh: either read or both */
646
647 static void ndisc_solicit(struct neighbour *neigh, struct sk_buff *skb)
648 {
649         struct in6_addr *saddr = NULL;
650         struct in6_addr mcaddr;
651         struct net_device *dev = neigh->dev;
652         struct in6_addr *target = (struct in6_addr *)&neigh->primary_key;
653         int probes = atomic_read(&neigh->probes);
654
655         if (skb && ipv6_chk_addr(&ipv6_hdr(skb)->saddr, dev, 1))
656                 saddr = &ipv6_hdr(skb)->saddr;
657
658         if ((probes -= neigh->parms->ucast_probes) < 0) {
659                 if (!(neigh->nud_state & NUD_VALID)) {
660                         ND_PRINTK1(KERN_DEBUG
661                                    "%s(): trying to ucast probe in NUD_INVALID: "
662                                    NIP6_FMT "\n",
663                                    __FUNCTION__,
664                                    NIP6(*target));
665                 }
666                 ndisc_send_ns(dev, neigh, target, target, saddr);
667         } else if ((probes -= neigh->parms->app_probes) < 0) {
668 #ifdef CONFIG_ARPD
669                 neigh_app_ns(neigh);
670 #endif
671         } else {
672                 addrconf_addr_solict_mult(target, &mcaddr);
673                 ndisc_send_ns(dev, NULL, target, &mcaddr, saddr);
674         }
675 }
676
677 static void ndisc_recv_ns(struct sk_buff *skb)
678 {
679         struct nd_msg *msg = (struct nd_msg *)skb_transport_header(skb);
680         struct in6_addr *saddr = &ipv6_hdr(skb)->saddr;
681         struct in6_addr *daddr = &ipv6_hdr(skb)->daddr;
682         u8 *lladdr = NULL;
683         u32 ndoptlen = skb->tail - (skb->transport_header +
684                                     offsetof(struct nd_msg, opt));
685         struct ndisc_options ndopts;
686         struct net_device *dev = skb->dev;
687         struct inet6_ifaddr *ifp;
688         struct inet6_dev *idev = NULL;
689         struct neighbour *neigh;
690         struct pneigh_entry *pneigh = NULL;
691         int dad = ipv6_addr_any(saddr);
692         int inc;
693         int is_router;
694
695         if (ipv6_addr_is_multicast(&msg->target)) {
696                 ND_PRINTK2(KERN_WARNING
697                            "ICMPv6 NS: multicast target address");
698                 return;
699         }
700
701         /*
702          * RFC2461 7.1.1:
703          * DAD has to be destined for solicited node multicast address.
704          */
705         if (dad &&
706             !(daddr->s6_addr32[0] == htonl(0xff020000) &&
707               daddr->s6_addr32[1] == htonl(0x00000000) &&
708               daddr->s6_addr32[2] == htonl(0x00000001) &&
709               daddr->s6_addr [12] == 0xff )) {
710                 ND_PRINTK2(KERN_WARNING
711                            "ICMPv6 NS: bad DAD packet (wrong destination)\n");
712                 return;
713         }
714
715         if (!ndisc_parse_options(msg->opt, ndoptlen, &ndopts)) {
716                 ND_PRINTK2(KERN_WARNING
717                            "ICMPv6 NS: invalid ND options\n");
718                 return;
719         }
720
721         if (ndopts.nd_opts_src_lladdr) {
722                 lladdr = ndisc_opt_addr_data(ndopts.nd_opts_src_lladdr, dev);
723                 if (!lladdr) {
724                         ND_PRINTK2(KERN_WARNING
725                                    "ICMPv6 NS: invalid link-layer address length\n");
726                         return;
727                 }
728
729                 /* RFC2461 7.1.1:
730                  *      If the IP source address is the unspecified address,
731                  *      there MUST NOT be source link-layer address option
732                  *      in the message.
733                  */
734                 if (dad) {
735                         ND_PRINTK2(KERN_WARNING
736                                    "ICMPv6 NS: bad DAD packet (link-layer address option)\n");
737                         return;
738                 }
739         }
740
741         inc = ipv6_addr_is_multicast(daddr);
742
743         if ((ifp = ipv6_get_ifaddr(&msg->target, dev, 1)) != NULL) {
744
745                 if (ifp->flags & (IFA_F_TENTATIVE|IFA_F_OPTIMISTIC)) {
746                         if (dad) {
747                                 if (dev->type == ARPHRD_IEEE802_TR) {
748                                         const unsigned char *sadr;
749                                         sadr = skb_mac_header(skb);
750                                         if (((sadr[8] ^ dev->dev_addr[0]) & 0x7f) == 0 &&
751                                             sadr[9] == dev->dev_addr[1] &&
752                                             sadr[10] == dev->dev_addr[2] &&
753                                             sadr[11] == dev->dev_addr[3] &&
754                                             sadr[12] == dev->dev_addr[4] &&
755                                             sadr[13] == dev->dev_addr[5]) {
756                                                 /* looped-back to us */
757                                                 goto out;
758                                         }
759                                 }
760
761                                 /*
762                                  * We are colliding with another node
763                                  * who is doing DAD
764                                  * so fail our DAD process
765                                  */
766                                 addrconf_dad_failure(ifp);
767                                 return;
768                         } else {
769                                 /*
770                                  * This is not a dad solicitation.
771                                  * If we are an optimistic node,
772                                  * we should respond.
773                                  * Otherwise, we should ignore it.
774                                  */
775                                 if (!(ifp->flags & IFA_F_OPTIMISTIC))
776                                         goto out;
777                         }
778                 }
779
780                 idev = ifp->idev;
781         } else {
782                 idev = in6_dev_get(dev);
783                 if (!idev) {
784                         /* XXX: count this drop? */
785                         return;
786                 }
787
788                 if (ipv6_chk_acast_addr(dev, &msg->target) ||
789                     (idev->cnf.forwarding &&
790                      (ipv6_devconf.proxy_ndp || idev->cnf.proxy_ndp) &&
791                      (pneigh = pneigh_lookup(&nd_tbl,
792                                              &msg->target, dev, 0)) != NULL)) {
793                         if (!(NEIGH_CB(skb)->flags & LOCALLY_ENQUEUED) &&
794                             skb->pkt_type != PACKET_HOST &&
795                             inc != 0 &&
796                             idev->nd_parms->proxy_delay != 0) {
797                                 /*
798                                  * for anycast or proxy,
799                                  * sender should delay its response
800                                  * by a random time between 0 and
801                                  * MAX_ANYCAST_DELAY_TIME seconds.
802                                  * (RFC2461) -- yoshfuji
803                                  */
804                                 struct sk_buff *n = skb_clone(skb, GFP_ATOMIC);
805                                 if (n)
806                                         pneigh_enqueue(&nd_tbl, idev->nd_parms, n);
807                                 goto out;
808                         }
809                 } else
810                         goto out;
811         }
812
813         is_router = !!(pneigh ? pneigh->flags & NTF_ROUTER : idev->cnf.forwarding);
814
815         if (dad) {
816                 struct in6_addr maddr;
817
818                 ipv6_addr_all_nodes(&maddr);
819                 ndisc_send_na(dev, NULL, &maddr, &msg->target,
820                               is_router, 0, (ifp != NULL), 1);
821                 goto out;
822         }
823
824         if (inc)
825                 NEIGH_CACHE_STAT_INC(&nd_tbl, rcv_probes_mcast);
826         else
827                 NEIGH_CACHE_STAT_INC(&nd_tbl, rcv_probes_ucast);
828
829         /*
830          *      update / create cache entry
831          *      for the source address
832          */
833         neigh = __neigh_lookup(&nd_tbl, saddr, dev,
834                                !inc || lladdr || !dev->addr_len);
835         if (neigh)
836                 neigh_update(neigh, lladdr, NUD_STALE,
837                              NEIGH_UPDATE_F_WEAK_OVERRIDE|
838                              NEIGH_UPDATE_F_OVERRIDE);
839         if (neigh || !dev->header_ops) {
840                 ndisc_send_na(dev, neigh, saddr, &msg->target,
841                               is_router,
842                               1, (ifp != NULL && inc), inc);
843                 if (neigh)
844                         neigh_release(neigh);
845         }
846
847 out:
848         if (ifp)
849                 in6_ifa_put(ifp);
850         else
851                 in6_dev_put(idev);
852
853         return;
854 }
855
856 static void ndisc_recv_na(struct sk_buff *skb)
857 {
858         struct nd_msg *msg = (struct nd_msg *)skb_transport_header(skb);
859         struct in6_addr *saddr = &ipv6_hdr(skb)->saddr;
860         struct in6_addr *daddr = &ipv6_hdr(skb)->daddr;
861         u8 *lladdr = NULL;
862         u32 ndoptlen = skb->tail - (skb->transport_header +
863                                     offsetof(struct nd_msg, opt));
864         struct ndisc_options ndopts;
865         struct net_device *dev = skb->dev;
866         struct inet6_ifaddr *ifp;
867         struct neighbour *neigh;
868
869         if (skb->len < sizeof(struct nd_msg)) {
870                 ND_PRINTK2(KERN_WARNING
871                            "ICMPv6 NA: packet too short\n");
872                 return;
873         }
874
875         if (ipv6_addr_is_multicast(&msg->target)) {
876                 ND_PRINTK2(KERN_WARNING
877                            "ICMPv6 NA: target address is multicast.\n");
878                 return;
879         }
880
881         if (ipv6_addr_is_multicast(daddr) &&
882             msg->icmph.icmp6_solicited) {
883                 ND_PRINTK2(KERN_WARNING
884                            "ICMPv6 NA: solicited NA is multicasted.\n");
885                 return;
886         }
887
888         if (!ndisc_parse_options(msg->opt, ndoptlen, &ndopts)) {
889                 ND_PRINTK2(KERN_WARNING
890                            "ICMPv6 NS: invalid ND option\n");
891                 return;
892         }
893         if (ndopts.nd_opts_tgt_lladdr) {
894                 lladdr = ndisc_opt_addr_data(ndopts.nd_opts_tgt_lladdr, dev);
895                 if (!lladdr) {
896                         ND_PRINTK2(KERN_WARNING
897                                    "ICMPv6 NA: invalid link-layer address length\n");
898                         return;
899                 }
900         }
901         if ((ifp = ipv6_get_ifaddr(&msg->target, dev, 1))) {
902                 if (ifp->flags & IFA_F_TENTATIVE) {
903                         addrconf_dad_failure(ifp);
904                         return;
905                 }
906                 /* What should we make now? The advertisement
907                    is invalid, but ndisc specs say nothing
908                    about it. It could be misconfiguration, or
909                    an smart proxy agent tries to help us :-)
910                  */
911                 ND_PRINTK1(KERN_WARNING
912                            "ICMPv6 NA: someone advertises our address on %s!\n",
913                            ifp->idev->dev->name);
914                 in6_ifa_put(ifp);
915                 return;
916         }
917         neigh = neigh_lookup(&nd_tbl, &msg->target, dev);
918
919         if (neigh) {
920                 u8 old_flags = neigh->flags;
921
922                 if (neigh->nud_state & NUD_FAILED)
923                         goto out;
924
925                 /*
926                  * Don't update the neighbor cache entry on a proxy NA from
927                  * ourselves because either the proxied node is off link or it
928                  * has already sent a NA to us.
929                  */
930                 if (lladdr && !memcmp(lladdr, dev->dev_addr, dev->addr_len) &&
931                     ipv6_devconf.forwarding && ipv6_devconf.proxy_ndp &&
932                     pneigh_lookup(&nd_tbl, &msg->target, dev, 0)) {
933                         /* XXX: idev->cnf.prixy_ndp */
934                         goto out;
935                 }
936
937                 neigh_update(neigh, lladdr,
938                              msg->icmph.icmp6_solicited ? NUD_REACHABLE : NUD_STALE,
939                              NEIGH_UPDATE_F_WEAK_OVERRIDE|
940                              (msg->icmph.icmp6_override ? NEIGH_UPDATE_F_OVERRIDE : 0)|
941                              NEIGH_UPDATE_F_OVERRIDE_ISROUTER|
942                              (msg->icmph.icmp6_router ? NEIGH_UPDATE_F_ISROUTER : 0));
943
944                 if ((old_flags & ~neigh->flags) & NTF_ROUTER) {
945                         /*
946                          * Change: router to host
947                          */
948                         struct rt6_info *rt;
949                         rt = rt6_get_dflt_router(saddr, dev);
950                         if (rt)
951                                 ip6_del_rt(rt);
952                 }
953
954 out:
955                 neigh_release(neigh);
956         }
957 }
958
959 static void ndisc_recv_rs(struct sk_buff *skb)
960 {
961         struct rs_msg *rs_msg = (struct rs_msg *)skb_transport_header(skb);
962         unsigned long ndoptlen = skb->len - sizeof(*rs_msg);
963         struct neighbour *neigh;
964         struct inet6_dev *idev;
965         struct in6_addr *saddr = &ipv6_hdr(skb)->saddr;
966         struct ndisc_options ndopts;
967         u8 *lladdr = NULL;
968
969         if (skb->len < sizeof(*rs_msg))
970                 return;
971
972         idev = in6_dev_get(skb->dev);
973         if (!idev) {
974                 if (net_ratelimit())
975                         ND_PRINTK1("ICMP6 RS: can't find in6 device\n");
976                 return;
977         }
978
979         /* Don't accept RS if we're not in router mode */
980         if (!idev->cnf.forwarding)
981                 goto out;
982
983         /*
984          * Don't update NCE if src = ::;
985          * this implies that the source node has no ip address assigned yet.
986          */
987         if (ipv6_addr_any(saddr))
988                 goto out;
989
990         /* Parse ND options */
991         if (!ndisc_parse_options(rs_msg->opt, ndoptlen, &ndopts)) {
992                 if (net_ratelimit())
993                         ND_PRINTK2("ICMP6 NS: invalid ND option, ignored\n");
994                 goto out;
995         }
996
997         if (ndopts.nd_opts_src_lladdr) {
998                 lladdr = ndisc_opt_addr_data(ndopts.nd_opts_src_lladdr,
999                                              skb->dev);
1000                 if (!lladdr)
1001                         goto out;
1002         }
1003
1004         neigh = __neigh_lookup(&nd_tbl, saddr, skb->dev, 1);
1005         if (neigh) {
1006                 neigh_update(neigh, lladdr, NUD_STALE,
1007                              NEIGH_UPDATE_F_WEAK_OVERRIDE|
1008                              NEIGH_UPDATE_F_OVERRIDE|
1009                              NEIGH_UPDATE_F_OVERRIDE_ISROUTER);
1010                 neigh_release(neigh);
1011         }
1012 out:
1013         in6_dev_put(idev);
1014 }
1015
1016 static void ndisc_ra_useropt(struct sk_buff *ra, struct nd_opt_hdr *opt)
1017 {
1018         struct icmp6hdr *icmp6h = (struct icmp6hdr *)skb_transport_header(ra);
1019         struct sk_buff *skb;
1020         struct nlmsghdr *nlh;
1021         struct nduseroptmsg *ndmsg;
1022         int err;
1023         int base_size = NLMSG_ALIGN(sizeof(struct nduseroptmsg)
1024                                     + (opt->nd_opt_len << 3));
1025         size_t msg_size = base_size + nla_total_size(sizeof(struct in6_addr));
1026
1027         skb = nlmsg_new(msg_size, GFP_ATOMIC);
1028         if (skb == NULL) {
1029                 err = -ENOBUFS;
1030                 goto errout;
1031         }
1032
1033         nlh = nlmsg_put(skb, 0, 0, RTM_NEWNDUSEROPT, base_size, 0);
1034         if (nlh == NULL) {
1035                 goto nla_put_failure;
1036         }
1037
1038         ndmsg = nlmsg_data(nlh);
1039         ndmsg->nduseropt_family = AF_INET6;
1040         ndmsg->nduseropt_icmp_type = icmp6h->icmp6_type;
1041         ndmsg->nduseropt_icmp_code = icmp6h->icmp6_code;
1042         ndmsg->nduseropt_opts_len = opt->nd_opt_len << 3;
1043
1044         memcpy(ndmsg + 1, opt, opt->nd_opt_len << 3);
1045
1046         NLA_PUT(skb, NDUSEROPT_SRCADDR, sizeof(struct in6_addr),
1047                 &ipv6_hdr(ra)->saddr);
1048         nlmsg_end(skb, nlh);
1049
1050         err = rtnl_notify(skb, 0, RTNLGRP_ND_USEROPT, NULL, GFP_ATOMIC);
1051         if (err < 0)
1052                 goto errout;
1053
1054         return;
1055
1056 nla_put_failure:
1057         nlmsg_free(skb);
1058         err = -EMSGSIZE;
1059 errout:
1060         rtnl_set_sk_err(RTNLGRP_ND_USEROPT, err);
1061 }
1062
1063 static void ndisc_router_discovery(struct sk_buff *skb)
1064 {
1065         struct ra_msg *ra_msg = (struct ra_msg *)skb_transport_header(skb);
1066         struct neighbour *neigh = NULL;
1067         struct inet6_dev *in6_dev;
1068         struct rt6_info *rt = NULL;
1069         int lifetime;
1070         struct ndisc_options ndopts;
1071         int optlen;
1072         unsigned int pref = 0;
1073
1074         __u8 * opt = (__u8 *)(ra_msg + 1);
1075
1076         optlen = (skb->tail - skb->transport_header) - sizeof(struct ra_msg);
1077
1078         if (!(ipv6_addr_type(&ipv6_hdr(skb)->saddr) & IPV6_ADDR_LINKLOCAL)) {
1079                 ND_PRINTK2(KERN_WARNING
1080                            "ICMPv6 RA: source address is not link-local.\n");
1081                 return;
1082         }
1083         if (optlen < 0) {
1084                 ND_PRINTK2(KERN_WARNING
1085                            "ICMPv6 RA: packet too short\n");
1086                 return;
1087         }
1088
1089         /*
1090          *      set the RA_RECV flag in the interface
1091          */
1092
1093         in6_dev = in6_dev_get(skb->dev);
1094         if (in6_dev == NULL) {
1095                 ND_PRINTK0(KERN_ERR
1096                            "ICMPv6 RA: can't find inet6 device for %s.\n",
1097                            skb->dev->name);
1098                 return;
1099         }
1100         if (in6_dev->cnf.forwarding || !in6_dev->cnf.accept_ra) {
1101                 in6_dev_put(in6_dev);
1102                 return;
1103         }
1104
1105         if (!ndisc_parse_options(opt, optlen, &ndopts)) {
1106                 in6_dev_put(in6_dev);
1107                 ND_PRINTK2(KERN_WARNING
1108                            "ICMP6 RA: invalid ND options\n");
1109                 return;
1110         }
1111
1112         if (in6_dev->if_flags & IF_RS_SENT) {
1113                 /*
1114                  *      flag that an RA was received after an RS was sent
1115                  *      out on this interface.
1116                  */
1117                 in6_dev->if_flags |= IF_RA_RCVD;
1118         }
1119
1120         /*
1121          * Remember the managed/otherconf flags from most recently
1122          * received RA message (RFC 2462) -- yoshfuji
1123          */
1124         in6_dev->if_flags = (in6_dev->if_flags & ~(IF_RA_MANAGED |
1125                                 IF_RA_OTHERCONF)) |
1126                                 (ra_msg->icmph.icmp6_addrconf_managed ?
1127                                         IF_RA_MANAGED : 0) |
1128                                 (ra_msg->icmph.icmp6_addrconf_other ?
1129                                         IF_RA_OTHERCONF : 0);
1130
1131         if (!in6_dev->cnf.accept_ra_defrtr)
1132                 goto skip_defrtr;
1133
1134         lifetime = ntohs(ra_msg->icmph.icmp6_rt_lifetime);
1135
1136 #ifdef CONFIG_IPV6_ROUTER_PREF
1137         pref = ra_msg->icmph.icmp6_router_pref;
1138         /* 10b is handled as if it were 00b (medium) */
1139         if (pref == ICMPV6_ROUTER_PREF_INVALID ||
1140             !in6_dev->cnf.accept_ra_rtr_pref)
1141                 pref = ICMPV6_ROUTER_PREF_MEDIUM;
1142 #endif
1143
1144         rt = rt6_get_dflt_router(&ipv6_hdr(skb)->saddr, skb->dev);
1145
1146         if (rt)
1147                 neigh = rt->rt6i_nexthop;
1148
1149         if (rt && lifetime == 0) {
1150                 neigh_clone(neigh);
1151                 ip6_del_rt(rt);
1152                 rt = NULL;
1153         }
1154
1155         if (rt == NULL && lifetime) {
1156                 ND_PRINTK3(KERN_DEBUG
1157                            "ICMPv6 RA: adding default router.\n");
1158
1159                 rt = rt6_add_dflt_router(&ipv6_hdr(skb)->saddr, skb->dev, pref);
1160                 if (rt == NULL) {
1161                         ND_PRINTK0(KERN_ERR
1162                                    "ICMPv6 RA: %s() failed to add default route.\n",
1163                                    __FUNCTION__);
1164                         in6_dev_put(in6_dev);
1165                         return;
1166                 }
1167
1168                 neigh = rt->rt6i_nexthop;
1169                 if (neigh == NULL) {
1170                         ND_PRINTK0(KERN_ERR
1171                                    "ICMPv6 RA: %s() got default router without neighbour.\n",
1172                                    __FUNCTION__);
1173                         dst_release(&rt->u.dst);
1174                         in6_dev_put(in6_dev);
1175                         return;
1176                 }
1177                 neigh->flags |= NTF_ROUTER;
1178         } else if (rt) {
1179                 rt->rt6i_flags |= (rt->rt6i_flags & ~RTF_PREF_MASK) | RTF_PREF(pref);
1180         }
1181
1182         if (rt)
1183                 rt->rt6i_expires = jiffies + (HZ * lifetime);
1184
1185         if (ra_msg->icmph.icmp6_hop_limit) {
1186                 in6_dev->cnf.hop_limit = ra_msg->icmph.icmp6_hop_limit;
1187                 if (rt)
1188                         rt->u.dst.metrics[RTAX_HOPLIMIT-1] = ra_msg->icmph.icmp6_hop_limit;
1189         }
1190
1191 skip_defrtr:
1192
1193         /*
1194          *      Update Reachable Time and Retrans Timer
1195          */
1196
1197         if (in6_dev->nd_parms) {
1198                 unsigned long rtime = ntohl(ra_msg->retrans_timer);
1199
1200                 if (rtime && rtime/1000 < MAX_SCHEDULE_TIMEOUT/HZ) {
1201                         rtime = (rtime*HZ)/1000;
1202                         if (rtime < HZ/10)
1203                                 rtime = HZ/10;
1204                         in6_dev->nd_parms->retrans_time = rtime;
1205                         in6_dev->tstamp = jiffies;
1206                         inet6_ifinfo_notify(RTM_NEWLINK, in6_dev);
1207                 }
1208
1209                 rtime = ntohl(ra_msg->reachable_time);
1210                 if (rtime && rtime/1000 < MAX_SCHEDULE_TIMEOUT/(3*HZ)) {
1211                         rtime = (rtime*HZ)/1000;
1212
1213                         if (rtime < HZ/10)
1214                                 rtime = HZ/10;
1215
1216                         if (rtime != in6_dev->nd_parms->base_reachable_time) {
1217                                 in6_dev->nd_parms->base_reachable_time = rtime;
1218                                 in6_dev->nd_parms->gc_staletime = 3 * rtime;
1219                                 in6_dev->nd_parms->reachable_time = neigh_rand_reach_time(rtime);
1220                                 in6_dev->tstamp = jiffies;
1221                                 inet6_ifinfo_notify(RTM_NEWLINK, in6_dev);
1222                         }
1223                 }
1224         }
1225
1226         /*
1227          *      Process options.
1228          */
1229
1230         if (!neigh)
1231                 neigh = __neigh_lookup(&nd_tbl, &ipv6_hdr(skb)->saddr,
1232                                        skb->dev, 1);
1233         if (neigh) {
1234                 u8 *lladdr = NULL;
1235                 if (ndopts.nd_opts_src_lladdr) {
1236                         lladdr = ndisc_opt_addr_data(ndopts.nd_opts_src_lladdr,
1237                                                      skb->dev);
1238                         if (!lladdr) {
1239                                 ND_PRINTK2(KERN_WARNING
1240                                            "ICMPv6 RA: invalid link-layer address length\n");
1241                                 goto out;
1242                         }
1243                 }
1244                 neigh_update(neigh, lladdr, NUD_STALE,
1245                              NEIGH_UPDATE_F_WEAK_OVERRIDE|
1246                              NEIGH_UPDATE_F_OVERRIDE|
1247                              NEIGH_UPDATE_F_OVERRIDE_ISROUTER|
1248                              NEIGH_UPDATE_F_ISROUTER);
1249         }
1250
1251 #ifdef CONFIG_IPV6_ROUTE_INFO
1252         if (in6_dev->cnf.accept_ra_rtr_pref && ndopts.nd_opts_ri) {
1253                 struct nd_opt_hdr *p;
1254                 for (p = ndopts.nd_opts_ri;
1255                      p;
1256                      p = ndisc_next_option(p, ndopts.nd_opts_ri_end)) {
1257                         if (((struct route_info *)p)->prefix_len > in6_dev->cnf.accept_ra_rt_info_max_plen)
1258                                 continue;
1259                         rt6_route_rcv(skb->dev, (u8*)p, (p->nd_opt_len) << 3,
1260                                       &ipv6_hdr(skb)->saddr);
1261                 }
1262         }
1263 #endif
1264
1265         if (in6_dev->cnf.accept_ra_pinfo && ndopts.nd_opts_pi) {
1266                 struct nd_opt_hdr *p;
1267                 for (p = ndopts.nd_opts_pi;
1268                      p;
1269                      p = ndisc_next_option(p, ndopts.nd_opts_pi_end)) {
1270                         addrconf_prefix_rcv(skb->dev, (u8*)p, (p->nd_opt_len) << 3);
1271                 }
1272         }
1273
1274         if (ndopts.nd_opts_mtu) {
1275                 __be32 n;
1276                 u32 mtu;
1277
1278                 memcpy(&n, ((u8*)(ndopts.nd_opts_mtu+1))+2, sizeof(mtu));
1279                 mtu = ntohl(n);
1280
1281                 if (mtu < IPV6_MIN_MTU || mtu > skb->dev->mtu) {
1282                         ND_PRINTK2(KERN_WARNING
1283                                    "ICMPv6 RA: invalid mtu: %d\n",
1284                                    mtu);
1285                 } else if (in6_dev->cnf.mtu6 != mtu) {
1286                         in6_dev->cnf.mtu6 = mtu;
1287
1288                         if (rt)
1289                                 rt->u.dst.metrics[RTAX_MTU-1] = mtu;
1290
1291                         rt6_mtu_change(skb->dev, mtu);
1292                 }
1293         }
1294
1295         if (ndopts.nd_useropts) {
1296                 struct nd_opt_hdr *opt;
1297                 for (opt = ndopts.nd_useropts;
1298                      opt;
1299                      opt = ndisc_next_useropt(opt, ndopts.nd_useropts_end)) {
1300                                 ndisc_ra_useropt(skb, opt);
1301                 }
1302         }
1303
1304         if (ndopts.nd_opts_tgt_lladdr || ndopts.nd_opts_rh) {
1305                 ND_PRINTK2(KERN_WARNING
1306                            "ICMPv6 RA: invalid RA options");
1307         }
1308 out:
1309         if (rt)
1310                 dst_release(&rt->u.dst);
1311         else if (neigh)
1312                 neigh_release(neigh);
1313         in6_dev_put(in6_dev);
1314 }
1315
1316 static void ndisc_redirect_rcv(struct sk_buff *skb)
1317 {
1318         struct inet6_dev *in6_dev;
1319         struct icmp6hdr *icmph;
1320         struct in6_addr *dest;
1321         struct in6_addr *target;        /* new first hop to destination */
1322         struct neighbour *neigh;
1323         int on_link = 0;
1324         struct ndisc_options ndopts;
1325         int optlen;
1326         u8 *lladdr = NULL;
1327
1328         if (!(ipv6_addr_type(&ipv6_hdr(skb)->saddr) & IPV6_ADDR_LINKLOCAL)) {
1329                 ND_PRINTK2(KERN_WARNING
1330                            "ICMPv6 Redirect: source address is not link-local.\n");
1331                 return;
1332         }
1333
1334         optlen = skb->tail - skb->transport_header;
1335         optlen -= sizeof(struct icmp6hdr) + 2 * sizeof(struct in6_addr);
1336
1337         if (optlen < 0) {
1338                 ND_PRINTK2(KERN_WARNING
1339                            "ICMPv6 Redirect: packet too short\n");
1340                 return;
1341         }
1342
1343         icmph = icmp6_hdr(skb);
1344         target = (struct in6_addr *) (icmph + 1);
1345         dest = target + 1;
1346
1347         if (ipv6_addr_is_multicast(dest)) {
1348                 ND_PRINTK2(KERN_WARNING
1349                            "ICMPv6 Redirect: destination address is multicast.\n");
1350                 return;
1351         }
1352
1353         if (ipv6_addr_equal(dest, target)) {
1354                 on_link = 1;
1355         } else if (ipv6_addr_type(target) !=
1356                    (IPV6_ADDR_UNICAST|IPV6_ADDR_LINKLOCAL)) {
1357                 ND_PRINTK2(KERN_WARNING
1358                            "ICMPv6 Redirect: target address is not link-local unicast.\n");
1359                 return;
1360         }
1361
1362         in6_dev = in6_dev_get(skb->dev);
1363         if (!in6_dev)
1364                 return;
1365         if (in6_dev->cnf.forwarding || !in6_dev->cnf.accept_redirects) {
1366                 in6_dev_put(in6_dev);
1367                 return;
1368         }
1369
1370         /* RFC2461 8.1:
1371          *      The IP source address of the Redirect MUST be the same as the current
1372          *      first-hop router for the specified ICMP Destination Address.
1373          */
1374
1375         if (!ndisc_parse_options((u8*)(dest + 1), optlen, &ndopts)) {
1376                 ND_PRINTK2(KERN_WARNING
1377                            "ICMPv6 Redirect: invalid ND options\n");
1378                 in6_dev_put(in6_dev);
1379                 return;
1380         }
1381         if (ndopts.nd_opts_tgt_lladdr) {
1382                 lladdr = ndisc_opt_addr_data(ndopts.nd_opts_tgt_lladdr,
1383                                              skb->dev);
1384                 if (!lladdr) {
1385                         ND_PRINTK2(KERN_WARNING
1386                                    "ICMPv6 Redirect: invalid link-layer address length\n");
1387                         in6_dev_put(in6_dev);
1388                         return;
1389                 }
1390         }
1391
1392         neigh = __neigh_lookup(&nd_tbl, target, skb->dev, 1);
1393         if (neigh) {
1394                 rt6_redirect(dest, &ipv6_hdr(skb)->daddr,
1395                              &ipv6_hdr(skb)->saddr, neigh, lladdr,
1396                              on_link);
1397                 neigh_release(neigh);
1398         }
1399         in6_dev_put(in6_dev);
1400 }
1401
1402 void ndisc_send_redirect(struct sk_buff *skb, struct neighbour *neigh,
1403                          struct in6_addr *target)
1404 {
1405         struct sock *sk = ndisc_socket->sk;
1406         int len = sizeof(struct icmp6hdr) + 2 * sizeof(struct in6_addr);
1407         struct sk_buff *buff;
1408         struct icmp6hdr *icmph;
1409         struct in6_addr saddr_buf;
1410         struct in6_addr *addrp;
1411         struct net_device *dev;
1412         struct rt6_info *rt;
1413         struct dst_entry *dst;
1414         struct inet6_dev *idev;
1415         struct flowi fl;
1416         u8 *opt;
1417         int rd_len;
1418         int err;
1419         int hlen;
1420         u8 ha_buf[MAX_ADDR_LEN], *ha = NULL;
1421
1422         dev = skb->dev;
1423
1424         if (ipv6_get_lladdr(dev, &saddr_buf, IFA_F_TENTATIVE)) {
1425                 ND_PRINTK2(KERN_WARNING
1426                            "ICMPv6 Redirect: no link-local address on %s\n",
1427                            dev->name);
1428                 return;
1429         }
1430
1431         if (!ipv6_addr_equal(&ipv6_hdr(skb)->daddr, target) &&
1432             ipv6_addr_type(target) != (IPV6_ADDR_UNICAST|IPV6_ADDR_LINKLOCAL)) {
1433                 ND_PRINTK2(KERN_WARNING
1434                         "ICMPv6 Redirect: target address is not link-local unicast.\n");
1435                 return;
1436         }
1437
1438         ndisc_flow_init(&fl, NDISC_REDIRECT, &saddr_buf, &ipv6_hdr(skb)->saddr,
1439                         dev->ifindex);
1440
1441         dst = ip6_route_output(NULL, &fl);
1442         if (dst == NULL)
1443                 return;
1444
1445         err = xfrm_lookup(&dst, &fl, NULL, 0);
1446         if (err)
1447                 return;
1448
1449         rt = (struct rt6_info *) dst;
1450
1451         if (rt->rt6i_flags & RTF_GATEWAY) {
1452                 ND_PRINTK2(KERN_WARNING
1453                            "ICMPv6 Redirect: destination is not a neighbour.\n");
1454                 dst_release(dst);
1455                 return;
1456         }
1457         if (!xrlim_allow(dst, 1*HZ)) {
1458                 dst_release(dst);
1459                 return;
1460         }
1461
1462         if (dev->addr_len) {
1463                 read_lock_bh(&neigh->lock);
1464                 if (neigh->nud_state & NUD_VALID) {
1465                         memcpy(ha_buf, neigh->ha, dev->addr_len);
1466                         read_unlock_bh(&neigh->lock);
1467                         ha = ha_buf;
1468                         len += ndisc_opt_addr_space(dev);
1469                 } else
1470                         read_unlock_bh(&neigh->lock);
1471         }
1472
1473         rd_len = min_t(unsigned int,
1474                      IPV6_MIN_MTU-sizeof(struct ipv6hdr)-len, skb->len + 8);
1475         rd_len &= ~0x7;
1476         len += rd_len;
1477
1478         buff = sock_alloc_send_skb(sk,
1479                                    (MAX_HEADER + sizeof(struct ipv6hdr) +
1480                                     len + LL_RESERVED_SPACE(dev)),
1481                                    1, &err);
1482         if (buff == NULL) {
1483                 ND_PRINTK0(KERN_ERR
1484                            "ICMPv6 Redirect: %s() failed to allocate an skb.\n",
1485                            __FUNCTION__);
1486                 dst_release(dst);
1487                 return;
1488         }
1489
1490         hlen = 0;
1491
1492         skb_reserve(buff, LL_RESERVED_SPACE(dev));
1493         ip6_nd_hdr(sk, buff, dev, &saddr_buf, &ipv6_hdr(skb)->saddr,
1494                    IPPROTO_ICMPV6, len);
1495
1496         skb_set_transport_header(buff, skb_tail_pointer(buff) - buff->data);
1497         skb_put(buff, len);
1498         icmph = icmp6_hdr(buff);
1499
1500         memset(icmph, 0, sizeof(struct icmp6hdr));
1501         icmph->icmp6_type = NDISC_REDIRECT;
1502
1503         /*
1504          *      copy target and destination addresses
1505          */
1506
1507         addrp = (struct in6_addr *)(icmph + 1);
1508         ipv6_addr_copy(addrp, target);
1509         addrp++;
1510         ipv6_addr_copy(addrp, &ipv6_hdr(skb)->daddr);
1511
1512         opt = (u8*) (addrp + 1);
1513
1514         /*
1515          *      include target_address option
1516          */
1517
1518         if (ha)
1519                 opt = ndisc_fill_addr_option(opt, ND_OPT_TARGET_LL_ADDR, ha,
1520                                              dev->addr_len, dev->type);
1521
1522         /*
1523          *      build redirect option and copy skb over to the new packet.
1524          */
1525
1526         memset(opt, 0, 8);
1527         *(opt++) = ND_OPT_REDIRECT_HDR;
1528         *(opt++) = (rd_len >> 3);
1529         opt += 6;
1530
1531         memcpy(opt, ipv6_hdr(skb), rd_len - 8);
1532
1533         icmph->icmp6_cksum = csum_ipv6_magic(&saddr_buf, &ipv6_hdr(skb)->saddr,
1534                                              len, IPPROTO_ICMPV6,
1535                                              csum_partial((u8 *) icmph, len, 0));
1536
1537         buff->dst = dst;
1538         idev = in6_dev_get(dst->dev);
1539         IP6_INC_STATS(idev, IPSTATS_MIB_OUTREQUESTS);
1540         err = NF_HOOK(PF_INET6, NF_IP6_LOCAL_OUT, buff, NULL, dst->dev, dst_output);
1541         if (!err) {
1542                 ICMP6MSGOUT_INC_STATS(idev, NDISC_REDIRECT);
1543                 ICMP6_INC_STATS(idev, ICMP6_MIB_OUTMSGS);
1544         }
1545
1546         if (likely(idev != NULL))
1547                 in6_dev_put(idev);
1548 }
1549
1550 static void pndisc_redo(struct sk_buff *skb)
1551 {
1552         ndisc_recv_ns(skb);
1553         kfree_skb(skb);
1554 }
1555
1556 int ndisc_rcv(struct sk_buff *skb)
1557 {
1558         struct nd_msg *msg;
1559
1560         if (!pskb_may_pull(skb, skb->len))
1561                 return 0;
1562
1563         msg = (struct nd_msg *)skb_transport_header(skb);
1564
1565         __skb_push(skb, skb->data - skb_transport_header(skb));
1566
1567         if (ipv6_hdr(skb)->hop_limit != 255) {
1568                 ND_PRINTK2(KERN_WARNING
1569                            "ICMPv6 NDISC: invalid hop-limit: %d\n",
1570                            ipv6_hdr(skb)->hop_limit);
1571                 return 0;
1572         }
1573
1574         if (msg->icmph.icmp6_code != 0) {
1575                 ND_PRINTK2(KERN_WARNING
1576                            "ICMPv6 NDISC: invalid ICMPv6 code: %d\n",
1577                            msg->icmph.icmp6_code);
1578                 return 0;
1579         }
1580
1581         memset(NEIGH_CB(skb), 0, sizeof(struct neighbour_cb));
1582
1583         switch (msg->icmph.icmp6_type) {
1584         case NDISC_NEIGHBOUR_SOLICITATION:
1585                 ndisc_recv_ns(skb);
1586                 break;
1587
1588         case NDISC_NEIGHBOUR_ADVERTISEMENT:
1589                 ndisc_recv_na(skb);
1590                 break;
1591
1592         case NDISC_ROUTER_SOLICITATION:
1593                 ndisc_recv_rs(skb);
1594                 break;
1595
1596         case NDISC_ROUTER_ADVERTISEMENT:
1597                 ndisc_router_discovery(skb);
1598                 break;
1599
1600         case NDISC_REDIRECT:
1601                 ndisc_redirect_rcv(skb);
1602                 break;
1603         }
1604
1605         return 0;
1606 }
1607
1608 static int ndisc_netdev_event(struct notifier_block *this, unsigned long event, void *ptr)
1609 {
1610         struct net_device *dev = ptr;
1611
1612         if (dev->nd_net != &init_net)
1613                 return NOTIFY_DONE;
1614
1615         switch (event) {
1616         case NETDEV_CHANGEADDR:
1617                 neigh_changeaddr(&nd_tbl, dev);
1618                 fib6_run_gc(~0UL);
1619                 break;
1620         case NETDEV_DOWN:
1621                 neigh_ifdown(&nd_tbl, dev);
1622                 fib6_run_gc(~0UL);
1623                 break;
1624         default:
1625                 break;
1626         }
1627
1628         return NOTIFY_DONE;
1629 }
1630
1631 static struct notifier_block ndisc_netdev_notifier = {
1632         .notifier_call = ndisc_netdev_event,
1633 };
1634
1635 #ifdef CONFIG_SYSCTL
1636 static void ndisc_warn_deprecated_sysctl(struct ctl_table *ctl,
1637                                          const char *func, const char *dev_name)
1638 {
1639         static char warncomm[TASK_COMM_LEN];
1640         static int warned;
1641         if (strcmp(warncomm, current->comm) && warned < 5) {
1642                 strcpy(warncomm, current->comm);
1643                 printk(KERN_WARNING
1644                         "process `%s' is using deprecated sysctl (%s) "
1645                         "net.ipv6.neigh.%s.%s; "
1646                         "Use net.ipv6.neigh.%s.%s_ms "
1647                         "instead.\n",
1648                         warncomm, func,
1649                         dev_name, ctl->procname,
1650                         dev_name, ctl->procname);
1651                 warned++;
1652         }
1653 }
1654
1655 int ndisc_ifinfo_sysctl_change(struct ctl_table *ctl, int write, struct file * filp, void __user *buffer, size_t *lenp, loff_t *ppos)
1656 {
1657         struct net_device *dev = ctl->extra1;
1658         struct inet6_dev *idev;
1659         int ret;
1660
1661         if ((strcmp(ctl->procname, "retrans_time") == 0) ||
1662             (strcmp(ctl->procname, "base_reachable_time") == 0))
1663                 ndisc_warn_deprecated_sysctl(ctl, "syscall", dev ? dev->name : "default");
1664
1665         if (strcmp(ctl->procname, "retrans_time") == 0)
1666                 ret = proc_dointvec(ctl, write, filp, buffer, lenp, ppos);
1667
1668         else if (strcmp(ctl->procname, "base_reachable_time") == 0)
1669                 ret = proc_dointvec_jiffies(ctl, write,
1670                                             filp, buffer, lenp, ppos);
1671
1672         else if ((strcmp(ctl->procname, "retrans_time_ms") == 0) ||
1673                  (strcmp(ctl->procname, "base_reacable_time_ms") == 0))
1674                 ret = proc_dointvec_ms_jiffies(ctl, write,
1675                                                filp, buffer, lenp, ppos);
1676         else
1677                 ret = -1;
1678
1679         if (write && ret == 0 && dev && (idev = in6_dev_get(dev)) != NULL) {
1680                 if (ctl->data == &idev->nd_parms->base_reachable_time)
1681                         idev->nd_parms->reachable_time = neigh_rand_reach_time(idev->nd_parms->base_reachable_time);
1682                 idev->tstamp = jiffies;
1683                 inet6_ifinfo_notify(RTM_NEWLINK, idev);
1684                 in6_dev_put(idev);
1685         }
1686         return ret;
1687 }
1688
1689 static int ndisc_ifinfo_sysctl_strategy(ctl_table *ctl, int __user *name,
1690                                         int nlen, void __user *oldval,
1691                                         size_t __user *oldlenp,
1692                                         void __user *newval, size_t newlen)
1693 {
1694         struct net_device *dev = ctl->extra1;
1695         struct inet6_dev *idev;
1696         int ret;
1697
1698         if (ctl->ctl_name == NET_NEIGH_RETRANS_TIME ||
1699             ctl->ctl_name == NET_NEIGH_REACHABLE_TIME)
1700                 ndisc_warn_deprecated_sysctl(ctl, "procfs", dev ? dev->name : "default");
1701
1702         switch (ctl->ctl_name) {
1703         case NET_NEIGH_REACHABLE_TIME:
1704                 ret = sysctl_jiffies(ctl, name, nlen,
1705                                      oldval, oldlenp, newval, newlen);
1706                 break;
1707         case NET_NEIGH_RETRANS_TIME_MS:
1708         case NET_NEIGH_REACHABLE_TIME_MS:
1709                  ret = sysctl_ms_jiffies(ctl, name, nlen,
1710                                          oldval, oldlenp, newval, newlen);
1711                  break;
1712         default:
1713                 ret = 0;
1714         }
1715
1716         if (newval && newlen && ret > 0 &&
1717             dev && (idev = in6_dev_get(dev)) != NULL) {
1718                 if (ctl->ctl_name == NET_NEIGH_REACHABLE_TIME ||
1719                     ctl->ctl_name == NET_NEIGH_REACHABLE_TIME_MS)
1720                         idev->nd_parms->reachable_time = neigh_rand_reach_time(idev->nd_parms->base_reachable_time);
1721                 idev->tstamp = jiffies;
1722                 inet6_ifinfo_notify(RTM_NEWLINK, idev);
1723                 in6_dev_put(idev);
1724         }
1725
1726         return ret;
1727 }
1728
1729 #endif
1730
1731 int __init ndisc_init(struct net_proto_family *ops)
1732 {
1733         struct ipv6_pinfo *np;
1734         struct sock *sk;
1735         int err;
1736
1737         err = sock_create_kern(PF_INET6, SOCK_RAW, IPPROTO_ICMPV6, &ndisc_socket);
1738         if (err < 0) {
1739                 ND_PRINTK0(KERN_ERR
1740                            "ICMPv6 NDISC: Failed to initialize the control socket (err %d).\n",
1741                            err);
1742                 ndisc_socket = NULL; /* For safety. */
1743                 return err;
1744         }
1745
1746         sk = ndisc_socket->sk;
1747         np = inet6_sk(sk);
1748         sk->sk_allocation = GFP_ATOMIC;
1749         np->hop_limit = 255;
1750         /* Do not loopback ndisc messages */
1751         np->mc_loop = 0;
1752         sk->sk_prot->unhash(sk);
1753
1754         /*
1755          * Initialize the neighbour table
1756          */
1757
1758         neigh_table_init(&nd_tbl);
1759
1760 #ifdef CONFIG_SYSCTL
1761         neigh_sysctl_register(NULL, &nd_tbl.parms, NET_IPV6, NET_IPV6_NEIGH,
1762                               "ipv6",
1763                               &ndisc_ifinfo_sysctl_change,
1764                               &ndisc_ifinfo_sysctl_strategy);
1765 #endif
1766
1767         register_netdevice_notifier(&ndisc_netdev_notifier);
1768         return 0;
1769 }
1770
1771 void ndisc_cleanup(void)
1772 {
1773         unregister_netdevice_notifier(&ndisc_netdev_notifier);
1774 #ifdef CONFIG_SYSCTL
1775         neigh_sysctl_unregister(&nd_tbl.parms);
1776 #endif
1777         neigh_table_clear(&nd_tbl);
1778         sock_release(ndisc_socket);
1779         ndisc_socket = NULL; /* For safety. */
1780 }