LCOV - code coverage report
Current view: top level - net/ipv4 - icmp.c (source / functions) Hit Total Coverage
Test: landlock.info Lines: 64 476 13.4 %
Date: 2021-04-22 12:43:58 Functions: 5 25 20.0 %

          Line data    Source code
       1             : // SPDX-License-Identifier: GPL-2.0-or-later
       2             : /*
       3             :  *      NET3:   Implementation of the ICMP protocol layer.
       4             :  *
       5             :  *              Alan Cox, <alan@lxorguk.ukuu.org.uk>
       6             :  *
       7             :  *      Some of the function names and the icmp unreach table for this
       8             :  *      module were derived from [icmp.c 1.0.11 06/02/93] by
       9             :  *      Ross Biro, Fred N. van Kempen, Mark Evans, Alan Cox, Gerhard Koerting.
      10             :  *      Other than that this module is a complete rewrite.
      11             :  *
      12             :  *      Fixes:
      13             :  *      Clemens Fruhwirth       :       introduce global icmp rate limiting
      14             :  *                                      with icmp type masking ability instead
      15             :  *                                      of broken per type icmp timeouts.
      16             :  *              Mike Shaver     :       RFC1122 checks.
      17             :  *              Alan Cox        :       Multicast ping reply as self.
      18             :  *              Alan Cox        :       Fix atomicity lockup in ip_build_xmit
      19             :  *                                      call.
      20             :  *              Alan Cox        :       Added 216,128 byte paths to the MTU
      21             :  *                                      code.
      22             :  *              Martin Mares    :       RFC1812 checks.
      23             :  *              Martin Mares    :       Can be configured to follow redirects
      24             :  *                                      if acting as a router _without_ a
      25             :  *                                      routing protocol (RFC 1812).
      26             :  *              Martin Mares    :       Echo requests may be configured to
      27             :  *                                      be ignored (RFC 1812).
      28             :  *              Martin Mares    :       Limitation of ICMP error message
      29             :  *                                      transmit rate (RFC 1812).
      30             :  *              Martin Mares    :       TOS and Precedence set correctly
      31             :  *                                      (RFC 1812).
      32             :  *              Martin Mares    :       Now copying as much data from the
      33             :  *                                      original packet as we can without
      34             :  *                                      exceeding 576 bytes (RFC 1812).
      35             :  *      Willy Konynenberg       :       Transparent proxying support.
      36             :  *              Keith Owens     :       RFC1191 correction for 4.2BSD based
      37             :  *                                      path MTU bug.
      38             :  *              Thomas Quinot   :       ICMP Dest Unreach codes up to 15 are
      39             :  *                                      valid (RFC 1812).
      40             :  *              Andi Kleen      :       Check all packet lengths properly
      41             :  *                                      and moved all kfree_skb() up to
      42             :  *                                      icmp_rcv.
      43             :  *              Andi Kleen      :       Move the rate limit bookkeeping
      44             :  *                                      into the dest entry and use a token
      45             :  *                                      bucket filter (thanks to ANK). Make
      46             :  *                                      the rates sysctl configurable.
      47             :  *              Yu Tianli       :       Fixed two ugly bugs in icmp_send
      48             :  *                                      - IP option length was accounted wrongly
      49             :  *                                      - ICMP header length was not accounted
      50             :  *                                        at all.
      51             :  *              Tristan Greaves :       Added sysctl option to ignore bogus
      52             :  *                                      broadcast responses from broken routers.
      53             :  *
      54             :  * To Fix:
      55             :  *
      56             :  *      - Should use skb_pull() instead of all the manual checking.
      57             :  *        This would also greatly simply some upper layer error handlers. --AK
      58             :  */
      59             : 
      60             : #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
      61             : 
      62             : #include <linux/module.h>
      63             : #include <linux/types.h>
      64             : #include <linux/jiffies.h>
      65             : #include <linux/kernel.h>
      66             : #include <linux/fcntl.h>
      67             : #include <linux/socket.h>
      68             : #include <linux/in.h>
      69             : #include <linux/inet.h>
      70             : #include <linux/inetdevice.h>
      71             : #include <linux/netdevice.h>
      72             : #include <linux/string.h>
      73             : #include <linux/netfilter_ipv4.h>
      74             : #include <linux/slab.h>
      75             : #include <net/snmp.h>
      76             : #include <net/ip.h>
      77             : #include <net/route.h>
      78             : #include <net/protocol.h>
      79             : #include <net/icmp.h>
      80             : #include <net/tcp.h>
      81             : #include <net/udp.h>
      82             : #include <net/raw.h>
      83             : #include <net/ping.h>
      84             : #include <linux/skbuff.h>
      85             : #include <net/sock.h>
      86             : #include <linux/errno.h>
      87             : #include <linux/timer.h>
      88             : #include <linux/init.h>
      89             : #include <linux/uaccess.h>
      90             : #include <net/checksum.h>
      91             : #include <net/xfrm.h>
      92             : #include <net/inet_common.h>
      93             : #include <net/ip_fib.h>
      94             : #include <net/l3mdev.h>
      95             : 
      96             : /*
      97             :  *      Build xmit assembly blocks
      98             :  */
      99             : 
     100             : struct 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_data replyopts;
     111             : };
     112             : 
     113             : /* An array of errno for error messages from dest unreach. */
     114             : /* RFC 1122: 3.2.2.1 States that NET_UNREACH, HOST_UNREACH and SR_FAILED MUST be considered 'transient errs'. */
     115             : 
     116             : const struct icmp_err icmp_err_convert[] = {
     117             :         {
     118             :                 .errno = ENETUNREACH,   /* ICMP_NET_UNREACH */
     119             :                 .fatal = 0,
     120             :         },
     121             :         {
     122             :                 .errno = EHOSTUNREACH,  /* ICMP_HOST_UNREACH */
     123             :                 .fatal = 0,
     124             :         },
     125             :         {
     126             :                 .errno = ENOPROTOOPT    /* ICMP_PROT_UNREACH */,
     127             :                 .fatal = 1,
     128             :         },
     129             :         {
     130             :                 .errno = ECONNREFUSED,  /* ICMP_PORT_UNREACH */
     131             :                 .fatal = 1,
     132             :         },
     133             :         {
     134             :                 .errno = EMSGSIZE,      /* ICMP_FRAG_NEEDED */
     135             :                 .fatal = 0,
     136             :         },
     137             :         {
     138             :                 .errno = EOPNOTSUPP,    /* ICMP_SR_FAILED */
     139             :                 .fatal = 0,
     140             :         },
     141             :         {
     142             :                 .errno = ENETUNREACH,   /* ICMP_NET_UNKNOWN */
     143             :                 .fatal = 1,
     144             :         },
     145             :         {
     146             :                 .errno = EHOSTDOWN,     /* ICMP_HOST_UNKNOWN */
     147             :                 .fatal = 1,
     148             :         },
     149             :         {
     150             :                 .errno = ENONET,        /* ICMP_HOST_ISOLATED */
     151             :                 .fatal = 1,
     152             :         },
     153             :         {
     154             :                 .errno = ENETUNREACH,   /* ICMP_NET_ANO */
     155             :                 .fatal = 1,
     156             :         },
     157             :         {
     158             :                 .errno = EHOSTUNREACH,  /* ICMP_HOST_ANO */
     159             :                 .fatal = 1,
     160             :         },
     161             :         {
     162             :                 .errno = ENETUNREACH,   /* ICMP_NET_UNR_TOS */
     163             :                 .fatal = 0,
     164             :         },
     165             :         {
     166             :                 .errno = EHOSTUNREACH,  /* ICMP_HOST_UNR_TOS */
     167             :                 .fatal = 0,
     168             :         },
     169             :         {
     170             :                 .errno = EHOSTUNREACH,  /* ICMP_PKT_FILTERED */
     171             :                 .fatal = 1,
     172             :         },
     173             :         {
     174             :                 .errno = EHOSTUNREACH,  /* ICMP_PREC_VIOLATION */
     175             :                 .fatal = 1,
     176             :         },
     177             :         {
     178             :                 .errno = EHOSTUNREACH,  /* ICMP_PREC_CUTOFF */
     179             :                 .fatal = 1,
     180             :         },
     181             : };
     182             : EXPORT_SYMBOL(icmp_err_convert);
     183             : 
     184             : /*
     185             :  *      ICMP control array. This specifies what to do with each ICMP.
     186             :  */
     187             : 
     188             : struct icmp_control {
     189             :         bool (*handler)(struct sk_buff *skb);
     190             :         short   error;          /* This ICMP is classed as an error message */
     191             : };
     192             : 
     193             : static const struct icmp_control icmp_pointers[NR_ICMP_TYPES+1];
     194             : 
     195             : /*
     196             :  *      The ICMP socket(s). This is the most convenient way to flow control
     197             :  *      our ICMP output as well as maintain a clean interface throughout
     198             :  *      all layers. All Socketless IP sends will soon be gone.
     199             :  *
     200             :  *      On SMP we have one ICMP socket per-cpu.
     201             :  */
     202           0 : static struct sock *icmp_sk(struct net *net)
     203             : {
     204           0 :         return this_cpu_read(*net->ipv4.icmp_sk);
     205             : }
     206             : 
     207             : /* Called with BH disabled */
     208           0 : static inline struct sock *icmp_xmit_lock(struct net *net)
     209             : {
     210           0 :         struct sock *sk;
     211             : 
     212           0 :         sk = icmp_sk(net);
     213             : 
     214           0 :         if (unlikely(!spin_trylock(&sk->sk_lock.slock))) {
     215             :                 /* This can happen if the output path signals a
     216             :                  * dst_link_failure() for an outgoing ICMP packet.
     217             :                  */
     218           0 :                 return NULL;
     219             :         }
     220             :         return sk;
     221             : }
     222             : 
     223           0 : static inline void icmp_xmit_unlock(struct sock *sk)
     224             : {
     225           0 :         spin_unlock(&sk->sk_lock.slock);
     226           0 : }
     227             : 
     228             : int sysctl_icmp_msgs_per_sec __read_mostly = 1000;
     229             : int sysctl_icmp_msgs_burst __read_mostly = 50;
     230             : 
     231             : static struct {
     232             :         spinlock_t      lock;
     233             :         u32             credit;
     234             :         u32             stamp;
     235             : } icmp_global = {
     236             :         .lock           = __SPIN_LOCK_UNLOCKED(icmp_global.lock),
     237             : };
     238             : 
     239             : /**
     240             :  * icmp_global_allow - Are we allowed to send one more ICMP message ?
     241             :  *
     242             :  * Uses a token bucket to limit our ICMP messages to ~sysctl_icmp_msgs_per_sec.
     243             :  * Returns false if we reached the limit and can not send another packet.
     244             :  * Note: called with BH disabled
     245             :  */
     246           0 : bool icmp_global_allow(void)
     247             : {
     248           0 :         u32 credit, delta, incr = 0, now = (u32)jiffies;
     249           0 :         bool rc = false;
     250             : 
     251             :         /* Check if token bucket is empty and cannot be refilled
     252             :          * without taking the spinlock. The READ_ONCE() are paired
     253             :          * with the following WRITE_ONCE() in this same function.
     254             :          */
     255           0 :         if (!READ_ONCE(icmp_global.credit)) {
     256           0 :                 delta = min_t(u32, now - READ_ONCE(icmp_global.stamp), HZ);
     257           0 :                 if (delta < HZ / 50)
     258             :                         return false;
     259             :         }
     260             : 
     261           0 :         spin_lock(&icmp_global.lock);
     262           0 :         delta = min_t(u32, now - icmp_global.stamp, HZ);
     263           0 :         if (delta >= HZ / 50) {
     264           0 :                 incr = sysctl_icmp_msgs_per_sec * delta / HZ ;
     265           0 :                 if (incr)
     266           0 :                         WRITE_ONCE(icmp_global.stamp, now);
     267             :         }
     268           0 :         credit = min_t(u32, icmp_global.credit + incr, sysctl_icmp_msgs_burst);
     269           0 :         if (credit) {
     270             :                 /* We want to use a credit of one in average, but need to randomize
     271             :                  * it for security reasons.
     272             :                  */
     273           0 :                 credit = max_t(int, credit - prandom_u32_max(3), 0);
     274           0 :                 rc = true;
     275             :         }
     276           0 :         WRITE_ONCE(icmp_global.credit, credit);
     277           0 :         spin_unlock(&icmp_global.lock);
     278           0 :         return rc;
     279             : }
     280             : EXPORT_SYMBOL(icmp_global_allow);
     281             : 
     282           0 : static bool icmpv4_mask_allow(struct net *net, int type, int code)
     283             : {
     284           0 :         if (type > NR_ICMP_TYPES)
     285             :                 return true;
     286             : 
     287             :         /* Don't limit PMTU discovery. */
     288           0 :         if (type == ICMP_DEST_UNREACH && code == ICMP_FRAG_NEEDED)
     289             :                 return true;
     290             : 
     291             :         /* Limit if icmp type is enabled in ratemask. */
     292           0 :         if (!((1 << type) & net->ipv4.sysctl_icmp_ratemask))
     293             :                 return true;
     294             : 
     295             :         return false;
     296             : }
     297             : 
     298           0 : static bool icmpv4_global_allow(struct net *net, int type, int code)
     299             : {
     300           0 :         if (icmpv4_mask_allow(net, type, code))
     301             :                 return true;
     302             : 
     303           0 :         if (icmp_global_allow())
     304           0 :                 return true;
     305             : 
     306             :         return false;
     307             : }
     308             : 
     309             : /*
     310             :  *      Send an ICMP frame.
     311             :  */
     312             : 
     313           0 : static bool icmpv4_xrlim_allow(struct net *net, struct rtable *rt,
     314             :                                struct flowi4 *fl4, int type, int code)
     315             : {
     316           0 :         struct dst_entry *dst = &rt->dst;
     317           0 :         struct inet_peer *peer;
     318           0 :         bool rc = true;
     319           0 :         int vif;
     320             : 
     321           0 :         if (icmpv4_mask_allow(net, type, code))
     322           0 :                 goto out;
     323             : 
     324             :         /* No rate limit on loopback */
     325           0 :         if (dst->dev && (dst->dev->flags&IFF_LOOPBACK))
     326           0 :                 goto out;
     327             : 
     328           0 :         vif = l3mdev_master_ifindex(dst->dev);
     329           0 :         peer = inet_getpeer_v4(net->ipv4.peers, fl4->daddr, vif, 1);
     330           0 :         rc = inet_peer_xrlim_allow(peer, net->ipv4.sysctl_icmp_ratelimit);
     331           0 :         if (peer)
     332           0 :                 inet_putpeer(peer);
     333           0 : out:
     334           0 :         return rc;
     335             : }
     336             : 
     337             : /*
     338             :  *      Maintain the counters used in the SNMP statistics for outgoing ICMP
     339             :  */
     340           0 : void icmp_out_count(struct net *net, unsigned char type)
     341             : {
     342           0 :         ICMPMSGOUT_INC_STATS(net, type);
     343           0 :         ICMP_INC_STATS(net, ICMP_MIB_OUTMSGS);
     344           0 : }
     345             : 
     346             : /*
     347             :  *      Checksum each fragment, and on the first include the headers and final
     348             :  *      checksum.
     349             :  */
     350           0 : static int icmp_glue_bits(void *from, char *to, int offset, int len, int odd,
     351             :                           struct sk_buff *skb)
     352             : {
     353           0 :         struct icmp_bxm *icmp_param = (struct icmp_bxm *)from;
     354           0 :         __wsum csum;
     355             : 
     356           0 :         csum = skb_copy_and_csum_bits(icmp_param->skb,
     357           0 :                                       icmp_param->offset + offset,
     358             :                                       to, len);
     359             : 
     360           0 :         skb->csum = csum_block_add(skb->csum, csum, odd);
     361           0 :         if (icmp_pointers[icmp_param->data.icmph.type].error)
     362           0 :                 nf_ct_attach(skb, icmp_param->skb);
     363           0 :         return 0;
     364             : }
     365             : 
     366           0 : static void icmp_push_reply(struct icmp_bxm *icmp_param,
     367             :                             struct flowi4 *fl4,
     368             :                             struct ipcm_cookie *ipc, struct rtable **rt)
     369             : {
     370           0 :         struct sock *sk;
     371           0 :         struct sk_buff *skb;
     372             : 
     373           0 :         sk = icmp_sk(dev_net((*rt)->dst.dev));
     374           0 :         if (ip_append_data(sk, fl4, icmp_glue_bits, icmp_param,
     375           0 :                            icmp_param->data_len+icmp_param->head_len,
     376             :                            icmp_param->head_len,
     377             :                            ipc, rt, MSG_DONTWAIT) < 0) {
     378           0 :                 __ICMP_INC_STATS(sock_net(sk), ICMP_MIB_OUTERRORS);
     379           0 :                 ip_flush_pending_frames(sk);
     380           0 :         } else if ((skb = skb_peek(&sk->sk_write_queue)) != NULL) {
     381           0 :                 struct icmphdr *icmph = icmp_hdr(skb);
     382           0 :                 __wsum csum;
     383           0 :                 struct sk_buff *skb1;
     384             : 
     385           0 :                 csum = csum_partial_copy_nocheck((void *)&icmp_param->data,
     386             :                                                  (char *)icmph,
     387             :                                                  icmp_param->head_len);
     388           0 :                 skb_queue_walk(&sk->sk_write_queue, skb1) {
     389           0 :                         csum = csum_add(csum, skb1->csum);
     390             :                 }
     391           0 :                 icmph->checksum = csum_fold(csum);
     392           0 :                 skb->ip_summed = CHECKSUM_NONE;
     393           0 :                 ip_push_pending_frames(sk, fl4);
     394             :         }
     395           0 : }
     396             : 
     397             : /*
     398             :  *      Driving logic for building and sending ICMP messages.
     399             :  */
     400             : 
     401           0 : static void icmp_reply(struct icmp_bxm *icmp_param, struct sk_buff *skb)
     402             : {
     403           0 :         struct ipcm_cookie ipc;
     404           0 :         struct rtable *rt = skb_rtable(skb);
     405           0 :         struct net *net = dev_net(rt->dst.dev);
     406           0 :         struct flowi4 fl4;
     407           0 :         struct sock *sk;
     408           0 :         struct inet_sock *inet;
     409           0 :         __be32 daddr, saddr;
     410           0 :         u32 mark = IP4_REPLY_MARK(net, skb->mark);
     411           0 :         int type = icmp_param->data.icmph.type;
     412           0 :         int code = icmp_param->data.icmph.code;
     413             : 
     414           0 :         if (ip_options_echo(net, &icmp_param->replyopts.opt.opt, skb))
     415           0 :                 return;
     416             : 
     417             :         /* Needed by both icmp_global_allow and icmp_xmit_lock */
     418           0 :         local_bh_disable();
     419             : 
     420             :         /* global icmp_msgs_per_sec */
     421           0 :         if (!icmpv4_global_allow(net, type, code))
     422           0 :                 goto out_bh_enable;
     423             : 
     424           0 :         sk = icmp_xmit_lock(net);
     425           0 :         if (!sk)
     426           0 :                 goto out_bh_enable;
     427           0 :         inet = inet_sk(sk);
     428             : 
     429           0 :         icmp_param->data.icmph.checksum = 0;
     430             : 
     431           0 :         ipcm_init(&ipc);
     432           0 :         inet->tos = ip_hdr(skb)->tos;
     433           0 :         ipc.sockc.mark = mark;
     434           0 :         daddr = ipc.addr = ip_hdr(skb)->saddr;
     435           0 :         saddr = fib_compute_spec_dst(skb);
     436             : 
     437           0 :         if (icmp_param->replyopts.opt.opt.optlen) {
     438           0 :                 ipc.opt = &icmp_param->replyopts.opt;
     439           0 :                 if (ipc.opt->opt.srr)
     440           0 :                         daddr = icmp_param->replyopts.opt.opt.faddr;
     441             :         }
     442           0 :         memset(&fl4, 0, sizeof(fl4));
     443           0 :         fl4.daddr = daddr;
     444           0 :         fl4.saddr = saddr;
     445           0 :         fl4.flowi4_mark = mark;
     446           0 :         fl4.flowi4_uid = sock_net_uid(net, NULL);
     447           0 :         fl4.flowi4_tos = RT_TOS(ip_hdr(skb)->tos);
     448           0 :         fl4.flowi4_proto = IPPROTO_ICMP;
     449           0 :         fl4.flowi4_oif = l3mdev_master_ifindex(skb->dev);
     450           0 :         security_skb_classify_flow(skb, flowi4_to_flowi_common(&fl4));
     451           0 :         rt = ip_route_output_key(net, &fl4);
     452           0 :         if (IS_ERR(rt))
     453           0 :                 goto out_unlock;
     454           0 :         if (icmpv4_xrlim_allow(net, rt, &fl4, type, code))
     455           0 :                 icmp_push_reply(icmp_param, &fl4, &ipc, &rt);
     456           0 :         ip_rt_put(rt);
     457           0 : out_unlock:
     458           0 :         icmp_xmit_unlock(sk);
     459           0 : out_bh_enable:
     460           0 :         local_bh_enable();
     461             : }
     462             : 
     463             : /*
     464             :  * The device used for looking up which routing table to use for sending an ICMP
     465             :  * error is preferably the source whenever it is set, which should ensure the
     466             :  * icmp error can be sent to the source host, else lookup using the routing
     467             :  * table of the destination device, else use the main routing table (index 0).
     468             :  */
     469           0 : static struct net_device *icmp_get_route_lookup_dev(struct sk_buff *skb)
     470             : {
     471           0 :         struct net_device *route_lookup_dev = NULL;
     472             : 
     473           0 :         if (skb->dev)
     474             :                 route_lookup_dev = skb->dev;
     475           0 :         else if (skb_dst(skb))
     476           0 :                 route_lookup_dev = skb_dst(skb)->dev;
     477           0 :         return route_lookup_dev;
     478             : }
     479             : 
     480           0 : static struct rtable *icmp_route_lookup(struct net *net,
     481             :                                         struct flowi4 *fl4,
     482             :                                         struct sk_buff *skb_in,
     483             :                                         const struct iphdr *iph,
     484             :                                         __be32 saddr, u8 tos, u32 mark,
     485             :                                         int type, int code,
     486             :                                         struct icmp_bxm *param)
     487             : {
     488           0 :         struct net_device *route_lookup_dev;
     489           0 :         struct rtable *rt, *rt2;
     490           0 :         struct flowi4 fl4_dec;
     491           0 :         int err;
     492             : 
     493           0 :         memset(fl4, 0, sizeof(*fl4));
     494           0 :         fl4->daddr = (param->replyopts.opt.opt.srr ?
     495           0 :                       param->replyopts.opt.opt.faddr : iph->saddr);
     496           0 :         fl4->saddr = saddr;
     497           0 :         fl4->flowi4_mark = mark;
     498           0 :         fl4->flowi4_uid = sock_net_uid(net, NULL);
     499           0 :         fl4->flowi4_tos = RT_TOS(tos);
     500           0 :         fl4->flowi4_proto = IPPROTO_ICMP;
     501           0 :         fl4->fl4_icmp_type = type;
     502           0 :         fl4->fl4_icmp_code = code;
     503           0 :         route_lookup_dev = icmp_get_route_lookup_dev(skb_in);
     504           0 :         fl4->flowi4_oif = l3mdev_master_ifindex(route_lookup_dev);
     505             : 
     506           0 :         security_skb_classify_flow(skb_in, flowi4_to_flowi_common(fl4));
     507           0 :         rt = ip_route_output_key_hash(net, fl4, skb_in);
     508           0 :         if (IS_ERR(rt))
     509             :                 return rt;
     510             : 
     511             :         /* No need to clone since we're just using its address. */
     512           0 :         rt2 = rt;
     513             : 
     514           0 :         rt = (struct rtable *) xfrm_lookup(net, &rt->dst,
     515           0 :                                            flowi4_to_flowi(fl4), NULL, 0);
     516           0 :         if (!IS_ERR(rt)) {
     517             :                 if (rt != rt2)
     518             :                         return rt;
     519           0 :         } else if (PTR_ERR(rt) == -EPERM) {
     520             :                 rt = NULL;
     521             :         } else
     522             :                 return rt;
     523             : 
     524           0 :         err = xfrm_decode_session_reverse(skb_in, flowi4_to_flowi(&fl4_dec), AF_INET);
     525           0 :         if (err)
     526           0 :                 goto relookup_failed;
     527             : 
     528             :         if (inet_addr_type_dev_table(net, route_lookup_dev,
     529             :                                      fl4_dec.saddr) == RTN_LOCAL) {
     530             :                 rt2 = __ip_route_output_key(net, &fl4_dec);
     531             :                 if (IS_ERR(rt2))
     532             :                         err = PTR_ERR(rt2);
     533             :         } else {
     534             :                 struct flowi4 fl4_2 = {};
     535             :                 unsigned long orefdst;
     536             : 
     537             :                 fl4_2.daddr = fl4_dec.saddr;
     538             :                 rt2 = ip_route_output_key(net, &fl4_2);
     539             :                 if (IS_ERR(rt2)) {
     540             :                         err = PTR_ERR(rt2);
     541             :                         goto relookup_failed;
     542             :                 }
     543             :                 /* Ugh! */
     544             :                 orefdst = skb_in->_skb_refdst; /* save old refdst */
     545             :                 skb_dst_set(skb_in, NULL);
     546             :                 err = ip_route_input(skb_in, fl4_dec.daddr, fl4_dec.saddr,
     547             :                                      RT_TOS(tos), rt2->dst.dev);
     548             : 
     549             :                 dst_release(&rt2->dst);
     550             :                 rt2 = skb_rtable(skb_in);
     551             :                 skb_in->_skb_refdst = orefdst; /* restore old refdst */
     552             :         }
     553             : 
     554             :         if (err)
     555             :                 goto relookup_failed;
     556             : 
     557             :         rt2 = (struct rtable *) xfrm_lookup(net, &rt2->dst,
     558             :                                             flowi4_to_flowi(&fl4_dec), NULL,
     559             :                                             XFRM_LOOKUP_ICMP);
     560             :         if (!IS_ERR(rt2)) {
     561             :                 dst_release(&rt->dst);
     562             :                 memcpy(fl4, &fl4_dec, sizeof(*fl4));
     563             :                 rt = rt2;
     564             :         } else if (PTR_ERR(rt2) == -EPERM) {
     565             :                 if (rt)
     566             :                         dst_release(&rt->dst);
     567             :                 return rt2;
     568             :         } else {
     569             :                 err = PTR_ERR(rt2);
     570             :                 goto relookup_failed;
     571             :         }
     572             :         return rt;
     573             : 
     574           0 : relookup_failed:
     575           0 :         if (rt)
     576           0 :                 return rt;
     577           0 :         return ERR_PTR(err);
     578             : }
     579             : 
     580             : /*
     581             :  *      Send an ICMP message in response to a situation
     582             :  *
     583             :  *      RFC 1122: 3.2.2 MUST send at least the IP header and 8 bytes of header.
     584             :  *                MAY send more (we do).
     585             :  *                      MUST NOT change this header information.
     586             :  *                      MUST NOT reply to a multicast/broadcast IP address.
     587             :  *                      MUST NOT reply to a multicast/broadcast MAC address.
     588             :  *                      MUST reply to only the first fragment.
     589             :  */
     590             : 
     591           0 : void __icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info,
     592             :                  const struct ip_options *opt)
     593             : {
     594           0 :         struct iphdr *iph;
     595           0 :         int room;
     596           0 :         struct icmp_bxm icmp_param;
     597           0 :         struct rtable *rt = skb_rtable(skb_in);
     598           0 :         struct ipcm_cookie ipc;
     599           0 :         struct flowi4 fl4;
     600           0 :         __be32 saddr;
     601           0 :         u8  tos;
     602           0 :         u32 mark;
     603           0 :         struct net *net;
     604           0 :         struct sock *sk;
     605             : 
     606           0 :         if (!rt)
     607           0 :                 goto out;
     608             : 
     609           0 :         if (rt->dst.dev)
     610           0 :                 net = dev_net(rt->dst.dev);
     611           0 :         else if (skb_in->dev)
     612           0 :                 net = dev_net(skb_in->dev);
     613             :         else
     614           0 :                 goto out;
     615             : 
     616             :         /*
     617             :          *      Find the original header. It is expected to be valid, of course.
     618             :          *      Check this, icmp_send is called from the most obscure devices
     619             :          *      sometimes.
     620             :          */
     621           0 :         iph = ip_hdr(skb_in);
     622             : 
     623           0 :         if ((u8 *)iph < skb_in->head ||
     624           0 :             (skb_network_header(skb_in) + sizeof(*iph)) >
     625           0 :             skb_tail_pointer(skb_in))
     626           0 :                 goto out;
     627             : 
     628             :         /*
     629             :          *      No replies to physical multicast/broadcast
     630             :          */
     631           0 :         if (skb_in->pkt_type != PACKET_HOST)
     632           0 :                 goto out;
     633             : 
     634             :         /*
     635             :          *      Now check at the protocol level
     636             :          */
     637           0 :         if (rt->rt_flags & (RTCF_BROADCAST | RTCF_MULTICAST))
     638           0 :                 goto out;
     639             : 
     640             :         /*
     641             :          *      Only reply to fragment 0. We byte re-order the constant
     642             :          *      mask for efficiency.
     643             :          */
     644           0 :         if (iph->frag_off & htons(IP_OFFSET))
     645           0 :                 goto out;
     646             : 
     647             :         /*
     648             :          *      If we send an ICMP error to an ICMP error a mess would result..
     649             :          */
     650           0 :         if (icmp_pointers[type].error) {
     651             :                 /*
     652             :                  *      We are an error, check if we are replying to an
     653             :                  *      ICMP error
     654             :                  */
     655           0 :                 if (iph->protocol == IPPROTO_ICMP) {
     656           0 :                         u8 _inner_type, *itp;
     657             : 
     658           0 :                         itp = skb_header_pointer(skb_in,
     659           0 :                                                  skb_network_header(skb_in) +
     660           0 :                                                  (iph->ihl << 2) +
     661             :                                                  offsetof(struct icmphdr,
     662           0 :                                                           type) -
     663           0 :                                                  skb_in->data,
     664             :                                                  sizeof(_inner_type),
     665             :                                                  &_inner_type);
     666           0 :                         if (!itp)
     667           0 :                                 goto out;
     668             : 
     669             :                         /*
     670             :                          *      Assume any unknown ICMP type is an error. This
     671             :                          *      isn't specified by the RFC, but think about it..
     672             :                          */
     673           0 :                         if (*itp > NR_ICMP_TYPES ||
     674           0 :                             icmp_pointers[*itp].error)
     675           0 :                                 goto out;
     676             :                 }
     677             :         }
     678             : 
     679             :         /* Needed by both icmp_global_allow and icmp_xmit_lock */
     680           0 :         local_bh_disable();
     681             : 
     682             :         /* Check global sysctl_icmp_msgs_per_sec ratelimit, unless
     683             :          * incoming dev is loopback.  If outgoing dev change to not be
     684             :          * loopback, then peer ratelimit still work (in icmpv4_xrlim_allow)
     685             :          */
     686           0 :         if (!(skb_in->dev && (skb_in->dev->flags&IFF_LOOPBACK)) &&
     687           0 :               !icmpv4_global_allow(net, type, code))
     688           0 :                 goto out_bh_enable;
     689             : 
     690           0 :         sk = icmp_xmit_lock(net);
     691           0 :         if (!sk)
     692           0 :                 goto out_bh_enable;
     693             : 
     694             :         /*
     695             :          *      Construct source address and options.
     696             :          */
     697             : 
     698           0 :         saddr = iph->daddr;
     699           0 :         if (!(rt->rt_flags & RTCF_LOCAL)) {
     700           0 :                 struct net_device *dev = NULL;
     701             : 
     702           0 :                 rcu_read_lock();
     703           0 :                 if (rt_is_input_route(rt) &&
     704           0 :                     net->ipv4.sysctl_icmp_errors_use_inbound_ifaddr)
     705           0 :                         dev = dev_get_by_index_rcu(net, inet_iif(skb_in));
     706             : 
     707           0 :                 if (dev)
     708           0 :                         saddr = inet_select_addr(dev, iph->saddr,
     709             :                                                  RT_SCOPE_LINK);
     710             :                 else
     711             :                         saddr = 0;
     712           0 :                 rcu_read_unlock();
     713             :         }
     714             : 
     715           0 :         tos = icmp_pointers[type].error ? (RT_TOS(iph->tos) |
     716             :                                            IPTOS_PREC_INTERNETCONTROL) :
     717             :                                            iph->tos;
     718           0 :         mark = IP4_REPLY_MARK(net, skb_in->mark);
     719             : 
     720           0 :         if (__ip_options_echo(net, &icmp_param.replyopts.opt.opt, skb_in, opt))
     721           0 :                 goto out_unlock;
     722             : 
     723             : 
     724             :         /*
     725             :          *      Prepare data for ICMP header.
     726             :          */
     727             : 
     728           0 :         icmp_param.data.icmph.type       = type;
     729           0 :         icmp_param.data.icmph.code       = code;
     730           0 :         icmp_param.data.icmph.un.gateway = info;
     731           0 :         icmp_param.data.icmph.checksum   = 0;
     732           0 :         icmp_param.skb    = skb_in;
     733           0 :         icmp_param.offset = skb_network_offset(skb_in);
     734           0 :         inet_sk(sk)->tos = tos;
     735           0 :         ipcm_init(&ipc);
     736           0 :         ipc.addr = iph->saddr;
     737           0 :         ipc.opt = &icmp_param.replyopts.opt;
     738           0 :         ipc.sockc.mark = mark;
     739             : 
     740           0 :         rt = icmp_route_lookup(net, &fl4, skb_in, iph, saddr, tos, mark,
     741             :                                type, code, &icmp_param);
     742           0 :         if (IS_ERR(rt))
     743           0 :                 goto out_unlock;
     744             : 
     745             :         /* peer icmp_ratelimit */
     746           0 :         if (!icmpv4_xrlim_allow(net, rt, &fl4, type, code))
     747           0 :                 goto ende;
     748             : 
     749             :         /* RFC says return as much as we can without exceeding 576 bytes. */
     750             : 
     751           0 :         room = dst_mtu(&rt->dst);
     752           0 :         if (room > 576)
     753             :                 room = 576;
     754           0 :         room -= sizeof(struct iphdr) + icmp_param.replyopts.opt.opt.optlen;
     755           0 :         room -= sizeof(struct icmphdr);
     756             : 
     757           0 :         icmp_param.data_len = skb_in->len - icmp_param.offset;
     758           0 :         if (icmp_param.data_len > room)
     759           0 :                 icmp_param.data_len = room;
     760           0 :         icmp_param.head_len = sizeof(struct icmphdr);
     761             : 
     762           0 :         icmp_push_reply(&icmp_param, &fl4, &ipc, &rt);
     763           0 : ende:
     764           0 :         ip_rt_put(rt);
     765           0 : out_unlock:
     766           0 :         icmp_xmit_unlock(sk);
     767           0 : out_bh_enable:
     768           0 :         local_bh_enable();
     769           0 : out:;
     770           0 : }
     771             : EXPORT_SYMBOL(__icmp_send);
     772             : 
     773             : #if IS_ENABLED(CONFIG_NF_NAT)
     774             : #include <net/netfilter/nf_conntrack.h>
     775             : void icmp_ndo_send(struct sk_buff *skb_in, int type, int code, __be32 info)
     776             : {
     777             :         struct sk_buff *cloned_skb = NULL;
     778             :         struct ip_options opts = { 0 };
     779             :         enum ip_conntrack_info ctinfo;
     780             :         struct nf_conn *ct;
     781             :         __be32 orig_ip;
     782             : 
     783             :         ct = nf_ct_get(skb_in, &ctinfo);
     784             :         if (!ct || !(ct->status & IPS_SRC_NAT)) {
     785             :                 __icmp_send(skb_in, type, code, info, &opts);
     786             :                 return;
     787             :         }
     788             : 
     789             :         if (skb_shared(skb_in))
     790             :                 skb_in = cloned_skb = skb_clone(skb_in, GFP_ATOMIC);
     791             : 
     792             :         if (unlikely(!skb_in || skb_network_header(skb_in) < skb_in->head ||
     793             :             (skb_network_header(skb_in) + sizeof(struct iphdr)) >
     794             :             skb_tail_pointer(skb_in) || skb_ensure_writable(skb_in,
     795             :             skb_network_offset(skb_in) + sizeof(struct iphdr))))
     796             :                 goto out;
     797             : 
     798             :         orig_ip = ip_hdr(skb_in)->saddr;
     799             :         ip_hdr(skb_in)->saddr = ct->tuplehash[0].tuple.src.u3.ip;
     800             :         __icmp_send(skb_in, type, code, info, &opts);
     801             :         ip_hdr(skb_in)->saddr = orig_ip;
     802             : out:
     803             :         consume_skb(cloned_skb);
     804             : }
     805             : EXPORT_SYMBOL(icmp_ndo_send);
     806             : #endif
     807             : 
     808          14 : static void icmp_socket_deliver(struct sk_buff *skb, u32 info)
     809             : {
     810          14 :         const struct iphdr *iph = (const struct iphdr *)skb->data;
     811          14 :         const struct net_protocol *ipprot;
     812          14 :         int protocol = iph->protocol;
     813             : 
     814             :         /* Checkin full IP header plus 8 bytes of protocol to
     815             :          * avoid additional coding at protocol handlers.
     816             :          */
     817          14 :         if (!pskb_may_pull(skb, iph->ihl * 4 + 8)) {
     818           0 :                 __ICMP_INC_STATS(dev_net(skb->dev), ICMP_MIB_INERRORS);
     819           0 :                 return;
     820             :         }
     821             : 
     822          14 :         raw_icmp_error(skb, protocol, info);
     823             : 
     824          14 :         ipprot = rcu_dereference(inet_protos[protocol]);
     825          14 :         if (ipprot && ipprot->err_handler)
     826          14 :                 ipprot->err_handler(skb, info);
     827             : }
     828             : 
     829           0 : static bool icmp_tag_validation(int proto)
     830             : {
     831           0 :         bool ok;
     832             : 
     833           0 :         rcu_read_lock();
     834           0 :         ok = rcu_dereference(inet_protos[proto])->icmp_strict_tag_validation;
     835           0 :         rcu_read_unlock();
     836           0 :         return ok;
     837             : }
     838             : 
     839             : /*
     840             :  *      Handle ICMP_DEST_UNREACH, ICMP_TIME_EXCEEDED, ICMP_QUENCH, and
     841             :  *      ICMP_PARAMETERPROB.
     842             :  */
     843             : 
     844          14 : static bool icmp_unreach(struct sk_buff *skb)
     845             : {
     846          14 :         const struct iphdr *iph;
     847          14 :         struct icmphdr *icmph;
     848          14 :         struct net *net;
     849          14 :         u32 info = 0;
     850             : 
     851          14 :         net = dev_net(skb_dst(skb)->dev);
     852             : 
     853             :         /*
     854             :          *      Incomplete header ?
     855             :          *      Only checks for the IP header, there should be an
     856             :          *      additional check for longer headers in upper levels.
     857             :          */
     858             : 
     859          14 :         if (!pskb_may_pull(skb, sizeof(struct iphdr)))
     860           0 :                 goto out_err;
     861             : 
     862          14 :         icmph = icmp_hdr(skb);
     863          14 :         iph   = (const struct iphdr *)skb->data;
     864             : 
     865          14 :         if (iph->ihl < 5) /* Mangled header, drop. */
     866           0 :                 goto out_err;
     867             : 
     868          14 :         switch (icmph->type) {
     869          14 :         case ICMP_DEST_UNREACH:
     870          14 :                 switch (icmph->code & 15) {
     871             :                 case ICMP_NET_UNREACH:
     872             :                 case ICMP_HOST_UNREACH:
     873             :                 case ICMP_PROT_UNREACH:
     874             :                 case ICMP_PORT_UNREACH:
     875             :                         break;
     876           0 :                 case ICMP_FRAG_NEEDED:
     877             :                         /* for documentation of the ip_no_pmtu_disc
     878             :                          * values please see
     879             :                          * Documentation/networking/ip-sysctl.rst
     880             :                          */
     881           0 :                         switch (net->ipv4.sysctl_ip_no_pmtu_disc) {
     882             :                         default:
     883             :                                 net_dbg_ratelimited("%pI4: fragmentation needed and DF set\n",
     884             :                                                     &iph->daddr);
     885             :                                 break;
     886           0 :                         case 2:
     887           0 :                                 goto out;
     888           0 :                         case 3:
     889           0 :                                 if (!icmp_tag_validation(iph->protocol))
     890           0 :                                         goto out;
     891           0 :                                 fallthrough;
     892             :                         case 0:
     893           0 :                                 info = ntohs(icmph->un.frag.mtu);
     894             :                         }
     895             :                         break;
     896             :                 case ICMP_SR_FAILED:
     897             :                         net_dbg_ratelimited("%pI4: Source Route Failed\n",
     898             :                                             &iph->daddr);
     899             :                         break;
     900             :                 default:
     901             :                         break;
     902             :                 }
     903          14 :                 if (icmph->code > NR_ICMP_UNREACH)
     904           0 :                         goto out;
     905             :                 break;
     906           0 :         case ICMP_PARAMETERPROB:
     907           0 :                 info = ntohl(icmph->un.gateway) >> 24;
     908           0 :                 break;
     909             :         case ICMP_TIME_EXCEEDED:
     910           0 :                 __ICMP_INC_STATS(net, ICMP_MIB_INTIMEEXCDS);
     911           0 :                 if (icmph->code == ICMP_EXC_FRAGTIME)
     912           0 :                         goto out;
     913             :                 break;
     914             :         }
     915             : 
     916             :         /*
     917             :          *      Throw it at our lower layers
     918             :          *
     919             :          *      RFC 1122: 3.2.2 MUST extract the protocol ID from the passed
     920             :          *                header.
     921             :          *      RFC 1122: 3.2.2.1 MUST pass ICMP unreach messages to the
     922             :          *                transport layer.
     923             :          *      RFC 1122: 3.2.2.2 MUST pass ICMP time expired messages to
     924             :          *                transport layer.
     925             :          */
     926             : 
     927             :         /*
     928             :          *      Check the other end isn't violating RFC 1122. Some routers send
     929             :          *      bogus responses to broadcast frames. If you see this message
     930             :          *      first check your netmask matches at both ends, if it does then
     931             :          *      get the other vendor to fix their kit.
     932             :          */
     933             : 
     934          14 :         if (!net->ipv4.sysctl_icmp_ignore_bogus_error_responses &&
     935           0 :             inet_addr_type_dev_table(net, skb->dev, iph->daddr) == RTN_BROADCAST) {
     936           0 :                 net_warn_ratelimited("%pI4 sent an invalid ICMP type %u, code %u error to a broadcast: %pI4 on %s\n",
     937             :                                      &ip_hdr(skb)->saddr,
     938             :                                      icmph->type, icmph->code,
     939             :                                      &iph->daddr, skb->dev->name);
     940           0 :                 goto out;
     941             :         }
     942             : 
     943          14 :         icmp_socket_deliver(skb, info);
     944             : 
     945             : out:
     946             :         return true;
     947           0 : out_err:
     948           0 :         __ICMP_INC_STATS(net, ICMP_MIB_INERRORS);
     949           0 :         return false;
     950             : }
     951             : 
     952             : 
     953             : /*
     954             :  *      Handle ICMP_REDIRECT.
     955             :  */
     956             : 
     957           0 : static bool icmp_redirect(struct sk_buff *skb)
     958             : {
     959           0 :         if (skb->len < sizeof(struct iphdr)) {
     960           0 :                 __ICMP_INC_STATS(dev_net(skb->dev), ICMP_MIB_INERRORS);
     961           0 :                 return false;
     962             :         }
     963             : 
     964           0 :         if (!pskb_may_pull(skb, sizeof(struct iphdr))) {
     965             :                 /* there aught to be a stat */
     966             :                 return false;
     967             :         }
     968             : 
     969           0 :         icmp_socket_deliver(skb, ntohl(icmp_hdr(skb)->un.gateway));
     970           0 :         return true;
     971             : }
     972             : 
     973             : /*
     974             :  *      Handle ICMP_ECHO ("ping") requests.
     975             :  *
     976             :  *      RFC 1122: 3.2.2.6 MUST have an echo server that answers ICMP echo
     977             :  *                requests.
     978             :  *      RFC 1122: 3.2.2.6 Data received in the ICMP_ECHO request MUST be
     979             :  *                included in the reply.
     980             :  *      RFC 1812: 4.3.3.6 SHOULD have a config option for silently ignoring
     981             :  *                echo requests, MUST have default=NOT.
     982             :  *      See also WRT handling of options once they are done and working.
     983             :  */
     984             : 
     985           0 : static bool icmp_echo(struct sk_buff *skb)
     986             : {
     987           0 :         struct net *net;
     988             : 
     989           0 :         net = dev_net(skb_dst(skb)->dev);
     990           0 :         if (!net->ipv4.sysctl_icmp_echo_ignore_all) {
     991           0 :                 struct icmp_bxm icmp_param;
     992             : 
     993           0 :                 icmp_param.data.icmph      = *icmp_hdr(skb);
     994           0 :                 icmp_param.data.icmph.type = ICMP_ECHOREPLY;
     995           0 :                 icmp_param.skb             = skb;
     996           0 :                 icmp_param.offset          = 0;
     997           0 :                 icmp_param.data_len        = skb->len;
     998           0 :                 icmp_param.head_len        = sizeof(struct icmphdr);
     999           0 :                 icmp_reply(&icmp_param, skb);
    1000             :         }
    1001             :         /* should there be an ICMP stat for ignored echos? */
    1002           0 :         return true;
    1003             : }
    1004             : 
    1005             : /*
    1006             :  *      Handle ICMP Timestamp requests.
    1007             :  *      RFC 1122: 3.2.2.8 MAY implement ICMP timestamp requests.
    1008             :  *                SHOULD be in the kernel for minimum random latency.
    1009             :  *                MUST be accurate to a few minutes.
    1010             :  *                MUST be updated at least at 15Hz.
    1011             :  */
    1012           0 : static bool icmp_timestamp(struct sk_buff *skb)
    1013             : {
    1014           0 :         struct icmp_bxm icmp_param;
    1015             :         /*
    1016             :          *      Too short.
    1017             :          */
    1018           0 :         if (skb->len < 4)
    1019           0 :                 goto out_err;
    1020             : 
    1021             :         /*
    1022             :          *      Fill in the current time as ms since midnight UT:
    1023             :          */
    1024           0 :         icmp_param.data.times[1] = inet_current_timestamp();
    1025           0 :         icmp_param.data.times[2] = icmp_param.data.times[1];
    1026             : 
    1027           0 :         BUG_ON(skb_copy_bits(skb, 0, &icmp_param.data.times[0], 4));
    1028             : 
    1029           0 :         icmp_param.data.icmph      = *icmp_hdr(skb);
    1030           0 :         icmp_param.data.icmph.type = ICMP_TIMESTAMPREPLY;
    1031           0 :         icmp_param.data.icmph.code = 0;
    1032           0 :         icmp_param.skb             = skb;
    1033           0 :         icmp_param.offset          = 0;
    1034           0 :         icmp_param.data_len        = 0;
    1035           0 :         icmp_param.head_len        = sizeof(struct icmphdr) + 12;
    1036           0 :         icmp_reply(&icmp_param, skb);
    1037           0 :         return true;
    1038             : 
    1039           0 : out_err:
    1040           0 :         __ICMP_INC_STATS(dev_net(skb_dst(skb)->dev), ICMP_MIB_INERRORS);
    1041           0 :         return false;
    1042             : }
    1043             : 
    1044           0 : static bool icmp_discard(struct sk_buff *skb)
    1045             : {
    1046             :         /* pretend it was a success */
    1047           0 :         return true;
    1048             : }
    1049             : 
    1050             : /*
    1051             :  *      Deal with incoming ICMP packets.
    1052             :  */
    1053          14 : int icmp_rcv(struct sk_buff *skb)
    1054             : {
    1055          14 :         struct icmphdr *icmph;
    1056          14 :         struct rtable *rt = skb_rtable(skb);
    1057          14 :         struct net *net = dev_net(rt->dst.dev);
    1058          14 :         bool success;
    1059             : 
    1060          14 :         if (!xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb)) {
    1061             :                 struct sec_path *sp = skb_sec_path(skb);
    1062             :                 int nh;
    1063             : 
    1064             :                 if (!(sp && sp->xvec[sp->len - 1]->props.flags &
    1065             :                                  XFRM_STATE_ICMP))
    1066             :                         goto drop;
    1067             : 
    1068             :                 if (!pskb_may_pull(skb, sizeof(*icmph) + sizeof(struct iphdr)))
    1069             :                         goto drop;
    1070             : 
    1071             :                 nh = skb_network_offset(skb);
    1072             :                 skb_set_network_header(skb, sizeof(*icmph));
    1073             : 
    1074             :                 if (!xfrm4_policy_check_reverse(NULL, XFRM_POLICY_IN, skb))
    1075             :                         goto drop;
    1076             : 
    1077          14 :                 skb_set_network_header(skb, nh);
    1078             :         }
    1079             : 
    1080          14 :         __ICMP_INC_STATS(net, ICMP_MIB_INMSGS);
    1081             : 
    1082          14 :         if (skb_checksum_simple_validate(skb))
    1083           0 :                 goto csum_error;
    1084             : 
    1085          28 :         if (!pskb_pull(skb, sizeof(*icmph)))
    1086           0 :                 goto error;
    1087             : 
    1088          14 :         icmph = icmp_hdr(skb);
    1089             : 
    1090          14 :         ICMPMSGIN_INC_STATS(net, icmph->type);
    1091             :         /*
    1092             :          *      18 is the highest 'known' ICMP type. Anything else is a mystery
    1093             :          *
    1094             :          *      RFC 1122: 3.2.2  Unknown ICMP messages types MUST be silently
    1095             :          *                discarded.
    1096             :          */
    1097          14 :         if (icmph->type > NR_ICMP_TYPES)
    1098           0 :                 goto error;
    1099             : 
    1100             : 
    1101             :         /*
    1102             :          *      Parse the ICMP message
    1103             :          */
    1104             : 
    1105          14 :         if (rt->rt_flags & (RTCF_BROADCAST | RTCF_MULTICAST)) {
    1106             :                 /*
    1107             :                  *      RFC 1122: 3.2.2.6 An ICMP_ECHO to broadcast MAY be
    1108             :                  *        silently ignored (we let user decide with a sysctl).
    1109             :                  *      RFC 1122: 3.2.2.8 An ICMP_TIMESTAMP MAY be silently
    1110             :                  *        discarded if to broadcast/multicast.
    1111             :                  */
    1112           0 :                 if ((icmph->type == ICMP_ECHO ||
    1113           0 :                      icmph->type == ICMP_TIMESTAMP) &&
    1114           0 :                     net->ipv4.sysctl_icmp_echo_ignore_broadcasts) {
    1115           0 :                         goto error;
    1116             :                 }
    1117           0 :                 if (icmph->type != ICMP_ECHO &&
    1118           0 :                     icmph->type != ICMP_TIMESTAMP &&
    1119           0 :                     icmph->type != ICMP_ADDRESS &&
    1120             :                     icmph->type != ICMP_ADDRESSREPLY) {
    1121           0 :                         goto error;
    1122             :                 }
    1123             :         }
    1124             : 
    1125          14 :         success = icmp_pointers[icmph->type].handler(skb);
    1126             : 
    1127          14 :         if (success)  {
    1128          14 :                 consume_skb(skb);
    1129          14 :                 return NET_RX_SUCCESS;
    1130             :         }
    1131             : 
    1132           0 : drop:
    1133           0 :         kfree_skb(skb);
    1134           0 :         return NET_RX_DROP;
    1135           0 : csum_error:
    1136           0 :         __ICMP_INC_STATS(net, ICMP_MIB_CSUMERRORS);
    1137           0 : error:
    1138           0 :         __ICMP_INC_STATS(net, ICMP_MIB_INERRORS);
    1139           0 :         goto drop;
    1140             : }
    1141             : 
    1142           0 : static bool ip_icmp_error_rfc4884_validate(const struct sk_buff *skb, int off)
    1143             : {
    1144           0 :         struct icmp_extobj_hdr *objh, _objh;
    1145           0 :         struct icmp_ext_hdr *exth, _exth;
    1146           0 :         u16 olen;
    1147             : 
    1148           0 :         exth = skb_header_pointer(skb, off, sizeof(_exth), &_exth);
    1149           0 :         if (!exth)
    1150             :                 return false;
    1151           0 :         if (exth->version != 2)
    1152             :                 return true;
    1153             : 
    1154           0 :         if (exth->checksum &&
    1155           0 :             csum_fold(skb_checksum(skb, off, skb->len - off, 0)))
    1156             :                 return false;
    1157             : 
    1158           0 :         off += sizeof(_exth);
    1159           0 :         while (off < skb->len) {
    1160           0 :                 objh = skb_header_pointer(skb, off, sizeof(_objh), &_objh);
    1161           0 :                 if (!objh)
    1162             :                         return false;
    1163             : 
    1164           0 :                 olen = ntohs(objh->length);
    1165           0 :                 if (olen < sizeof(_objh))
    1166             :                         return false;
    1167             : 
    1168           0 :                 off += olen;
    1169           0 :                 if (off > skb->len)
    1170             :                         return false;
    1171             :         }
    1172             : 
    1173             :         return true;
    1174             : }
    1175             : 
    1176           0 : void ip_icmp_error_rfc4884(const struct sk_buff *skb,
    1177             :                            struct sock_ee_data_rfc4884 *out,
    1178             :                            int thlen, int off)
    1179             : {
    1180           0 :         int hlen;
    1181             : 
    1182             :         /* original datagram headers: end of icmph to payload (skb->data) */
    1183           0 :         hlen = -skb_transport_offset(skb) - thlen;
    1184             : 
    1185             :         /* per rfc 4884: minimal datagram length of 128 bytes */
    1186           0 :         if (off < 128 || off < hlen)
    1187             :                 return;
    1188             : 
    1189             :         /* kernel has stripped headers: return payload offset in bytes */
    1190           0 :         off -= hlen;
    1191           0 :         if (off + sizeof(struct icmp_ext_hdr) > skb->len)
    1192             :                 return;
    1193             : 
    1194           0 :         out->len = off;
    1195             : 
    1196           0 :         if (!ip_icmp_error_rfc4884_validate(skb, off))
    1197           0 :                 out->flags |= SO_EE_RFC4884_FLAG_INVALID;
    1198             : }
    1199             : EXPORT_SYMBOL_GPL(ip_icmp_error_rfc4884);
    1200             : 
    1201           0 : int icmp_err(struct sk_buff *skb, u32 info)
    1202             : {
    1203           0 :         struct iphdr *iph = (struct iphdr *)skb->data;
    1204           0 :         int offset = iph->ihl<<2;
    1205           0 :         struct icmphdr *icmph = (struct icmphdr *)(skb->data + offset);
    1206           0 :         int type = icmp_hdr(skb)->type;
    1207           0 :         int code = icmp_hdr(skb)->code;
    1208           0 :         struct net *net = dev_net(skb->dev);
    1209             : 
    1210             :         /*
    1211             :          * Use ping_err to handle all icmp errors except those
    1212             :          * triggered by ICMP_ECHOREPLY which sent from kernel.
    1213             :          */
    1214           0 :         if (icmph->type != ICMP_ECHOREPLY) {
    1215           0 :                 ping_err(skb, offset, info);
    1216           0 :                 return 0;
    1217             :         }
    1218             : 
    1219           0 :         if (type == ICMP_DEST_UNREACH && code == ICMP_FRAG_NEEDED)
    1220           0 :                 ipv4_update_pmtu(skb, net, info, 0, IPPROTO_ICMP);
    1221           0 :         else if (type == ICMP_REDIRECT)
    1222           0 :                 ipv4_redirect(skb, net, 0, IPPROTO_ICMP);
    1223             : 
    1224             :         return 0;
    1225             : }
    1226             : 
    1227             : /*
    1228             :  *      This table is the definition of how we handle ICMP.
    1229             :  */
    1230             : static const struct icmp_control icmp_pointers[NR_ICMP_TYPES + 1] = {
    1231             :         [ICMP_ECHOREPLY] = {
    1232             :                 .handler = ping_rcv,
    1233             :         },
    1234             :         [1] = {
    1235             :                 .handler = icmp_discard,
    1236             :                 .error = 1,
    1237             :         },
    1238             :         [2] = {
    1239             :                 .handler = icmp_discard,
    1240             :                 .error = 1,
    1241             :         },
    1242             :         [ICMP_DEST_UNREACH] = {
    1243             :                 .handler = icmp_unreach,
    1244             :                 .error = 1,
    1245             :         },
    1246             :         [ICMP_SOURCE_QUENCH] = {
    1247             :                 .handler = icmp_unreach,
    1248             :                 .error = 1,
    1249             :         },
    1250             :         [ICMP_REDIRECT] = {
    1251             :                 .handler = icmp_redirect,
    1252             :                 .error = 1,
    1253             :         },
    1254             :         [6] = {
    1255             :                 .handler = icmp_discard,
    1256             :                 .error = 1,
    1257             :         },
    1258             :         [7] = {
    1259             :                 .handler = icmp_discard,
    1260             :                 .error = 1,
    1261             :         },
    1262             :         [ICMP_ECHO] = {
    1263             :                 .handler = icmp_echo,
    1264             :         },
    1265             :         [9] = {
    1266             :                 .handler = icmp_discard,
    1267             :                 .error = 1,
    1268             :         },
    1269             :         [10] = {
    1270             :                 .handler = icmp_discard,
    1271             :                 .error = 1,
    1272             :         },
    1273             :         [ICMP_TIME_EXCEEDED] = {
    1274             :                 .handler = icmp_unreach,
    1275             :                 .error = 1,
    1276             :         },
    1277             :         [ICMP_PARAMETERPROB] = {
    1278             :                 .handler = icmp_unreach,
    1279             :                 .error = 1,
    1280             :         },
    1281             :         [ICMP_TIMESTAMP] = {
    1282             :                 .handler = icmp_timestamp,
    1283             :         },
    1284             :         [ICMP_TIMESTAMPREPLY] = {
    1285             :                 .handler = icmp_discard,
    1286             :         },
    1287             :         [ICMP_INFO_REQUEST] = {
    1288             :                 .handler = icmp_discard,
    1289             :         },
    1290             :         [ICMP_INFO_REPLY] = {
    1291             :                 .handler = icmp_discard,
    1292             :         },
    1293             :         [ICMP_ADDRESS] = {
    1294             :                 .handler = icmp_discard,
    1295             :         },
    1296             :         [ICMP_ADDRESSREPLY] = {
    1297             :                 .handler = icmp_discard,
    1298             :         },
    1299             : };
    1300             : 
    1301           0 : static void __net_exit icmp_sk_exit(struct net *net)
    1302             : {
    1303           0 :         int i;
    1304             : 
    1305           0 :         for_each_possible_cpu(i)
    1306           0 :                 inet_ctl_sock_destroy(*per_cpu_ptr(net->ipv4.icmp_sk, i));
    1307           0 :         free_percpu(net->ipv4.icmp_sk);
    1308           0 :         net->ipv4.icmp_sk = NULL;
    1309           0 : }
    1310             : 
    1311           1 : static int __net_init icmp_sk_init(struct net *net)
    1312             : {
    1313           1 :         int i, err;
    1314             : 
    1315           1 :         net->ipv4.icmp_sk = alloc_percpu(struct sock *);
    1316           1 :         if (!net->ipv4.icmp_sk)
    1317             :                 return -ENOMEM;
    1318             : 
    1319           5 :         for_each_possible_cpu(i) {
    1320           4 :                 struct sock *sk;
    1321             : 
    1322           4 :                 err = inet_ctl_sock_create(&sk, PF_INET,
    1323             :                                            SOCK_RAW, IPPROTO_ICMP, net);
    1324           4 :                 if (err < 0)
    1325           0 :                         goto fail;
    1326             : 
    1327           4 :                 *per_cpu_ptr(net->ipv4.icmp_sk, i) = sk;
    1328             : 
    1329             :                 /* Enough space for 2 64K ICMP packets, including
    1330             :                  * sk_buff/skb_shared_info struct overhead.
    1331             :                  */
    1332           4 :                 sk->sk_sndbuf =      2 * SKB_TRUESIZE(64 * 1024);
    1333             : 
    1334             :                 /*
    1335             :                  * Speedup sock_wfree()
    1336             :                  */
    1337           4 :                 sock_set_flag(sk, SOCK_USE_WRITE_QUEUE);
    1338           4 :                 inet_sk(sk)->pmtudisc = IP_PMTUDISC_DONT;
    1339             :         }
    1340             : 
    1341             :         /* Control parameters for ECHO replies. */
    1342           1 :         net->ipv4.sysctl_icmp_echo_ignore_all = 0;
    1343           1 :         net->ipv4.sysctl_icmp_echo_ignore_broadcasts = 1;
    1344             : 
    1345             :         /* Control parameter - ignore bogus broadcast responses? */
    1346           1 :         net->ipv4.sysctl_icmp_ignore_bogus_error_responses = 1;
    1347             : 
    1348             :         /*
    1349             :          *      Configurable global rate limit.
    1350             :          *
    1351             :          *      ratelimit defines tokens/packet consumed for dst->rate_token
    1352             :          *      bucket ratemask defines which icmp types are ratelimited by
    1353             :          *      setting it's bit position.
    1354             :          *
    1355             :          *      default:
    1356             :          *      dest unreachable (3), source quench (4),
    1357             :          *      time exceeded (11), parameter problem (12)
    1358             :          */
    1359             : 
    1360           1 :         net->ipv4.sysctl_icmp_ratelimit = 1 * HZ;
    1361           1 :         net->ipv4.sysctl_icmp_ratemask = 0x1818;
    1362           1 :         net->ipv4.sysctl_icmp_errors_use_inbound_ifaddr = 0;
    1363             : 
    1364           1 :         return 0;
    1365             : 
    1366           0 : fail:
    1367           0 :         icmp_sk_exit(net);
    1368           0 :         return err;
    1369             : }
    1370             : 
    1371             : static struct pernet_operations __net_initdata icmp_sk_ops = {
    1372             :        .init = icmp_sk_init,
    1373             :        .exit = icmp_sk_exit,
    1374             : };
    1375             : 
    1376           1 : int __init icmp_init(void)
    1377             : {
    1378           1 :         return register_pernet_subsys(&icmp_sk_ops);
    1379             : }

Generated by: LCOV version 1.14