LCOV - code coverage report
Current view: top level - net/ipv4 - ip_input.c (source / functions) Hit Total Coverage
Test: gcov_data_raspi2_real_modules_combined.info Lines: 74 155 47.7 %
Date: 2020-09-30 20:25:40 Functions: 8 13 61.5 %
Branches: 48 142 33.8 %

           Branch data     Line data    Source code
       1                 :            : // SPDX-License-Identifier: GPL-2.0-or-later
       2                 :            : /*
       3                 :            :  * INET         An implementation of the TCP/IP protocol suite for the LINUX
       4                 :            :  *              operating system.  INET is implemented using the  BSD Socket
       5                 :            :  *              interface as the means of communication with the user level.
       6                 :            :  *
       7                 :            :  *              The Internet Protocol (IP) module.
       8                 :            :  *
       9                 :            :  * Authors:     Ross Biro
      10                 :            :  *              Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
      11                 :            :  *              Donald Becker, <becker@super.org>
      12                 :            :  *              Alan Cox, <alan@lxorguk.ukuu.org.uk>
      13                 :            :  *              Richard Underwood
      14                 :            :  *              Stefan Becker, <stefanb@yello.ping.de>
      15                 :            :  *              Jorge Cwik, <jorge@laser.satlink.net>
      16                 :            :  *              Arnt Gulbrandsen, <agulbra@nvg.unit.no>
      17                 :            :  *
      18                 :            :  * Fixes:
      19                 :            :  *              Alan Cox        :       Commented a couple of minor bits of surplus code
      20                 :            :  *              Alan Cox        :       Undefining IP_FORWARD doesn't include the code
      21                 :            :  *                                      (just stops a compiler warning).
      22                 :            :  *              Alan Cox        :       Frames with >=MAX_ROUTE record routes, strict routes or loose routes
      23                 :            :  *                                      are junked rather than corrupting things.
      24                 :            :  *              Alan Cox        :       Frames to bad broadcast subnets are dumped
      25                 :            :  *                                      We used to process them non broadcast and
      26                 :            :  *                                      boy could that cause havoc.
      27                 :            :  *              Alan Cox        :       ip_forward sets the free flag on the
      28                 :            :  *                                      new frame it queues. Still crap because
      29                 :            :  *                                      it copies the frame but at least it
      30                 :            :  *                                      doesn't eat memory too.
      31                 :            :  *              Alan Cox        :       Generic queue code and memory fixes.
      32                 :            :  *              Fred Van Kempen :       IP fragment support (borrowed from NET2E)
      33                 :            :  *              Gerhard Koerting:       Forward fragmented frames correctly.
      34                 :            :  *              Gerhard Koerting:       Fixes to my fix of the above 8-).
      35                 :            :  *              Gerhard Koerting:       IP interface addressing fix.
      36                 :            :  *              Linus Torvalds  :       More robustness checks
      37                 :            :  *              Alan Cox        :       Even more checks: Still not as robust as it ought to be
      38                 :            :  *              Alan Cox        :       Save IP header pointer for later
      39                 :            :  *              Alan Cox        :       ip option setting
      40                 :            :  *              Alan Cox        :       Use ip_tos/ip_ttl settings
      41                 :            :  *              Alan Cox        :       Fragmentation bogosity removed
      42                 :            :  *                                      (Thanks to Mark.Bush@prg.ox.ac.uk)
      43                 :            :  *              Dmitry Gorodchanin :    Send of a raw packet crash fix.
      44                 :            :  *              Alan Cox        :       Silly ip bug when an overlength
      45                 :            :  *                                      fragment turns up. Now frees the
      46                 :            :  *                                      queue.
      47                 :            :  *              Linus Torvalds/ :       Memory leakage on fragmentation
      48                 :            :  *              Alan Cox        :       handling.
      49                 :            :  *              Gerhard Koerting:       Forwarding uses IP priority hints
      50                 :            :  *              Teemu Rantanen  :       Fragment problems.
      51                 :            :  *              Alan Cox        :       General cleanup, comments and reformat
      52                 :            :  *              Alan Cox        :       SNMP statistics
      53                 :            :  *              Alan Cox        :       BSD address rule semantics. Also see
      54                 :            :  *                                      UDP as there is a nasty checksum issue
      55                 :            :  *                                      if you do things the wrong way.
      56                 :            :  *              Alan Cox        :       Always defrag, moved IP_FORWARD to the config.in file
      57                 :            :  *              Alan Cox        :       IP options adjust sk->priority.
      58                 :            :  *              Pedro Roque     :       Fix mtu/length error in ip_forward.
      59                 :            :  *              Alan Cox        :       Avoid ip_chk_addr when possible.
      60                 :            :  *      Richard Underwood       :       IP multicasting.
      61                 :            :  *              Alan Cox        :       Cleaned up multicast handlers.
      62                 :            :  *              Alan Cox        :       RAW sockets demultiplex in the BSD style.
      63                 :            :  *              Gunther Mayer   :       Fix the SNMP reporting typo
      64                 :            :  *              Alan Cox        :       Always in group 224.0.0.1
      65                 :            :  *      Pauline Middelink       :       Fast ip_checksum update when forwarding
      66                 :            :  *                                      Masquerading support.
      67                 :            :  *              Alan Cox        :       Multicast loopback error for 224.0.0.1
      68                 :            :  *              Alan Cox        :       IP_MULTICAST_LOOP option.
      69                 :            :  *              Alan Cox        :       Use notifiers.
      70                 :            :  *              Bjorn Ekwall    :       Removed ip_csum (from slhc.c too)
      71                 :            :  *              Bjorn Ekwall    :       Moved ip_fast_csum to ip.h (inline!)
      72                 :            :  *              Stefan Becker   :       Send out ICMP HOST REDIRECT
      73                 :            :  *      Arnt Gulbrandsen        :       ip_build_xmit
      74                 :            :  *              Alan Cox        :       Per socket routing cache
      75                 :            :  *              Alan Cox        :       Fixed routing cache, added header cache.
      76                 :            :  *              Alan Cox        :       Loopback didn't work right in original ip_build_xmit - fixed it.
      77                 :            :  *              Alan Cox        :       Only send ICMP_REDIRECT if src/dest are the same net.
      78                 :            :  *              Alan Cox        :       Incoming IP option handling.
      79                 :            :  *              Alan Cox        :       Set saddr on raw output frames as per BSD.
      80                 :            :  *              Alan Cox        :       Stopped broadcast source route explosions.
      81                 :            :  *              Alan Cox        :       Can disable source routing
      82                 :            :  *              Takeshi Sone    :       Masquerading didn't work.
      83                 :            :  *      Dave Bonn,Alan Cox      :       Faster IP forwarding whenever possible.
      84                 :            :  *              Alan Cox        :       Memory leaks, tramples, misc debugging.
      85                 :            :  *              Alan Cox        :       Fixed multicast (by popular demand 8))
      86                 :            :  *              Alan Cox        :       Fixed forwarding (by even more popular demand 8))
      87                 :            :  *              Alan Cox        :       Fixed SNMP statistics [I think]
      88                 :            :  *      Gerhard Koerting        :       IP fragmentation forwarding fix
      89                 :            :  *              Alan Cox        :       Device lock against page fault.
      90                 :            :  *              Alan Cox        :       IP_HDRINCL facility.
      91                 :            :  *      Werner Almesberger      :       Zero fragment bug
      92                 :            :  *              Alan Cox        :       RAW IP frame length bug
      93                 :            :  *              Alan Cox        :       Outgoing firewall on build_xmit
      94                 :            :  *              A.N.Kuznetsov   :       IP_OPTIONS support throughout the kernel
      95                 :            :  *              Alan Cox        :       Multicast routing hooks
      96                 :            :  *              Jos Vos         :       Do accounting *before* call_in_firewall
      97                 :            :  *      Willy Konynenberg       :       Transparent proxying support
      98                 :            :  *
      99                 :            :  * To Fix:
     100                 :            :  *              IP fragmentation wants rewriting cleanly. The RFC815 algorithm is much more efficient
     101                 :            :  *              and could be made very efficient with the addition of some virtual memory hacks to permit
     102                 :            :  *              the allocation of a buffer that can then be 'grown' by twiddling page tables.
     103                 :            :  *              Output fragmentation wants updating along with the buffer management to use a single
     104                 :            :  *              interleaved copy algorithm so that fragmenting has a one copy overhead. Actual packet
     105                 :            :  *              output should probably do its own fragmentation at the UDP/RAW layer. TCP shouldn't cause
     106                 :            :  *              fragmentation anyway.
     107                 :            :  */
     108                 :            : 
     109                 :            : #define pr_fmt(fmt) "IPv4: " fmt
     110                 :            : 
     111                 :            : #include <linux/module.h>
     112                 :            : #include <linux/types.h>
     113                 :            : #include <linux/kernel.h>
     114                 :            : #include <linux/string.h>
     115                 :            : #include <linux/errno.h>
     116                 :            : #include <linux/slab.h>
     117                 :            : 
     118                 :            : #include <linux/net.h>
     119                 :            : #include <linux/socket.h>
     120                 :            : #include <linux/sockios.h>
     121                 :            : #include <linux/in.h>
     122                 :            : #include <linux/inet.h>
     123                 :            : #include <linux/inetdevice.h>
     124                 :            : #include <linux/netdevice.h>
     125                 :            : #include <linux/etherdevice.h>
     126                 :            : #include <linux/indirect_call_wrapper.h>
     127                 :            : 
     128                 :            : #include <net/snmp.h>
     129                 :            : #include <net/ip.h>
     130                 :            : #include <net/protocol.h>
     131                 :            : #include <net/route.h>
     132                 :            : #include <linux/skbuff.h>
     133                 :            : #include <net/sock.h>
     134                 :            : #include <net/arp.h>
     135                 :            : #include <net/icmp.h>
     136                 :            : #include <net/raw.h>
     137                 :            : #include <net/checksum.h>
     138                 :            : #include <net/inet_ecn.h>
     139                 :            : #include <linux/netfilter_ipv4.h>
     140                 :            : #include <net/xfrm.h>
     141                 :            : #include <linux/mroute.h>
     142                 :            : #include <linux/netlink.h>
     143                 :            : #include <net/dst_metadata.h>
     144                 :            : 
     145                 :            : /*
     146                 :            :  *      Process Router Attention IP option (RFC 2113)
     147                 :            :  */
     148                 :          0 : bool ip_call_ra_chain(struct sk_buff *skb)
     149                 :            : {
     150                 :            :         struct ip_ra_chain *ra;
     151                 :          0 :         u8 protocol = ip_hdr(skb)->protocol;
     152                 :            :         struct sock *last = NULL;
     153                 :          0 :         struct net_device *dev = skb->dev;
     154                 :            :         struct net *net = dev_net(dev);
     155                 :            : 
     156         [ #  # ]:          0 :         for (ra = rcu_dereference(net->ipv4.ra_chain); ra; ra = rcu_dereference(ra->next)) {
     157                 :          0 :                 struct sock *sk = ra->sk;
     158                 :            : 
     159                 :            :                 /* If socket is bound to an interface, only report
     160                 :            :                  * the packet if it came  from that interface.
     161                 :            :                  */
     162   [ #  #  #  #  :          0 :                 if (sk && inet_sk(sk)->inet_num == protocol &&
                   #  # ]
     163         [ #  # ]:          0 :                     (!sk->sk_bound_dev_if ||
     164                 :          0 :                      sk->sk_bound_dev_if == dev->ifindex)) {
     165         [ #  # ]:          0 :                         if (ip_is_fragment(ip_hdr(skb))) {
     166         [ #  # ]:          0 :                                 if (ip_defrag(net, skb, IP_DEFRAG_CALL_RA_CHAIN))
     167                 :            :                                         return true;
     168                 :            :                         }
     169         [ #  # ]:          0 :                         if (last) {
     170                 :          0 :                                 struct sk_buff *skb2 = skb_clone(skb, GFP_ATOMIC);
     171         [ #  # ]:          0 :                                 if (skb2)
     172                 :          0 :                                         raw_rcv(last, skb2);
     173                 :            :                         }
     174                 :            :                         last = sk;
     175                 :            :                 }
     176                 :            :         }
     177                 :            : 
     178         [ #  # ]:          0 :         if (last) {
     179                 :          0 :                 raw_rcv(last, skb);
     180                 :          0 :                 return true;
     181                 :            :         }
     182                 :            :         return false;
     183                 :            : }
     184                 :            : 
     185                 :            : INDIRECT_CALLABLE_DECLARE(int udp_rcv(struct sk_buff *));
     186                 :            : INDIRECT_CALLABLE_DECLARE(int tcp_v4_rcv(struct sk_buff *));
     187                 :       5798 : void ip_protocol_deliver_rcu(struct net *net, struct sk_buff *skb, int protocol)
     188                 :            : {
     189                 :            :         const struct net_protocol *ipprot;
     190                 :            :         int raw, ret;
     191                 :            : 
     192                 :            : resubmit:
     193                 :       5798 :         raw = raw_local_deliver(skb, protocol);
     194                 :            : 
     195                 :      11596 :         ipprot = rcu_dereference(inet_protos[protocol]);
     196         [ +  - ]:       5798 :         if (ipprot) {
     197         [ +  + ]:       5798 :                 if (!ipprot->no_policy) {
     198         [ -  + ]:        409 :                         if (!xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb)) {
     199                 :          0 :                                 kfree_skb(skb);
     200                 :       5798 :                                 return;
     201                 :            :                         }
     202                 :            :                         nf_reset_ct(skb);
     203                 :            :                 }
     204                 :       5798 :                 ret = INDIRECT_CALL_2(ipprot->handler, tcp_v4_rcv, udp_rcv,
     205                 :            :                                       skb);
     206         [ -  + ]:       5798 :                 if (ret < 0) {
     207                 :          0 :                         protocol = -ret;
     208                 :          0 :                         goto resubmit;
     209                 :            :                 }
     210                 :      17394 :                 __IP_INC_STATS(net, IPSTATS_MIB_INDELIVERS);
     211                 :            :         } else {
     212         [ #  # ]:          0 :                 if (!raw) {
     213         [ #  # ]:          0 :                         if (xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb)) {
     214                 :          0 :                                 __IP_INC_STATS(net, IPSTATS_MIB_INUNKNOWNPROTOS);
     215                 :            :                                 icmp_send(skb, ICMP_DEST_UNREACH,
     216                 :            :                                           ICMP_PROT_UNREACH, 0);
     217                 :            :                         }
     218                 :          0 :                         kfree_skb(skb);
     219                 :            :                 } else {
     220                 :          0 :                         __IP_INC_STATS(net, IPSTATS_MIB_INDELIVERS);
     221                 :          0 :                         consume_skb(skb);
     222                 :            :                 }
     223                 :            :         }
     224                 :            : }
     225                 :            : 
     226                 :       5798 : static int ip_local_deliver_finish(struct net *net, struct sock *sk, struct sk_buff *skb)
     227                 :            : {
     228                 :       5798 :         __skb_pull(skb, skb_network_header_len(skb));
     229                 :            : 
     230                 :            :         rcu_read_lock();
     231                 :       5798 :         ip_protocol_deliver_rcu(net, skb, ip_hdr(skb)->protocol);
     232                 :            :         rcu_read_unlock();
     233                 :            : 
     234                 :       5798 :         return 0;
     235                 :            : }
     236                 :            : 
     237                 :            : /*
     238                 :            :  *      Deliver IP Packets to the higher protocol layers.
     239                 :            :  */
     240                 :       5798 : int ip_local_deliver(struct sk_buff *skb)
     241                 :            : {
     242                 :            :         /*
     243                 :            :          *      Reassemble IP fragments.
     244                 :            :          */
     245                 :       5798 :         struct net *net = dev_net(skb->dev);
     246                 :            : 
     247         [ -  + ]:       5798 :         if (ip_is_fragment(ip_hdr(skb))) {
     248         [ #  # ]:          0 :                 if (ip_defrag(net, skb, IP_DEFRAG_LOCAL_DELIVER))
     249                 :            :                         return 0;
     250                 :            :         }
     251                 :            : 
     252                 :       5798 :         return NF_HOOK(NFPROTO_IPV4, NF_INET_LOCAL_IN,
     253                 :            :                        net, NULL, skb, skb->dev, NULL,
     254                 :            :                        ip_local_deliver_finish);
     255                 :            : }
     256                 :            : 
     257                 :        409 : static inline bool ip_rcv_options(struct sk_buff *skb, struct net_device *dev)
     258                 :            : {
     259                 :            :         struct ip_options *opt;
     260                 :            :         const struct iphdr *iph;
     261                 :            : 
     262                 :            :         /* It looks as overkill, because not all
     263                 :            :            IP options require packet mangling.
     264                 :            :            But it is the easiest for now, especially taking
     265                 :            :            into account that combination of IP options
     266                 :            :            and running sniffer is extremely rare condition.
     267                 :            :                                               --ANK (980813)
     268                 :            :         */
     269         [ -  + ]:        409 :         if (skb_cow(skb, skb_headroom(skb))) {
     270                 :          0 :                 __IP_INC_STATS(dev_net(dev), IPSTATS_MIB_INDISCARDS);
     271                 :            :                 goto drop;
     272                 :            :         }
     273                 :            : 
     274                 :            :         iph = ip_hdr(skb);
     275                 :        409 :         opt = &(IPCB(skb)->opt);
     276                 :        409 :         opt->optlen = iph->ihl*4 - sizeof(struct iphdr);
     277                 :            : 
     278         [ -  + ]:        409 :         if (ip_options_compile(dev_net(dev), opt, skb)) {
     279                 :          0 :                 __IP_INC_STATS(dev_net(dev), IPSTATS_MIB_INHDRERRORS);
     280                 :            :                 goto drop;
     281                 :            :         }
     282                 :            : 
     283         [ -  + ]:        409 :         if (unlikely(opt->srr)) {
     284                 :            :                 struct in_device *in_dev = __in_dev_get_rcu(dev);
     285                 :            : 
     286         [ #  # ]:          0 :                 if (in_dev) {
     287   [ #  #  #  # ]:          0 :                         if (!IN_DEV_SOURCE_ROUTE(in_dev)) {
     288   [ #  #  #  # ]:          0 :                                 if (IN_DEV_LOG_MARTIANS(in_dev))
     289         [ #  # ]:          0 :                                         net_info_ratelimited("source route option %pI4 -> %pI4\n",
     290                 :            :                                                              &iph->saddr,
     291                 :            :                                                              &iph->daddr);
     292                 :            :                                 goto drop;
     293                 :            :                         }
     294                 :            :                 }
     295                 :            : 
     296         [ #  # ]:          0 :                 if (ip_options_rcv_srr(skb, dev))
     297                 :            :                         goto drop;
     298                 :            :         }
     299                 :            : 
     300                 :            :         return false;
     301                 :            : drop:
     302                 :            :         return true;
     303                 :            : }
     304                 :            : 
     305                 :            : INDIRECT_CALLABLE_DECLARE(int udp_v4_early_demux(struct sk_buff *));
     306                 :            : INDIRECT_CALLABLE_DECLARE(int tcp_v4_early_demux(struct sk_buff *));
     307                 :       6048 : static int ip_rcv_finish_core(struct net *net, struct sock *sk,
     308                 :            :                               struct sk_buff *skb, struct net_device *dev)
     309                 :            : {
     310                 :            :         const struct iphdr *iph = ip_hdr(skb);
     311                 :            :         int (*edemux)(struct sk_buff *skb);
     312                 :            :         struct rtable *rt;
     313                 :            :         int err;
     314                 :            : 
     315   [ +  -  +  + ]:      12096 :         if (net->ipv4.sysctl_ip_early_demux &&
     316         [ +  - ]:       4707 :             !skb_dst(skb) &&
     317         [ +  - ]:       9414 :             !skb->sk &&
     318                 :            :             !ip_is_fragment(iph)) {
     319                 :            :                 const struct net_protocol *ipprot;
     320                 :       4707 :                 int protocol = iph->protocol;
     321                 :            : 
     322                 :       9414 :                 ipprot = rcu_dereference(inet_protos[protocol]);
     323   [ +  -  +  + ]:       9414 :                 if (ipprot && (edemux = READ_ONCE(ipprot->early_demux))) {
     324                 :       4377 :                         err = INDIRECT_CALL_2(edemux, tcp_v4_early_demux,
     325                 :            :                                               udp_v4_early_demux, skb);
     326         [ +  - ]:       4377 :                         if (unlikely(err))
     327                 :            :                                 goto drop_error;
     328                 :            :                         /* must reload iph, skb->head might have changed */
     329                 :            :                         iph = ip_hdr(skb);
     330                 :            :                 }
     331                 :            :         }
     332                 :            : 
     333                 :            :         /*
     334                 :            :          *      Initialise the virtual path cache for the packet. It describes
     335                 :            :          *      how the packet travels inside Linux networking.
     336                 :            :          */
     337         [ +  + ]:       6048 :         if (!skb_valid_dst(skb)) {
     338                 :       3668 :                 err = ip_route_input_noref(skb, iph->daddr, iph->saddr,
     339                 :            :                                            iph->tos, dev);
     340         [ +  - ]:       3668 :                 if (unlikely(err))
     341                 :            :                         goto drop_error;
     342                 :            :         }
     343                 :            : 
     344                 :            : #ifdef CONFIG_IP_ROUTE_CLASSID
     345         [ -  + ]:       6048 :         if (unlikely(skb_dst(skb)->tclassid)) {
     346                 :          0 :                 struct ip_rt_acct *st = this_cpu_ptr(ip_rt_acct);
     347                 :            :                 u32 idx = skb_dst(skb)->tclassid;
     348                 :          0 :                 st[idx&0xFF].o_packets++;
     349                 :          0 :                 st[idx&0xFF].o_bytes += skb->len;
     350                 :          0 :                 st[(idx>>16)&0xFF].i_packets++;
     351                 :          0 :                 st[(idx>>16)&0xFF].i_bytes += skb->len;
     352                 :            :         }
     353                 :            : #endif
     354                 :            : 
     355   [ +  +  +  - ]:       6048 :         if (iph->ihl > 5 && ip_rcv_options(skb, dev))
     356                 :            :                 goto drop;
     357                 :            : 
     358                 :            :         rt = skb_rtable(skb);
     359         [ +  + ]:       6048 :         if (rt->rt_type == RTN_MULTICAST) {
     360                 :       7890 :                 __IP_UPD_PO_STATS(net, IPSTATS_MIB_INMCAST, skb->len);
     361         [ +  + ]:       3418 :         } else if (rt->rt_type == RTN_BROADCAST) {
     362                 :       4533 :                 __IP_UPD_PO_STATS(net, IPSTATS_MIB_INBCAST, skb->len);
     363         [ +  + ]:       1907 :         } else if (skb->pkt_type == PACKET_BROADCAST ||
     364                 :            :                    skb->pkt_type == PACKET_MULTICAST) {
     365                 :            :                 struct in_device *in_dev = __in_dev_get_rcu(dev);
     366                 :            : 
     367                 :            :                 /* RFC 1122 3.3.6:
     368                 :            :                  *
     369                 :            :                  *   When a host sends a datagram to a link-layer broadcast
     370                 :            :                  *   address, the IP destination address MUST be a legal IP
     371                 :            :                  *   broadcast or IP multicast address.
     372                 :            :                  *
     373                 :            :                  *   A host SHOULD silently discard a datagram that is received
     374                 :            :                  *   via a link-layer broadcast (see Section 2.4) but does not
     375                 :            :                  *   specify an IP multicast or broadcast destination address.
     376                 :            :                  *
     377                 :            :                  * This doesn't explicitly say L2 *broadcast*, but broadcast is
     378                 :            :                  * in a way a form of multicast and the most common use case for
     379                 :            :                  * this is 802.11 protecting against cross-station spoofing (the
     380                 :            :                  * so-called "hole-196" attack) so do it for both.
     381                 :            :                  */
     382   [ +  -  +  - ]:         82 :                 if (in_dev &&
     383         [ -  + ]:        123 :                     IN_DEV_ORCONF(in_dev, DROP_UNICAST_IN_L2_MULTICAST))
     384                 :            :                         goto drop;
     385                 :            :         }
     386                 :            : 
     387                 :            :         return NET_RX_SUCCESS;
     388                 :            : 
     389                 :            : drop:
     390                 :          0 :         kfree_skb(skb);
     391                 :          0 :         return NET_RX_DROP;
     392                 :            : 
     393                 :            : drop_error:
     394         [ #  # ]:          0 :         if (err == -EXDEV)
     395                 :          0 :                 __NET_INC_STATS(net, LINUX_MIB_IPRPFILTER);
     396                 :            :         goto drop;
     397                 :            : }
     398                 :            : 
     399                 :       6048 : static int ip_rcv_finish(struct net *net, struct sock *sk, struct sk_buff *skb)
     400                 :            : {
     401                 :       6048 :         struct net_device *dev = skb->dev;
     402                 :            :         int ret;
     403                 :            : 
     404                 :            :         /* if ingress device is enslaved to an L3 master device pass the
     405                 :            :          * skb to its handler for processing
     406                 :            :          */
     407                 :            :         skb = l3mdev_ip_rcv(skb);
     408         [ +  - ]:       6048 :         if (!skb)
     409                 :            :                 return NET_RX_SUCCESS;
     410                 :            : 
     411                 :       6048 :         ret = ip_rcv_finish_core(net, sk, skb, dev);
     412         [ +  - ]:       6048 :         if (ret != NET_RX_DROP)
     413                 :            :                 ret = dst_input(skb);
     414                 :       6048 :         return ret;
     415                 :            : }
     416                 :            : 
     417                 :            : /*
     418                 :            :  *      Main IP Receive routine.
     419                 :            :  */
     420                 :       6048 : static struct sk_buff *ip_rcv_core(struct sk_buff *skb, struct net *net)
     421                 :            : {
     422                 :            :         const struct iphdr *iph;
     423                 :            :         u32 len;
     424                 :            : 
     425                 :            :         /* When the interface is in promisc. mode, drop all the crap
     426                 :            :          * that it receives, do not try to analyse it.
     427                 :            :          */
     428         [ +  - ]:       6048 :         if (skb->pkt_type == PACKET_OTHERHOST)
     429                 :            :                 goto drop;
     430                 :            : 
     431                 :      18144 :         __IP_UPD_PO_STATS(net, IPSTATS_MIB_IN, skb->len);
     432                 :            : 
     433                 :       6048 :         skb = skb_share_check(skb, GFP_ATOMIC);
     434         [ -  + ]:       6048 :         if (!skb) {
     435                 :          0 :                 __IP_INC_STATS(net, IPSTATS_MIB_INDISCARDS);
     436                 :            :                 goto out;
     437                 :            :         }
     438                 :            : 
     439         [ +  - ]:       6048 :         if (!pskb_may_pull(skb, sizeof(struct iphdr)))
     440                 :            :                 goto inhdr_error;
     441                 :            : 
     442                 :            :         iph = ip_hdr(skb);
     443                 :            : 
     444                 :            :         /*
     445                 :            :          *      RFC1122: 3.2.1.2 MUST silently discard any IP frame that fails the checksum.
     446                 :            :          *
     447                 :            :          *      Is the datagram acceptable?
     448                 :            :          *
     449                 :            :          *      1.      Length at least the size of an ip header
     450                 :            :          *      2.      Version of 4
     451                 :            :          *      3.      Checksums correctly. [Speed optimisation for later, skip loopback checksums]
     452                 :            :          *      4.      Doesn't have a bogus length
     453                 :            :          */
     454                 :            : 
     455   [ +  -  +  - ]:       6048 :         if (iph->ihl < 5 || iph->version != 4)
     456                 :            :                 goto inhdr_error;
     457                 :            : 
     458                 :            :         BUILD_BUG_ON(IPSTATS_MIB_ECT1PKTS != IPSTATS_MIB_NOECTPKTS + INET_ECN_ECT_1);
     459                 :            :         BUILD_BUG_ON(IPSTATS_MIB_ECT0PKTS != IPSTATS_MIB_NOECTPKTS + INET_ECN_ECT_0);
     460                 :            :         BUILD_BUG_ON(IPSTATS_MIB_CEPKTS != IPSTATS_MIB_NOECTPKTS + INET_ECN_CE);
     461         [ -  + ]:      18144 :         __IP_ADD_STATS(net,
     462                 :            :                        IPSTATS_MIB_NOECTPKTS + (iph->tos & INET_ECN_MASK),
     463                 :            :                        max_t(unsigned short, 1, skb_shinfo(skb)->gso_segs));
     464                 :            : 
     465         [ +  - ]:       6048 :         if (!pskb_may_pull(skb, iph->ihl*4))
     466                 :            :                 goto inhdr_error;
     467                 :            : 
     468                 :            :         iph = ip_hdr(skb);
     469                 :            : 
     470         [ +  - ]:       6048 :         if (unlikely(ip_fast_csum((u8 *)iph, iph->ihl)))
     471                 :            :                 goto csum_error;
     472                 :            : 
     473                 :       6048 :         len = ntohs(iph->tot_len);
     474         [ -  + ]:       6048 :         if (skb->len < len) {
     475                 :          0 :                 __IP_INC_STATS(net, IPSTATS_MIB_INTRUNCATEDPKTS);
     476                 :            :                 goto drop;
     477         [ +  - ]:       6048 :         } else if (len < (iph->ihl*4))
     478                 :            :                 goto inhdr_error;
     479                 :            : 
     480                 :            :         /* Our transport medium may have padded the buffer out. Now we know it
     481                 :            :          * is IP we can trim to the true length of the frame.
     482                 :            :          * Note this now means skb->len holds ntohs(iph->tot_len).
     483                 :            :          */
     484         [ -  + ]:       6048 :         if (pskb_trim_rcsum(skb, len)) {
     485                 :          0 :                 __IP_INC_STATS(net, IPSTATS_MIB_INDISCARDS);
     486                 :            :                 goto drop;
     487                 :            :         }
     488                 :            : 
     489                 :            :         iph = ip_hdr(skb);
     490                 :       6048 :         skb->transport_header = skb->network_header + iph->ihl*4;
     491                 :            : 
     492                 :            :         /* Remove any debris in the socket control block */
     493                 :       6048 :         memset(IPCB(skb), 0, sizeof(struct inet_skb_parm));
     494                 :       6048 :         IPCB(skb)->iif = skb->skb_iif;
     495                 :            : 
     496                 :            :         /* Must drop socket now because of tproxy. */
     497                 :       6048 :         skb_orphan(skb);
     498                 :            : 
     499                 :       6048 :         return skb;
     500                 :            : 
     501                 :            : csum_error:
     502                 :          0 :         __IP_INC_STATS(net, IPSTATS_MIB_CSUMERRORS);
     503                 :            : inhdr_error:
     504                 :          0 :         __IP_INC_STATS(net, IPSTATS_MIB_INHDRERRORS);
     505                 :            : drop:
     506                 :          0 :         kfree_skb(skb);
     507                 :            : out:
     508                 :            :         return NULL;
     509                 :            : }
     510                 :            : 
     511                 :            : /*
     512                 :            :  * IP receive entry point
     513                 :            :  */
     514                 :       6048 : int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt,
     515                 :            :            struct net_device *orig_dev)
     516                 :            : {
     517                 :            :         struct net *net = dev_net(dev);
     518                 :            : 
     519                 :       6048 :         skb = ip_rcv_core(skb, net);
     520         [ +  - ]:       6048 :         if (skb == NULL)
     521                 :            :                 return NET_RX_DROP;
     522                 :            : 
     523                 :       6048 :         return NF_HOOK(NFPROTO_IPV4, NF_INET_PRE_ROUTING,
     524                 :            :                        net, NULL, skb, dev, NULL,
     525                 :            :                        ip_rcv_finish);
     526                 :            : }
     527                 :            : 
     528                 :          0 : static void ip_sublist_rcv_finish(struct list_head *head)
     529                 :            : {
     530                 :            :         struct sk_buff *skb, *next;
     531                 :            : 
     532         [ #  # ]:          0 :         list_for_each_entry_safe(skb, next, head, list) {
     533                 :            :                 skb_list_del_init(skb);
     534                 :            :                 dst_input(skb);
     535                 :            :         }
     536                 :          0 : }
     537                 :            : 
     538                 :          0 : static void ip_list_rcv_finish(struct net *net, struct sock *sk,
     539                 :            :                                struct list_head *head)
     540                 :            : {
     541                 :            :         struct dst_entry *curr_dst = NULL;
     542                 :            :         struct sk_buff *skb, *next;
     543                 :            :         struct list_head sublist;
     544                 :            : 
     545                 :            :         INIT_LIST_HEAD(&sublist);
     546         [ #  # ]:          0 :         list_for_each_entry_safe(skb, next, head, list) {
     547                 :          0 :                 struct net_device *dev = skb->dev;
     548                 :            :                 struct dst_entry *dst;
     549                 :            : 
     550                 :            :                 skb_list_del_init(skb);
     551                 :            :                 /* if ingress device is enslaved to an L3 master device pass the
     552                 :            :                  * skb to its handler for processing
     553                 :            :                  */
     554                 :            :                 skb = l3mdev_ip_rcv(skb);
     555         [ #  # ]:          0 :                 if (!skb)
     556                 :          0 :                         continue;
     557         [ #  # ]:          0 :                 if (ip_rcv_finish_core(net, sk, skb, dev) == NET_RX_DROP)
     558                 :          0 :                         continue;
     559                 :            : 
     560                 :            :                 dst = skb_dst(skb);
     561         [ #  # ]:          0 :                 if (curr_dst != dst) {
     562                 :            :                         /* dispatch old sublist */
     563         [ #  # ]:          0 :                         if (!list_empty(&sublist))
     564                 :          0 :                                 ip_sublist_rcv_finish(&sublist);
     565                 :            :                         /* start new sublist */
     566                 :            :                         INIT_LIST_HEAD(&sublist);
     567                 :            :                         curr_dst = dst;
     568                 :            :                 }
     569                 :          0 :                 list_add_tail(&skb->list, &sublist);
     570                 :            :         }
     571                 :            :         /* dispatch final sublist */
     572                 :          0 :         ip_sublist_rcv_finish(&sublist);
     573                 :          0 : }
     574                 :            : 
     575                 :          0 : static void ip_sublist_rcv(struct list_head *head, struct net_device *dev,
     576                 :            :                            struct net *net)
     577                 :            : {
     578                 :          0 :         NF_HOOK_LIST(NFPROTO_IPV4, NF_INET_PRE_ROUTING, net, NULL,
     579                 :            :                      head, dev, NULL, ip_rcv_finish);
     580                 :          0 :         ip_list_rcv_finish(net, NULL, head);
     581                 :          0 : }
     582                 :            : 
     583                 :            : /* Receive a list of IP packets */
     584                 :          0 : void ip_list_rcv(struct list_head *head, struct packet_type *pt,
     585                 :            :                  struct net_device *orig_dev)
     586                 :            : {
     587                 :            :         struct net_device *curr_dev = NULL;
     588                 :            :         struct net *curr_net = NULL;
     589                 :            :         struct sk_buff *skb, *next;
     590                 :            :         struct list_head sublist;
     591                 :            : 
     592                 :            :         INIT_LIST_HEAD(&sublist);
     593         [ #  # ]:          0 :         list_for_each_entry_safe(skb, next, head, list) {
     594                 :          0 :                 struct net_device *dev = skb->dev;
     595                 :            :                 struct net *net = dev_net(dev);
     596                 :            : 
     597                 :            :                 skb_list_del_init(skb);
     598                 :          0 :                 skb = ip_rcv_core(skb, net);
     599         [ #  # ]:          0 :                 if (skb == NULL)
     600                 :          0 :                         continue;
     601                 :            : 
     602         [ #  # ]:          0 :                 if (curr_dev != dev || curr_net != net) {
     603                 :            :                         /* dispatch old sublist */
     604         [ #  # ]:          0 :                         if (!list_empty(&sublist))
     605                 :          0 :                                 ip_sublist_rcv(&sublist, curr_dev, curr_net);
     606                 :            :                         /* start new sublist */
     607                 :            :                         INIT_LIST_HEAD(&sublist);
     608                 :            :                         curr_dev = dev;
     609                 :            :                         curr_net = net;
     610                 :            :                 }
     611                 :          0 :                 list_add_tail(&skb->list, &sublist);
     612                 :            :         }
     613                 :            :         /* dispatch final sublist */
     614                 :          0 :         ip_sublist_rcv(&sublist, curr_dev, curr_net);
     615                 :          0 : }

Generated by: LCOV version 1.14