]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - net/ipv4/ip_input.c
[IPV4/6]: Check if packet was actually delivered to a raw socket to decide whether...
[net-next-2.6.git] / net / ipv4 / ip_input.c
index 4e47a2658c7cd3444f6bf10ec769f9fc726859fb..81e18023dc19c299afa03108df2ddd1756e2e342 100644 (file)
@@ -184,6 +184,7 @@ int ip_call_ra_chain(struct sk_buff *skb)
                                        raw_rcv(last, skb2);
                        }
                        last = sk;
+                       nf_reset(skb);
                }
        }
 
@@ -200,10 +201,6 @@ static inline int ip_local_deliver_finish(struct sk_buff *skb)
 {
        int ihl = skb->nh.iph->ihl*4;
 
-#ifdef CONFIG_NETFILTER_DEBUG
-       nf_debug_ip_local_deliver(skb);
-#endif /*CONFIG_NETFILTER_DEBUG*/
-
        __skb_pull(skb, ihl);
 
        /* Free reference early: we don't need it any more, and it may
@@ -228,8 +225,8 @@ static inline int ip_local_deliver_finish(struct sk_buff *skb)
                /* If there maybe a raw socket we must check - if not we
                 * don't care less
                 */
-               if (raw_sk)
-                       raw_v4_input(skb, skb->nh.iph, hash);
+               if (raw_sk && !raw_v4_input(skb, skb->nh.iph, hash))
+                       raw_sk = NULL;
 
                if ((ipprot = rcu_dereference(inet_protos[hash])) != NULL) {
                        int ret;
@@ -286,14 +283,18 @@ static inline int ip_rcv_finish(struct sk_buff *skb)
 {
        struct net_device *dev = skb->dev;
        struct iphdr *iph = skb->nh.iph;
+       int err;
 
        /*
         *      Initialise the virtual path cache for the packet. It describes
         *      how the packet travels inside Linux networking.
         */ 
        if (skb->dst == NULL) {
-               if (ip_route_input(skb, iph->daddr, iph->saddr, iph->tos, dev))
+               if ((err = ip_route_input(skb, iph->daddr, iph->saddr, iph->tos, dev))) {
+                       if (err == -EHOSTUNREACH)
+                               IP_INC_STATS_BH(IPSTATS_MIB_INADDRERRORS);
                        goto drop; 
+               }
        }
 
 #ifdef CONFIG_NET_CLS_ROUTE
@@ -357,7 +358,7 @@ drop:
 /*
  *     Main IP Receive routine.
  */ 
-int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt)
+int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, struct net_device *orig_dev)
 {
        struct iphdr *iph;