vserver 1.9.5.x5
[linux-2.6.git] / net / ipv4 / ip_input.c
index 2f71ed5..51069c0 100644 (file)
@@ -172,7 +172,7 @@ int ip_call_ra_chain(struct sk_buff *skb)
                    (!sk->sk_bound_dev_if ||
                     sk->sk_bound_dev_if == skb->dev->ifindex)) {
                        if (skb->nh.iph->frag_off & htons(IP_MF|IP_OFFSET)) {
-                               skb = ip_defrag(skb);
+                               skb = ip_defrag(skb, IP_DEFRAG_CALL_RA_CHAIN);
                                if (skb == NULL) {
                                        read_unlock(&ip_ra_lock);
                                        return 1;
@@ -202,17 +202,13 @@ static inline int ip_local_deliver_finish(struct sk_buff *skb)
 
 #ifdef CONFIG_NETFILTER_DEBUG
        nf_debug_ip_local_deliver(skb);
-       skb->nf_debug = 0;
 #endif /*CONFIG_NETFILTER_DEBUG*/
 
        __skb_pull(skb, ihl);
 
-#ifdef CONFIG_NETFILTER
        /* Free reference early: we don't need it any more, and it may
            hold ip_conntrack module loaded indefinitely. */
-       nf_conntrack_put(skb->nfct);
-       skb->nfct = NULL;
-#endif /*CONFIG_NETFILTER*/
+       nf_reset(skb);
 
         /* Point into the IP datagram, just past the header. */
         skb->h.raw = skb->data;
@@ -223,7 +219,7 @@ static inline int ip_local_deliver_finish(struct sk_buff *skb)
                int protocol = skb->nh.iph->protocol;
                int hash;
                struct sock *raw_sk;
-               struct inet_protocol *ipprot;
+               struct net_protocol *ipprot;
 
        resubmit:
                hash = protocol & (MAX_INET_PROTOS - 1);
@@ -235,10 +231,9 @@ static inline int ip_local_deliver_finish(struct sk_buff *skb)
                if (raw_sk)
                        raw_v4_input(skb, skb->nh.iph, hash);
 
-               if ((ipprot = inet_protos[hash]) != NULL) {
+               if ((ipprot = rcu_dereference(inet_protos[hash])) != NULL) {
                        int ret;
 
-                       smp_read_barrier_depends();
                        if (!ipprot->no_policy &&
                            !xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb)) {
                                kfree_skb(skb);
@@ -249,16 +244,16 @@ static inline int ip_local_deliver_finish(struct sk_buff *skb)
                                protocol = -ret;
                                goto resubmit;
                        }
-                       IP_INC_STATS_BH(InDelivers);
+                       IP_INC_STATS_BH(IPSTATS_MIB_INDELIVERS);
                } else {
                        if (!raw_sk) {
                                if (xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb)) {
-                                       IP_INC_STATS_BH(InUnknownProtos);
+                                       IP_INC_STATS_BH(IPSTATS_MIB_INUNKNOWNPROTOS);
                                        icmp_send(skb, ICMP_DEST_UNREACH,
                                                  ICMP_PROT_UNREACH, 0);
                                }
                        } else
-                               IP_INC_STATS_BH(InDelivers);
+                               IP_INC_STATS_BH(IPSTATS_MIB_INDELIVERS);
                        kfree_skb(skb);
                }
        }
@@ -278,7 +273,7 @@ int ip_local_deliver(struct sk_buff *skb)
         */
 
        if (skb->nh.iph->frag_off & htons(IP_MF|IP_OFFSET)) {
-               skb = ip_defrag(skb);
+               skb = ip_defrag(skb, IP_DEFRAG_LOCAL_DELIVER);
                if (!skb)
                        return 0;
        }
@@ -324,7 +319,7 @@ static inline int ip_rcv_finish(struct sk_buff *skb)
                */
 
                if (skb_cow(skb, skb_headroom(skb))) {
-                       IP_INC_STATS_BH(InDiscards);
+                       IP_INC_STATS_BH(IPSTATS_MIB_INDISCARDS);
                        goto drop;
                }
                iph = skb->nh.iph;
@@ -353,7 +348,7 @@ static inline int ip_rcv_finish(struct sk_buff *skb)
        return dst_input(skb);
 
 inhdr_error:
-       IP_INC_STATS_BH(InHdrErrors);
+       IP_INC_STATS_BH(IPSTATS_MIB_INHDRERRORS);
 drop:
         kfree_skb(skb);
         return NET_RX_DROP;
@@ -372,10 +367,10 @@ int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt)
        if (skb->pkt_type == PACKET_OTHERHOST)
                goto drop;
 
-       IP_INC_STATS_BH(InReceives);
+       IP_INC_STATS_BH(IPSTATS_MIB_INRECEIVES);
 
        if ((skb = skb_share_check(skb, GFP_ATOMIC)) == NULL) {
-               IP_INC_STATS_BH(InDiscards);
+               IP_INC_STATS_BH(IPSTATS_MIB_INDISCARDS);
                goto out;
        }
 
@@ -426,7 +421,7 @@ int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt)
                       ip_rcv_finish);
 
 inhdr_error:
-       IP_INC_STATS_BH(InHdrErrors);
+       IP_INC_STATS_BH(IPSTATS_MIB_INHDRERRORS);
 drop:
         kfree_skb(skb);
 out: