ipv4: Kill early demux method return value.
[deliverable/linux.git] / net / ipv4 / ip_input.c
index 8590144ca3303ad99cb2c59a6eeef00ae12e2ffa..b27d4440f523d0d500cbb83a97ed4b6e46d125b6 100644 (file)
@@ -198,14 +198,13 @@ static int ip_local_deliver_finish(struct sk_buff *skb)
        rcu_read_lock();
        {
                int protocol = ip_hdr(skb)->protocol;
-               int hash, raw;
                const struct net_protocol *ipprot;
+               int raw;
 
        resubmit:
                raw = raw_local_deliver(skb, protocol);
 
-               hash = protocol & (MAX_INET_PROTOS - 1);
-               ipprot = rcu_dereference(inet_protos[hash]);
+               ipprot = rcu_dereference(inet_protos[protocol]);
                if (ipprot != NULL) {
                        int ret;
 
@@ -314,26 +313,33 @@ drop:
        return true;
 }
 
+int sysctl_ip_early_demux __read_mostly = 1;
+
 static int ip_rcv_finish(struct sk_buff *skb)
 {
        const struct iphdr *iph = ip_hdr(skb);
        struct rtable *rt;
 
+       if (sysctl_ip_early_demux && !skb_dst(skb)) {
+               const struct net_protocol *ipprot;
+               int protocol = iph->protocol;
+
+               rcu_read_lock();
+               ipprot = rcu_dereference(inet_protos[protocol]);
+               if (ipprot && ipprot->early_demux)
+                       ipprot->early_demux(skb);
+               rcu_read_unlock();
+       }
+
        /*
         *      Initialise the virtual path cache for the packet. It describes
         *      how the packet travels inside Linux networking.
         */
-       if (skb_dst(skb) == NULL) {
+       if (!skb_dst(skb)) {
                int err = ip_route_input_noref(skb, iph->daddr, iph->saddr,
                                               iph->tos, skb->dev);
                if (unlikely(err)) {
-                       if (err == -EHOSTUNREACH)
-                               IP_INC_STATS_BH(dev_net(skb->dev),
-                                               IPSTATS_MIB_INADDRERRORS);
-                       else if (err == -ENETUNREACH)
-                               IP_INC_STATS_BH(dev_net(skb->dev),
-                                               IPSTATS_MIB_INNOROUTES);
-                       else if (err == -EXDEV)
+                       if (err == -EXDEV)
                                NET_INC_STATS_BH(dev_net(skb->dev),
                                                 LINUX_MIB_IPRPFILTER);
                        goto drop;
This page took 0.052135 seconds and 5 git commands to generate.