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