[IPV4/6]: Check if packet was actually delivered to a raw socket to decide whether...
[deliverable/linux.git] / net / ipv4 / ip_input.c
index af2ec88bbb2fc1ae4c841f7168780f95f2e2aedb..81e18023dc19c299afa03108df2ddd1756e2e342 100644 (file)
@@ -225,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;
@@ -283,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
@@ -354,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;
 
This page took 0.049018 seconds and 5 git commands to generate.