1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65#include <linux/module.h>
66#include <linux/types.h>
67#include <linux/jiffies.h>
68#include <linux/kernel.h>
69#include <linux/fcntl.h>
70#include <linux/socket.h>
71#include <linux/in.h>
72#include <linux/inet.h>
73#include <linux/inetdevice.h>
74#include <linux/netdevice.h>
75#include <linux/string.h>
76#include <linux/netfilter_ipv4.h>
77#include <net/snmp.h>
78#include <net/ip.h>
79#include <net/route.h>
80#include <net/protocol.h>
81#include <net/icmp.h>
82#include <net/tcp.h>
83#include <net/udp.h>
84#include <net/raw.h>
85#include <linux/skbuff.h>
86#include <net/sock.h>
87#include <linux/errno.h>
88#include <linux/timer.h>
89#include <linux/init.h>
90#include <asm/system.h>
91#include <asm/uaccess.h>
92#include <net/checksum.h>
93#include <net/xfrm.h>
94#include <net/inet_common.h>
95
96
97
98
99
100struct icmp_bxm {
101 struct sk_buff *skb;
102 int offset;
103 int data_len;
104
105 struct {
106 struct icmphdr icmph;
107 __be32 times[3];
108 } data;
109 int head_len;
110 struct ip_options replyopts;
111 unsigned char optbuf[40];
112};
113
114
115
116
117struct icmp_err icmp_err_convert[] = {
118 {
119 .errno = ENETUNREACH,
120 .fatal = 0,
121 },
122 {
123 .errno = EHOSTUNREACH,
124 .fatal = 0,
125 },
126 {
127 .errno = ENOPROTOOPT ,
128 .fatal = 1,
129 },
130 {
131 .errno = ECONNREFUSED,
132 .fatal = 1,
133 },
134 {
135 .errno = EMSGSIZE,
136 .fatal = 0,
137 },
138 {
139 .errno = EOPNOTSUPP,
140 .fatal = 0,
141 },
142 {
143 .errno = ENETUNREACH,
144 .fatal = 1,
145 },
146 {
147 .errno = EHOSTDOWN,
148 .fatal = 1,
149 },
150 {
151 .errno = ENONET,
152 .fatal = 1,
153 },
154 {
155 .errno = ENETUNREACH,
156 .fatal = 1,
157 },
158 {
159 .errno = EHOSTUNREACH,
160 .fatal = 1,
161 },
162 {
163 .errno = ENETUNREACH,
164 .fatal = 0,
165 },
166 {
167 .errno = EHOSTUNREACH,
168 .fatal = 0,
169 },
170 {
171 .errno = EHOSTUNREACH,
172 .fatal = 1,
173 },
174 {
175 .errno = EHOSTUNREACH,
176 .fatal = 1,
177 },
178 {
179 .errno = EHOSTUNREACH,
180 .fatal = 1,
181 },
182};
183
184
185
186
187
188struct icmp_control {
189 void (*handler)(struct sk_buff *skb);
190 short error;
191};
192
193static const struct icmp_control icmp_pointers[NR_ICMP_TYPES+1];
194
195
196
197
198
199
200
201
202static struct sock *icmp_sk(struct net *net)
203{
204 return net->ipv4.icmp_sk[smp_processor_id()];
205}
206
207static inline struct sock *icmp_xmit_lock(struct net *net)
208{
209 struct sock *sk;
210
211 local_bh_disable();
212
213 sk = icmp_sk(net);
214
215 if (unlikely(!spin_trylock(&sk->sk_lock.slock))) {
216
217
218
219 local_bh_enable();
220 return NULL;
221 }
222 return sk;
223}
224
225static inline void icmp_xmit_unlock(struct sock *sk)
226{
227 spin_unlock_bh(&sk->sk_lock.slock);
228}
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251#define XRLIM_BURST_FACTOR 6
252int xrlim_allow(struct dst_entry *dst, int timeout)
253{
254 unsigned long now, token = dst->rate_tokens;
255 int rc = 0;
256
257 now = jiffies;
258 token += now - dst->rate_last;
259 dst->rate_last = now;
260 if (token > XRLIM_BURST_FACTOR * timeout)
261 token = XRLIM_BURST_FACTOR * timeout;
262 if (token >= timeout) {
263 token -= timeout;
264 rc = 1;
265 }
266 dst->rate_tokens = token;
267 return rc;
268}
269
270static inline int icmpv4_xrlim_allow(struct net *net, struct rtable *rt,
271 int type, int code)
272{
273 struct dst_entry *dst = &rt->u.dst;
274 int rc = 1;
275
276 if (type > NR_ICMP_TYPES)
277 goto out;
278
279
280 if (type == ICMP_DEST_UNREACH && code == ICMP_FRAG_NEEDED)
281 goto out;
282
283
284 if (dst->dev && (dst->dev->flags&IFF_LOOPBACK))
285 goto out;
286
287
288 if ((1 << type) & net->ipv4.sysctl_icmp_ratemask)
289 rc = xrlim_allow(dst, net->ipv4.sysctl_icmp_ratelimit);
290out:
291 return rc;
292}
293
294
295
296
297void icmp_out_count(struct net *net, unsigned char type)
298{
299 ICMPMSGOUT_INC_STATS(net, type);
300 ICMP_INC_STATS(net, ICMP_MIB_OUTMSGS);
301}
302
303
304
305
306
307static int icmp_glue_bits(void *from, char *to, int offset, int len, int odd,
308 struct sk_buff *skb)
309{
310 struct icmp_bxm *icmp_param = (struct icmp_bxm *)from;
311 __wsum csum;
312
313 csum = skb_copy_and_csum_bits(icmp_param->skb,
314 icmp_param->offset + offset,
315 to, len, 0);
316
317 skb->csum = csum_block_add(skb->csum, csum, odd);
318 if (icmp_pointers[icmp_param->data.icmph.type].error)
319 nf_ct_attach(skb, icmp_param->skb);
320 return 0;
321}
322
323static void icmp_push_reply(struct icmp_bxm *icmp_param,
324 struct ipcm_cookie *ipc, struct rtable *rt)
325{
326 struct sock *sk;
327 struct sk_buff *skb;
328
329 sk = icmp_sk(dev_net(rt->u.dst.dev));
330 if (ip_append_data(sk, icmp_glue_bits, icmp_param,
331 icmp_param->data_len+icmp_param->head_len,
332 icmp_param->head_len,
333 ipc, rt, MSG_DONTWAIT) < 0)
334 ip_flush_pending_frames(sk);
335 else if ((skb = skb_peek(&sk->sk_write_queue)) != NULL) {
336 struct icmphdr *icmph = icmp_hdr(skb);
337 __wsum csum = 0;
338 struct sk_buff *skb1;
339
340 skb_queue_walk(&sk->sk_write_queue, skb1) {
341 csum = csum_add(csum, skb1->csum);
342 }
343 csum = csum_partial_copy_nocheck((void *)&icmp_param->data,
344 (char *)icmph,
345 icmp_param->head_len, csum);
346 icmph->checksum = csum_fold(csum);
347 skb->ip_summed = CHECKSUM_NONE;
348 ip_push_pending_frames(sk);
349 }
350}
351
352
353
354
355
356static void icmp_reply(struct icmp_bxm *icmp_param, struct sk_buff *skb)
357{
358 struct ipcm_cookie ipc;
359 struct rtable *rt = skb->rtable;
360 struct net *net = dev_net(rt->u.dst.dev);
361 struct sock *sk;
362 struct inet_sock *inet;
363 __be32 daddr;
364
365 if (ip_options_echo(&icmp_param->replyopts, skb))
366 return;
367
368 sk = icmp_xmit_lock(net);
369 if (sk == NULL)
370 return;
371 inet = inet_sk(sk);
372
373 icmp_param->data.icmph.checksum = 0;
374
375 inet->tos = ip_hdr(skb)->tos;
376 daddr = ipc.addr = rt->rt_src;
377 ipc.opt = NULL;
378 if (icmp_param->replyopts.optlen) {
379 ipc.opt = &icmp_param->replyopts;
380 if (ipc.opt->srr)
381 daddr = icmp_param->replyopts.faddr;
382 }
383 {
384 struct flowi fl = { .nl_u = { .ip4_u =
385 { .daddr = daddr,
386 .saddr = rt->rt_spec_dst,
387 .tos = RT_TOS(ip_hdr(skb)->tos) } },
388 .proto = IPPROTO_ICMP };
389 security_skb_classify_flow(skb, &fl);
390 if (ip_route_output_key(net, &rt, &fl))
391 goto out_unlock;
392 }
393 if (icmpv4_xrlim_allow(net, rt, icmp_param->data.icmph.type,
394 icmp_param->data.icmph.code))
395 icmp_push_reply(icmp_param, &ipc, rt);
396 ip_rt_put(rt);
397out_unlock:
398 icmp_xmit_unlock(sk);
399}
400
401
402
403
404
405
406
407
408
409
410
411
412
413void icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info)
414{
415 struct iphdr *iph;
416 int room;
417 struct icmp_bxm icmp_param;
418 struct rtable *rt = skb_in->rtable;
419 struct ipcm_cookie ipc;
420 __be32 saddr;
421 u8 tos;
422 struct net *net;
423 struct sock *sk;
424
425 if (!rt)
426 goto out;
427 net = dev_net(rt->u.dst.dev);
428
429
430
431
432
433
434 iph = ip_hdr(skb_in);
435
436 if ((u8 *)iph < skb_in->head ||
437 (skb_in->network_header + sizeof(*iph)) > skb_in->tail)
438 goto out;
439
440
441
442
443 if (skb_in->pkt_type != PACKET_HOST)
444 goto out;
445
446
447
448
449 if (rt->rt_flags & (RTCF_BROADCAST | RTCF_MULTICAST))
450 goto out;
451
452
453
454
455
456 if (iph->frag_off & htons(IP_OFFSET))
457 goto out;
458
459
460
461
462 if (icmp_pointers[type].error) {
463
464
465
466
467 if (iph->protocol == IPPROTO_ICMP) {
468 u8 _inner_type, *itp;
469
470 itp = skb_header_pointer(skb_in,
471 skb_network_header(skb_in) +
472 (iph->ihl << 2) +
473 offsetof(struct icmphdr,
474 type) -
475 skb_in->data,
476 sizeof(_inner_type),
477 &_inner_type);
478 if (itp == NULL)
479 goto out;
480
481
482
483
484
485 if (*itp > NR_ICMP_TYPES ||
486 icmp_pointers[*itp].error)
487 goto out;
488 }
489 }
490
491 sk = icmp_xmit_lock(net);
492 if (sk == NULL)
493 return;
494
495
496
497
498
499 saddr = iph->daddr;
500 if (!(rt->rt_flags & RTCF_LOCAL)) {
501 struct net_device *dev = NULL;
502
503 if (rt->fl.iif &&
504 net->ipv4.sysctl_icmp_errors_use_inbound_ifaddr)
505 dev = dev_get_by_index(net, rt->fl.iif);
506
507 if (dev) {
508 saddr = inet_select_addr(dev, 0, RT_SCOPE_LINK);
509 dev_put(dev);
510 } else
511 saddr = 0;
512 }
513
514 tos = icmp_pointers[type].error ? ((iph->tos & IPTOS_TOS_MASK) |
515 IPTOS_PREC_INTERNETCONTROL) :
516 iph->tos;
517
518 if (ip_options_echo(&icmp_param.replyopts, skb_in))
519 goto out_unlock;
520
521
522
523
524
525
526 icmp_param.data.icmph.type = type;
527 icmp_param.data.icmph.code = code;
528 icmp_param.data.icmph.un.gateway = info;
529 icmp_param.data.icmph.checksum = 0;
530 icmp_param.skb = skb_in;
531 icmp_param.offset = skb_network_offset(skb_in);
532 inet_sk(sk)->tos = tos;
533 ipc.addr = iph->saddr;
534 ipc.opt = &icmp_param.replyopts;
535
536 {
537 struct flowi fl = {
538 .nl_u = {
539 .ip4_u = {
540 .daddr = icmp_param.replyopts.srr ?
541 icmp_param.replyopts.faddr :
542 iph->saddr,
543 .saddr = saddr,
544 .tos = RT_TOS(tos)
545 }
546 },
547 .proto = IPPROTO_ICMP,
548 .uli_u = {
549 .icmpt = {
550 .type = type,
551 .code = code
552 }
553 }
554 };
555 int err;
556 struct rtable *rt2;
557
558 security_skb_classify_flow(skb_in, &fl);
559 if (__ip_route_output_key(net, &rt, &fl))
560 goto out_unlock;
561
562
563 rt2 = rt;
564
565 err = xfrm_lookup((struct dst_entry **)&rt, &fl, NULL, 0);
566 switch (err) {
567 case 0:
568 if (rt != rt2)
569 goto route_done;
570 break;
571 case -EPERM:
572 rt = NULL;
573 break;
574 default:
575 goto out_unlock;
576 }
577
578 if (xfrm_decode_session_reverse(skb_in, &fl, AF_INET))
579 goto relookup_failed;
580
581 if (inet_addr_type(net, fl.fl4_src) == RTN_LOCAL)
582 err = __ip_route_output_key(net, &rt2, &fl);
583 else {
584 struct flowi fl2 = {};
585 struct dst_entry *odst;
586
587 fl2.fl4_dst = fl.fl4_src;
588 if (ip_route_output_key(net, &rt2, &fl2))
589 goto relookup_failed;
590
591
592 odst = skb_in->dst;
593 err = ip_route_input(skb_in, fl.fl4_dst, fl.fl4_src,
594 RT_TOS(tos), rt2->u.dst.dev);
595
596 dst_release(&rt2->u.dst);
597 rt2 = skb_in->rtable;
598 skb_in->dst = odst;
599 }
600
601 if (err)
602 goto relookup_failed;
603
604 err = xfrm_lookup((struct dst_entry **)&rt2, &fl, NULL,
605 XFRM_LOOKUP_ICMP);
606 switch (err) {
607 case 0:
608 dst_release(&rt->u.dst);
609 rt = rt2;
610 break;
611 case -EPERM:
612 goto ende;
613 default:
614relookup_failed:
615 if (!rt)
616 goto out_unlock;
617 break;
618 }
619 }
620
621route_done:
622 if (!icmpv4_xrlim_allow(net, rt, type, code))
623 goto ende;
624
625
626
627 room = dst_mtu(&rt->u.dst);
628 if (room > 576)
629 room = 576;
630 room -= sizeof(struct iphdr) + icmp_param.replyopts.optlen;
631 room -= sizeof(struct icmphdr);
632
633 icmp_param.data_len = skb_in->len - icmp_param.offset;
634 if (icmp_param.data_len > room)
635 icmp_param.data_len = room;
636 icmp_param.head_len = sizeof(struct icmphdr);
637
638 icmp_push_reply(&icmp_param, &ipc, rt);
639ende:
640 ip_rt_put(rt);
641out_unlock:
642 icmp_xmit_unlock(sk);
643out:;
644}
645
646
647
648
649
650
651static void icmp_unreach(struct sk_buff *skb)
652{
653 struct iphdr *iph;
654 struct icmphdr *icmph;
655 int hash, protocol;
656 struct net_protocol *ipprot;
657 u32 info = 0;
658 struct net *net;
659
660 net = dev_net(skb->dst->dev);
661
662
663
664
665
666
667
668 if (!pskb_may_pull(skb, sizeof(struct iphdr)))
669 goto out_err;
670
671 icmph = icmp_hdr(skb);
672 iph = (struct iphdr *)skb->data;
673
674 if (iph->ihl < 5)
675 goto out_err;
676
677 if (icmph->type == ICMP_DEST_UNREACH) {
678 switch (icmph->code & 15) {
679 case ICMP_NET_UNREACH:
680 case ICMP_HOST_UNREACH:
681 case ICMP_PROT_UNREACH:
682 case ICMP_PORT_UNREACH:
683 break;
684 case ICMP_FRAG_NEEDED:
685 if (ipv4_config.no_pmtu_disc) {
686 LIMIT_NETDEBUG(KERN_INFO "ICMP: " NIPQUAD_FMT ": "
687 "fragmentation needed "
688 "and DF set.\n",
689 NIPQUAD(iph->daddr));
690 } else {
691 info = ip_rt_frag_needed(net, iph,
692 ntohs(icmph->un.frag.mtu),
693 skb->dev);
694 if (!info)
695 goto out;
696 }
697 break;
698 case ICMP_SR_FAILED:
699 LIMIT_NETDEBUG(KERN_INFO "ICMP: " NIPQUAD_FMT ": Source "
700 "Route Failed.\n",
701 NIPQUAD(iph->daddr));
702 break;
703 default:
704 break;
705 }
706 if (icmph->code > NR_ICMP_UNREACH)
707 goto out;
708 } else if (icmph->type == ICMP_PARAMETERPROB)
709 info = ntohl(icmph->un.gateway) >> 24;
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729 if (!net->ipv4.sysctl_icmp_ignore_bogus_error_responses &&
730 inet_addr_type(net, iph->daddr) == RTN_BROADCAST) {
731 if (net_ratelimit())
732 printk(KERN_WARNING NIPQUAD_FMT " sent an invalid ICMP "
733 "type %u, code %u "
734 "error to a broadcast: " NIPQUAD_FMT " on %s\n",
735 NIPQUAD(ip_hdr(skb)->saddr),
736 icmph->type, icmph->code,
737 NIPQUAD(iph->daddr),
738 skb->dev->name);
739 goto out;
740 }
741
742
743
744
745 if (!pskb_may_pull(skb, iph->ihl * 4 + 8))
746 goto out;
747
748 iph = (struct iphdr *)skb->data;
749 protocol = iph->protocol;
750
751
752
753
754 raw_icmp_error(skb, protocol, info);
755
756 hash = protocol & (MAX_INET_PROTOS - 1);
757 rcu_read_lock();
758 ipprot = rcu_dereference(inet_protos[hash]);
759 if (ipprot && ipprot->err_handler)
760 ipprot->err_handler(skb, info);
761 rcu_read_unlock();
762
763out:
764 return;
765out_err:
766 ICMP_INC_STATS_BH(net, ICMP_MIB_INERRORS);
767 goto out;
768}
769
770
771
772
773
774
775static void icmp_redirect(struct sk_buff *skb)
776{
777 struct iphdr *iph;
778
779 if (skb->len < sizeof(struct iphdr))
780 goto out_err;
781
782
783
784
785 if (!pskb_may_pull(skb, sizeof(struct iphdr)))
786 goto out;
787
788 iph = (struct iphdr *)skb->data;
789
790 switch (icmp_hdr(skb)->code & 7) {
791 case ICMP_REDIR_NET:
792 case ICMP_REDIR_NETTOS:
793
794
795
796 case ICMP_REDIR_HOST:
797 case ICMP_REDIR_HOSTTOS:
798 ip_rt_redirect(ip_hdr(skb)->saddr, iph->daddr,
799 icmp_hdr(skb)->un.gateway,
800 iph->saddr, skb->dev);
801 break;
802 }
803out:
804 return;
805out_err:
806 ICMP_INC_STATS_BH(dev_net(skb->dev), ICMP_MIB_INERRORS);
807 goto out;
808}
809
810
811
812
813
814
815
816
817
818
819
820
821
822static void icmp_echo(struct sk_buff *skb)
823{
824 struct net *net;
825
826 net = dev_net(skb->dst->dev);
827 if (!net->ipv4.sysctl_icmp_echo_ignore_all) {
828 struct icmp_bxm icmp_param;
829
830 icmp_param.data.icmph = *icmp_hdr(skb);
831 icmp_param.data.icmph.type = ICMP_ECHOREPLY;
832 icmp_param.skb = skb;
833 icmp_param.offset = 0;
834 icmp_param.data_len = skb->len;
835 icmp_param.head_len = sizeof(struct icmphdr);
836 icmp_reply(&icmp_param, skb);
837 }
838}
839
840
841
842
843
844
845
846
847static void icmp_timestamp(struct sk_buff *skb)
848{
849 struct timespec tv;
850 struct icmp_bxm icmp_param;
851
852
853
854 if (skb->len < 4)
855 goto out_err;
856
857
858
859
860 getnstimeofday(&tv);
861 icmp_param.data.times[1] = htonl((tv.tv_sec % 86400) * MSEC_PER_SEC +
862 tv.tv_nsec / NSEC_PER_MSEC);
863 icmp_param.data.times[2] = icmp_param.data.times[1];
864 if (skb_copy_bits(skb, 0, &icmp_param.data.times[0], 4))
865 BUG();
866 icmp_param.data.icmph = *icmp_hdr(skb);
867 icmp_param.data.icmph.type = ICMP_TIMESTAMPREPLY;
868 icmp_param.data.icmph.code = 0;
869 icmp_param.skb = skb;
870 icmp_param.offset = 0;
871 icmp_param.data_len = 0;
872 icmp_param.head_len = sizeof(struct icmphdr) + 12;
873 icmp_reply(&icmp_param, skb);
874out:
875 return;
876out_err:
877 ICMP_INC_STATS_BH(dev_net(skb->dst->dev), ICMP_MIB_INERRORS);
878 goto out;
879}
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915static void icmp_address(struct sk_buff *skb)
916{
917#if 0
918 if (net_ratelimit())
919 printk(KERN_DEBUG "a guy asks for address mask. Who is it?\n");
920#endif
921}
922
923
924
925
926
927
928static void icmp_address_reply(struct sk_buff *skb)
929{
930 struct rtable *rt = skb->rtable;
931 struct net_device *dev = skb->dev;
932 struct in_device *in_dev;
933 struct in_ifaddr *ifa;
934
935 if (skb->len < 4 || !(rt->rt_flags&RTCF_DIRECTSRC))
936 goto out;
937
938 in_dev = in_dev_get(dev);
939 if (!in_dev)
940 goto out;
941 rcu_read_lock();
942 if (in_dev->ifa_list &&
943 IN_DEV_LOG_MARTIANS(in_dev) &&
944 IN_DEV_FORWARD(in_dev)) {
945 __be32 _mask, *mp;
946
947 mp = skb_header_pointer(skb, 0, sizeof(_mask), &_mask);
948 BUG_ON(mp == NULL);
949 for (ifa = in_dev->ifa_list; ifa; ifa = ifa->ifa_next) {
950 if (*mp == ifa->ifa_mask &&
951 inet_ifa_match(rt->rt_src, ifa))
952 break;
953 }
954 if (!ifa && net_ratelimit()) {
955 printk(KERN_INFO "Wrong address mask " NIPQUAD_FMT " from "
956 "%s/" NIPQUAD_FMT "\n",
957 NIPQUAD(*mp), dev->name, NIPQUAD(rt->rt_src));
958 }
959 }
960 rcu_read_unlock();
961 in_dev_put(in_dev);
962out:;
963}
964
965static void icmp_discard(struct sk_buff *skb)
966{
967}
968
969
970
971
972int icmp_rcv(struct sk_buff *skb)
973{
974 struct icmphdr *icmph;
975 struct rtable *rt = skb->rtable;
976 struct net *net = dev_net(rt->u.dst.dev);
977
978 if (!xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb)) {
979 int nh;
980
981 if (!(skb->sp && skb->sp->xvec[skb->sp->len - 1]->props.flags &
982 XFRM_STATE_ICMP))
983 goto drop;
984
985 if (!pskb_may_pull(skb, sizeof(*icmph) + sizeof(struct iphdr)))
986 goto drop;
987
988 nh = skb_network_offset(skb);
989 skb_set_network_header(skb, sizeof(*icmph));
990
991 if (!xfrm4_policy_check_reverse(NULL, XFRM_POLICY_IN, skb))
992 goto drop;
993
994 skb_set_network_header(skb, nh);
995 }
996
997 ICMP_INC_STATS_BH(net, ICMP_MIB_INMSGS);
998
999 switch (skb->ip_summed) {
1000 case CHECKSUM_COMPLETE:
1001 if (!csum_fold(skb->csum))
1002 break;
1003
1004 case CHECKSUM_NONE:
1005 skb->csum = 0;
1006 if (__skb_checksum_complete(skb))
1007 goto error;
1008 }
1009
1010 if (!pskb_pull(skb, sizeof(*icmph)))
1011 goto error;
1012
1013 icmph = icmp_hdr(skb);
1014
1015 ICMPMSGIN_INC_STATS_BH(net, icmph->type);
1016
1017
1018
1019
1020
1021
1022 if (icmph->type > NR_ICMP_TYPES)
1023 goto error;
1024
1025
1026
1027
1028
1029
1030 if (rt->rt_flags & (RTCF_BROADCAST | RTCF_MULTICAST)) {
1031
1032
1033
1034
1035
1036
1037 if ((icmph->type == ICMP_ECHO ||
1038 icmph->type == ICMP_TIMESTAMP) &&
1039 net->ipv4.sysctl_icmp_echo_ignore_broadcasts) {
1040 goto error;
1041 }
1042 if (icmph->type != ICMP_ECHO &&
1043 icmph->type != ICMP_TIMESTAMP &&
1044 icmph->type != ICMP_ADDRESS &&
1045 icmph->type != ICMP_ADDRESSREPLY) {
1046 goto error;
1047 }
1048 }
1049
1050 icmp_pointers[icmph->type].handler(skb);
1051
1052drop:
1053 kfree_skb(skb);
1054 return 0;
1055error:
1056 ICMP_INC_STATS_BH(net, ICMP_MIB_INERRORS);
1057 goto drop;
1058}
1059
1060
1061
1062
1063static const struct icmp_control icmp_pointers[NR_ICMP_TYPES + 1] = {
1064 [ICMP_ECHOREPLY] = {
1065 .handler = icmp_discard,
1066 },
1067 [1] = {
1068 .handler = icmp_discard,
1069 .error = 1,
1070 },
1071 [2] = {
1072 .handler = icmp_discard,
1073 .error = 1,
1074 },
1075 [ICMP_DEST_UNREACH] = {
1076 .handler = icmp_unreach,
1077 .error = 1,
1078 },
1079 [ICMP_SOURCE_QUENCH] = {
1080 .handler = icmp_unreach,
1081 .error = 1,
1082 },
1083 [ICMP_REDIRECT] = {
1084 .handler = icmp_redirect,
1085 .error = 1,
1086 },
1087 [6] = {
1088 .handler = icmp_discard,
1089 .error = 1,
1090 },
1091 [7] = {
1092 .handler = icmp_discard,
1093 .error = 1,
1094 },
1095 [ICMP_ECHO] = {
1096 .handler = icmp_echo,
1097 },
1098 [9] = {
1099 .handler = icmp_discard,
1100 .error = 1,
1101 },
1102 [10] = {
1103 .handler = icmp_discard,
1104 .error = 1,
1105 },
1106 [ICMP_TIME_EXCEEDED] = {
1107 .handler = icmp_unreach,
1108 .error = 1,
1109 },
1110 [ICMP_PARAMETERPROB] = {
1111 .handler = icmp_unreach,
1112 .error = 1,
1113 },
1114 [ICMP_TIMESTAMP] = {
1115 .handler = icmp_timestamp,
1116 },
1117 [ICMP_TIMESTAMPREPLY] = {
1118 .handler = icmp_discard,
1119 },
1120 [ICMP_INFO_REQUEST] = {
1121 .handler = icmp_discard,
1122 },
1123 [ICMP_INFO_REPLY] = {
1124 .handler = icmp_discard,
1125 },
1126 [ICMP_ADDRESS] = {
1127 .handler = icmp_address,
1128 },
1129 [ICMP_ADDRESSREPLY] = {
1130 .handler = icmp_address_reply,
1131 },
1132};
1133
1134static void __net_exit icmp_sk_exit(struct net *net)
1135{
1136 int i;
1137
1138 for_each_possible_cpu(i)
1139 inet_ctl_sock_destroy(net->ipv4.icmp_sk[i]);
1140 kfree(net->ipv4.icmp_sk);
1141 net->ipv4.icmp_sk = NULL;
1142}
1143
1144static int __net_init icmp_sk_init(struct net *net)
1145{
1146 int i, err;
1147
1148 net->ipv4.icmp_sk =
1149 kzalloc(nr_cpu_ids * sizeof(struct sock *), GFP_KERNEL);
1150 if (net->ipv4.icmp_sk == NULL)
1151 return -ENOMEM;
1152
1153 for_each_possible_cpu(i) {
1154 struct sock *sk;
1155
1156 err = inet_ctl_sock_create(&sk, PF_INET,
1157 SOCK_RAW, IPPROTO_ICMP, net);
1158 if (err < 0)
1159 goto fail;
1160
1161 net->ipv4.icmp_sk[i] = sk;
1162
1163
1164
1165
1166 sk->sk_sndbuf =
1167 (2 * ((64 * 1024) + sizeof(struct sk_buff)));
1168
1169 inet_sk(sk)->pmtudisc = IP_PMTUDISC_DONT;
1170 }
1171
1172
1173 net->ipv4.sysctl_icmp_echo_ignore_all = 0;
1174 net->ipv4.sysctl_icmp_echo_ignore_broadcasts = 1;
1175
1176
1177 net->ipv4.sysctl_icmp_ignore_bogus_error_responses = 1;
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191 net->ipv4.sysctl_icmp_ratelimit = 1 * HZ;
1192 net->ipv4.sysctl_icmp_ratemask = 0x1818;
1193 net->ipv4.sysctl_icmp_errors_use_inbound_ifaddr = 0;
1194
1195 return 0;
1196
1197fail:
1198 for_each_possible_cpu(i)
1199 inet_ctl_sock_destroy(net->ipv4.icmp_sk[i]);
1200 kfree(net->ipv4.icmp_sk);
1201 return err;
1202}
1203
1204static struct pernet_operations __net_initdata icmp_sk_ops = {
1205 .init = icmp_sk_init,
1206 .exit = icmp_sk_exit,
1207};
1208
1209int __init icmp_init(void)
1210{
1211 return register_pernet_device(&icmp_sk_ops);
1212}
1213
1214EXPORT_SYMBOL(icmp_err_convert);
1215EXPORT_SYMBOL(icmp_send);
1216EXPORT_SYMBOL(xrlim_allow);
1217