linux/net/ipv4/ip_input.c
<<
>>
Prefs
   1/*
   2 * INET         An implementation of the TCP/IP protocol suite for the LINUX
   3 *              operating system.  INET is implemented using the  BSD Socket
   4 *              interface as the means of communication with the user level.
   5 *
   6 *              The Internet Protocol (IP) module.
   7 *
   8 * Authors:     Ross Biro
   9 *              Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
  10 *              Donald Becker, <becker@super.org>
  11 *              Alan Cox, <alan@lxorguk.ukuu.org.uk>
  12 *              Richard Underwood
  13 *              Stefan Becker, <stefanb@yello.ping.de>
  14 *              Jorge Cwik, <jorge@laser.satlink.net>
  15 *              Arnt Gulbrandsen, <agulbra@nvg.unit.no>
  16 *
  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 *
 100 *
 101 * To Fix:
 102 *              IP fragmentation wants rewriting cleanly. The RFC815 algorithm is much more efficient
 103 *              and could be made very efficient with the addition of some virtual memory hacks to permit
 104 *              the allocation of a buffer that can then be 'grown' by twiddling page tables.
 105 *              Output fragmentation wants updating along with the buffer management to use a single
 106 *              interleaved copy algorithm so that fragmenting has a one copy overhead. Actual packet
 107 *              output should probably do its own fragmentation at the UDP/RAW layer. TCP shouldn't cause
 108 *              fragmentation anyway.
 109 *
 110 *              This program is free software; you can redistribute it and/or
 111 *              modify it under the terms of the GNU General Public License
 112 *              as published by the Free Software Foundation; either version
 113 *              2 of the License, or (at your option) any later version.
 114 */
 115
 116#define pr_fmt(fmt) "IPv4: " fmt
 117
 118#include <linux/module.h>
 119#include <linux/types.h>
 120#include <linux/kernel.h>
 121#include <linux/string.h>
 122#include <linux/errno.h>
 123#include <linux/slab.h>
 124
 125#include <linux/net.h>
 126#include <linux/socket.h>
 127#include <linux/sockios.h>
 128#include <linux/in.h>
 129#include <linux/inet.h>
 130#include <linux/inetdevice.h>
 131#include <linux/netdevice.h>
 132#include <linux/etherdevice.h>
 133
 134#include <net/snmp.h>
 135#include <net/ip.h>
 136#include <net/protocol.h>
 137#include <net/route.h>
 138#include <linux/skbuff.h>
 139#include <net/sock.h>
 140#include <net/arp.h>
 141#include <net/icmp.h>
 142#include <net/raw.h>
 143#include <net/checksum.h>
 144#include <net/inet_ecn.h>
 145#include <linux/netfilter_ipv4.h>
 146#include <net/xfrm.h>
 147#include <linux/mroute.h>
 148#include <linux/netlink.h>
 149#include <net/dst_metadata.h>
 150
 151/*
 152 *      Process Router Attention IP option (RFC 2113)
 153 */
 154bool ip_call_ra_chain(struct sk_buff *skb)
 155{
 156        struct ip_ra_chain *ra;
 157        u8 protocol = ip_hdr(skb)->protocol;
 158        struct sock *last = NULL;
 159        struct net_device *dev = skb->dev;
 160        struct net *net = dev_net(dev);
 161
 162        for (ra = rcu_dereference(net->ipv4.ra_chain); ra; ra = rcu_dereference(ra->next)) {
 163                struct sock *sk = ra->sk;
 164
 165                /* If socket is bound to an interface, only report
 166                 * the packet if it came  from that interface.
 167                 */
 168                if (sk && inet_sk(sk)->inet_num == protocol &&
 169                    (!sk->sk_bound_dev_if ||
 170                     sk->sk_bound_dev_if == dev->ifindex)) {
 171                        if (ip_is_fragment(ip_hdr(skb))) {
 172                                if (ip_defrag(net, skb, IP_DEFRAG_CALL_RA_CHAIN))
 173                                        return true;
 174                        }
 175                        if (last) {
 176                                struct sk_buff *skb2 = skb_clone(skb, GFP_ATOMIC);
 177                                if (skb2)
 178                                        raw_rcv(last, skb2);
 179                        }
 180                        last = sk;
 181                }
 182        }
 183
 184        if (last) {
 185                raw_rcv(last, skb);
 186                return true;
 187        }
 188        return false;
 189}
 190
 191static int ip_local_deliver_finish(struct net *net, struct sock *sk, struct sk_buff *skb)
 192{
 193        __skb_pull(skb, skb_network_header_len(skb));
 194
 195        rcu_read_lock();
 196        {
 197                int protocol = ip_hdr(skb)->protocol;
 198                const struct net_protocol *ipprot;
 199                int raw;
 200
 201        resubmit:
 202                raw = raw_local_deliver(skb, protocol);
 203
 204                ipprot = rcu_dereference(inet_protos[protocol]);
 205                if (ipprot) {
 206                        int ret;
 207
 208                        if (!ipprot->no_policy) {
 209                                if (!xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb)) {
 210                                        kfree_skb(skb);
 211                                        goto out;
 212                                }
 213                                nf_reset(skb);
 214                        }
 215                        ret = ipprot->handler(skb);
 216                        if (ret < 0) {
 217                                protocol = -ret;
 218                                goto resubmit;
 219                        }
 220                        __IP_INC_STATS(net, IPSTATS_MIB_INDELIVERS);
 221                } else {
 222                        if (!raw) {
 223                                if (xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb)) {
 224                                        __IP_INC_STATS(net, IPSTATS_MIB_INUNKNOWNPROTOS);
 225                                        icmp_send(skb, ICMP_DEST_UNREACH,
 226                                                  ICMP_PROT_UNREACH, 0);
 227                                }
 228                                kfree_skb(skb);
 229                        } else {
 230                                __IP_INC_STATS(net, IPSTATS_MIB_INDELIVERS);
 231                                consume_skb(skb);
 232                        }
 233                }
 234        }
 235 out:
 236        rcu_read_unlock();
 237
 238        return 0;
 239}
 240
 241/*
 242 *      Deliver IP Packets to the higher protocol layers.
 243 */
 244int ip_local_deliver(struct sk_buff *skb)
 245{
 246        /*
 247         *      Reassemble IP fragments.
 248         */
 249        struct net *net = dev_net(skb->dev);
 250
 251        if (ip_is_fragment(ip_hdr(skb))) {
 252                if (ip_defrag(net, skb, IP_DEFRAG_LOCAL_DELIVER))
 253                        return 0;
 254        }
 255
 256        return NF_HOOK(NFPROTO_IPV4, NF_INET_LOCAL_IN,
 257                       net, NULL, skb, skb->dev, NULL,
 258                       ip_local_deliver_finish);
 259}
 260
 261static inline bool ip_rcv_options(struct sk_buff *skb)
 262{
 263        struct ip_options *opt;
 264        const struct iphdr *iph;
 265        struct net_device *dev = skb->dev;
 266
 267        /* It looks as overkill, because not all
 268           IP options require packet mangling.
 269           But it is the easiest for now, especially taking
 270           into account that combination of IP options
 271           and running sniffer is extremely rare condition.
 272                                              --ANK (980813)
 273        */
 274        if (skb_cow(skb, skb_headroom(skb))) {
 275                __IP_INC_STATS(dev_net(dev), IPSTATS_MIB_INDISCARDS);
 276                goto drop;
 277        }
 278
 279        iph = ip_hdr(skb);
 280        opt = &(IPCB(skb)->opt);
 281        opt->optlen = iph->ihl*4 - sizeof(struct iphdr);
 282
 283        if (ip_options_compile(dev_net(dev), opt, skb)) {
 284                __IP_INC_STATS(dev_net(dev), IPSTATS_MIB_INHDRERRORS);
 285                goto drop;
 286        }
 287
 288        if (unlikely(opt->srr)) {
 289                struct in_device *in_dev = __in_dev_get_rcu(dev);
 290
 291                if (in_dev) {
 292                        if (!IN_DEV_SOURCE_ROUTE(in_dev)) {
 293                                if (IN_DEV_LOG_MARTIANS(in_dev))
 294                                        net_info_ratelimited("source route option %pI4 -> %pI4\n",
 295                                                             &iph->saddr,
 296                                                             &iph->daddr);
 297                                goto drop;
 298                        }
 299                }
 300
 301                if (ip_options_rcv_srr(skb))
 302                        goto drop;
 303        }
 304
 305        return false;
 306drop:
 307        return true;
 308}
 309
 310static int ip_rcv_finish_core(struct net *net, struct sock *sk,
 311                              struct sk_buff *skb)
 312{
 313        const struct iphdr *iph = ip_hdr(skb);
 314        int (*edemux)(struct sk_buff *skb);
 315        struct net_device *dev = skb->dev;
 316        struct rtable *rt;
 317        int err;
 318
 319        if (net->ipv4.sysctl_ip_early_demux &&
 320            !skb_dst(skb) &&
 321            !skb->sk &&
 322            !ip_is_fragment(iph)) {
 323                const struct net_protocol *ipprot;
 324                int protocol = iph->protocol;
 325
 326                ipprot = rcu_dereference(inet_protos[protocol]);
 327                if (ipprot && (edemux = READ_ONCE(ipprot->early_demux))) {
 328                        err = edemux(skb);
 329                        if (unlikely(err))
 330                                goto drop_error;
 331                        /* must reload iph, skb->head might have changed */
 332                        iph = ip_hdr(skb);
 333                }
 334        }
 335
 336        /*
 337         *      Initialise the virtual path cache for the packet. It describes
 338         *      how the packet travels inside Linux networking.
 339         */
 340        if (!skb_valid_dst(skb)) {
 341                err = ip_route_input_noref(skb, iph->daddr, iph->saddr,
 342                                           iph->tos, dev);
 343                if (unlikely(err))
 344                        goto drop_error;
 345        }
 346
 347#ifdef CONFIG_IP_ROUTE_CLASSID
 348        if (unlikely(skb_dst(skb)->tclassid)) {
 349                struct ip_rt_acct *st = this_cpu_ptr(ip_rt_acct);
 350                u32 idx = skb_dst(skb)->tclassid;
 351                st[idx&0xFF].o_packets++;
 352                st[idx&0xFF].o_bytes += skb->len;
 353                st[(idx>>16)&0xFF].i_packets++;
 354                st[(idx>>16)&0xFF].i_bytes += skb->len;
 355        }
 356#endif
 357
 358        if (iph->ihl > 5 && ip_rcv_options(skb))
 359                goto drop;
 360
 361        rt = skb_rtable(skb);
 362        if (rt->rt_type == RTN_MULTICAST) {
 363                __IP_UPD_PO_STATS(net, IPSTATS_MIB_INMCAST, skb->len);
 364        } else if (rt->rt_type == RTN_BROADCAST) {
 365                __IP_UPD_PO_STATS(net, IPSTATS_MIB_INBCAST, skb->len);
 366        } else if (skb->pkt_type == PACKET_BROADCAST ||
 367                   skb->pkt_type == PACKET_MULTICAST) {
 368                struct in_device *in_dev = __in_dev_get_rcu(dev);
 369
 370                /* RFC 1122 3.3.6:
 371                 *
 372                 *   When a host sends a datagram to a link-layer broadcast
 373                 *   address, the IP destination address MUST be a legal IP
 374                 *   broadcast or IP multicast address.
 375                 *
 376                 *   A host SHOULD silently discard a datagram that is received
 377                 *   via a link-layer broadcast (see Section 2.4) but does not
 378                 *   specify an IP multicast or broadcast destination address.
 379                 *
 380                 * This doesn't explicitly say L2 *broadcast*, but broadcast is
 381                 * in a way a form of multicast and the most common use case for
 382                 * this is 802.11 protecting against cross-station spoofing (the
 383                 * so-called "hole-196" attack) so do it for both.
 384                 */
 385                if (in_dev &&
 386                    IN_DEV_ORCONF(in_dev, DROP_UNICAST_IN_L2_MULTICAST))
 387                        goto drop;
 388        }
 389
 390        return NET_RX_SUCCESS;
 391
 392drop:
 393        kfree_skb(skb);
 394        return NET_RX_DROP;
 395
 396drop_error:
 397        if (err == -EXDEV)
 398                __NET_INC_STATS(net, LINUX_MIB_IPRPFILTER);
 399        goto drop;
 400}
 401
 402static int ip_rcv_finish(struct net *net, struct sock *sk, struct sk_buff *skb)
 403{
 404        int ret;
 405
 406        /* if ingress device is enslaved to an L3 master device pass the
 407         * skb to its handler for processing
 408         */
 409        skb = l3mdev_ip_rcv(skb);
 410        if (!skb)
 411                return NET_RX_SUCCESS;
 412
 413        ret = ip_rcv_finish_core(net, sk, skb);
 414        if (ret != NET_RX_DROP)
 415                ret = dst_input(skb);
 416        return ret;
 417}
 418
 419/*
 420 *      Main IP Receive routine.
 421 */
 422static struct sk_buff *ip_rcv_core(struct sk_buff *skb, struct net *net)
 423{
 424        const struct iphdr *iph;
 425        u32 len;
 426
 427        /* When the interface is in promisc. mode, drop all the crap
 428         * that it receives, do not try to analyse it.
 429         */
 430        if (skb->pkt_type == PACKET_OTHERHOST)
 431                goto drop;
 432
 433
 434        __IP_UPD_PO_STATS(net, IPSTATS_MIB_IN, skb->len);
 435
 436        skb = skb_share_check(skb, GFP_ATOMIC);
 437        if (!skb) {
 438                __IP_INC_STATS(net, IPSTATS_MIB_INDISCARDS);
 439                goto out;
 440        }
 441
 442        if (!pskb_may_pull(skb, sizeof(struct iphdr)))
 443                goto inhdr_error;
 444
 445        iph = ip_hdr(skb);
 446
 447        /*
 448         *      RFC1122: 3.2.1.2 MUST silently discard any IP frame that fails the checksum.
 449         *
 450         *      Is the datagram acceptable?
 451         *
 452         *      1.      Length at least the size of an ip header
 453         *      2.      Version of 4
 454         *      3.      Checksums correctly. [Speed optimisation for later, skip loopback checksums]
 455         *      4.      Doesn't have a bogus length
 456         */
 457
 458        if (iph->ihl < 5 || iph->version != 4)
 459                goto inhdr_error;
 460
 461        BUILD_BUG_ON(IPSTATS_MIB_ECT1PKTS != IPSTATS_MIB_NOECTPKTS + INET_ECN_ECT_1);
 462        BUILD_BUG_ON(IPSTATS_MIB_ECT0PKTS != IPSTATS_MIB_NOECTPKTS + INET_ECN_ECT_0);
 463        BUILD_BUG_ON(IPSTATS_MIB_CEPKTS != IPSTATS_MIB_NOECTPKTS + INET_ECN_CE);
 464        __IP_ADD_STATS(net,
 465                       IPSTATS_MIB_NOECTPKTS + (iph->tos & INET_ECN_MASK),
 466                       max_t(unsigned short, 1, skb_shinfo(skb)->gso_segs));
 467
 468        if (!pskb_may_pull(skb, iph->ihl*4))
 469                goto inhdr_error;
 470
 471        iph = ip_hdr(skb);
 472
 473        if (unlikely(ip_fast_csum((u8 *)iph, iph->ihl)))
 474                goto csum_error;
 475
 476        len = ntohs(iph->tot_len);
 477        if (skb->len < len) {
 478                __IP_INC_STATS(net, IPSTATS_MIB_INTRUNCATEDPKTS);
 479                goto drop;
 480        } else if (len < (iph->ihl*4))
 481                goto inhdr_error;
 482
 483        /* Our transport medium may have padded the buffer out. Now we know it
 484         * is IP we can trim to the true length of the frame.
 485         * Note this now means skb->len holds ntohs(iph->tot_len).
 486         */
 487        if (pskb_trim_rcsum(skb, len)) {
 488                __IP_INC_STATS(net, IPSTATS_MIB_INDISCARDS);
 489                goto drop;
 490        }
 491
 492        skb->transport_header = skb->network_header + iph->ihl*4;
 493
 494        /* Remove any debris in the socket control block */
 495        memset(IPCB(skb), 0, sizeof(struct inet_skb_parm));
 496        IPCB(skb)->iif = skb->skb_iif;
 497
 498        /* Must drop socket now because of tproxy. */
 499        skb_orphan(skb);
 500
 501        return skb;
 502
 503csum_error:
 504        __IP_INC_STATS(net, IPSTATS_MIB_CSUMERRORS);
 505inhdr_error:
 506        __IP_INC_STATS(net, IPSTATS_MIB_INHDRERRORS);
 507drop:
 508        kfree_skb(skb);
 509out:
 510        return NULL;
 511}
 512
 513/*
 514 * IP receive entry point
 515 */
 516int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt,
 517           struct net_device *orig_dev)
 518{
 519        struct net *net = dev_net(dev);
 520
 521        skb = ip_rcv_core(skb, net);
 522        if (skb == NULL)
 523                return NET_RX_DROP;
 524        return NF_HOOK(NFPROTO_IPV4, NF_INET_PRE_ROUTING,
 525                       net, NULL, skb, dev, NULL,
 526                       ip_rcv_finish);
 527}
 528
 529static void ip_sublist_rcv_finish(struct list_head *head)
 530{
 531        struct sk_buff *skb, *next;
 532
 533        list_for_each_entry_safe(skb, next, head, list) {
 534                list_del(&skb->list);
 535                /* Handle ip{6}_forward case, as sch_direct_xmit have
 536                 * another kind of SKB-list usage (see validate_xmit_skb_list)
 537                 */
 538                skb->next = NULL;
 539                dst_input(skb);
 540        }
 541}
 542
 543static void ip_list_rcv_finish(struct net *net, struct sock *sk,
 544                               struct list_head *head)
 545{
 546        struct dst_entry *curr_dst = NULL;
 547        struct sk_buff *skb, *next;
 548        struct list_head sublist;
 549
 550        INIT_LIST_HEAD(&sublist);
 551        list_for_each_entry_safe(skb, next, head, list) {
 552                struct dst_entry *dst;
 553
 554                list_del(&skb->list);
 555                /* if ingress device is enslaved to an L3 master device pass the
 556                 * skb to its handler for processing
 557                 */
 558                skb = l3mdev_ip_rcv(skb);
 559                if (!skb)
 560                        continue;
 561                if (ip_rcv_finish_core(net, sk, skb) == NET_RX_DROP)
 562                        continue;
 563
 564                dst = skb_dst(skb);
 565                if (curr_dst != dst) {
 566                        /* dispatch old sublist */
 567                        if (!list_empty(&sublist))
 568                                ip_sublist_rcv_finish(&sublist);
 569                        /* start new sublist */
 570                        INIT_LIST_HEAD(&sublist);
 571                        curr_dst = dst;
 572                }
 573                list_add_tail(&skb->list, &sublist);
 574        }
 575        /* dispatch final sublist */
 576        ip_sublist_rcv_finish(&sublist);
 577}
 578
 579static void ip_sublist_rcv(struct list_head *head, struct net_device *dev,
 580                           struct net *net)
 581{
 582        NF_HOOK_LIST(NFPROTO_IPV4, NF_INET_PRE_ROUTING, net, NULL,
 583                     head, dev, NULL, ip_rcv_finish);
 584        ip_list_rcv_finish(net, NULL, head);
 585}
 586
 587/* Receive a list of IP packets */
 588void ip_list_rcv(struct list_head *head, struct packet_type *pt,
 589                 struct net_device *orig_dev)
 590{
 591        struct net_device *curr_dev = NULL;
 592        struct net *curr_net = NULL;
 593        struct sk_buff *skb, *next;
 594        struct list_head sublist;
 595
 596        INIT_LIST_HEAD(&sublist);
 597        list_for_each_entry_safe(skb, next, head, list) {
 598                struct net_device *dev = skb->dev;
 599                struct net *net = dev_net(dev);
 600
 601                list_del(&skb->list);
 602                skb = ip_rcv_core(skb, net);
 603                if (skb == NULL)
 604                        continue;
 605
 606                if (curr_dev != dev || curr_net != net) {
 607                        /* dispatch old sublist */
 608                        if (!list_empty(&sublist))
 609                                ip_sublist_rcv(&sublist, curr_dev, curr_net);
 610                        /* start new sublist */
 611                        INIT_LIST_HEAD(&sublist);
 612                        curr_dev = dev;
 613                        curr_net = net;
 614                }
 615                list_add_tail(&skb->list, &sublist);
 616        }
 617        /* dispatch final sublist */
 618        ip_sublist_rcv(&sublist, curr_dev, curr_net);
 619}
 620