]> err.no Git - linux-2.6/blobdiff - net/ipv4/netfilter/nf_conntrack_proto_icmp.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-2.6
[linux-2.6] / net / ipv4 / netfilter / nf_conntrack_proto_icmp.c
index 4004a04c551014205886bc3768523a77f2ccdd2b..97791048fa9b0c3fd7afc9802025ebe6db963cf5 100644 (file)
 
 static unsigned long nf_ct_icmp_timeout __read_mostly = 30*HZ;
 
-static int icmp_pkt_to_tuple(const struct sk_buff *skb,
-                            unsigned int dataoff,
-                            struct nf_conntrack_tuple *tuple)
+static bool icmp_pkt_to_tuple(const struct sk_buff *skb, unsigned int dataoff,
+                             struct nf_conntrack_tuple *tuple)
 {
-       struct icmphdr _hdr, *hp;
+       const struct icmphdr *hp;
+       struct icmphdr _hdr;
 
        hp = skb_header_pointer(skb, dataoff, sizeof(_hdr), &_hdr);
        if (hp == NULL)
-               return 0;
+               return false;
 
        tuple->dst.u.icmp.type = hp->type;
        tuple->src.u.icmp.id = hp->un.echo.id;
        tuple->dst.u.icmp.code = hp->code;
 
-       return 1;
+       return true;
 }
 
 /* Add 1; spaces filled with 0. */
@@ -51,17 +51,17 @@ static const u_int8_t invmap[] = {
        [ICMP_ADDRESSREPLY] = ICMP_ADDRESS + 1
 };
 
-static int icmp_invert_tuple(struct nf_conntrack_tuple *tuple,
-                            const struct nf_conntrack_tuple *orig)
+static bool icmp_invert_tuple(struct nf_conntrack_tuple *tuple,
+                             const struct nf_conntrack_tuple *orig)
 {
        if (orig->dst.u.icmp.type >= sizeof(invmap)
            || !invmap[orig->dst.u.icmp.type])
-               return 0;
+               return false;
 
        tuple->src.u.icmp.id = orig->src.u.icmp.id;
        tuple->dst.u.icmp.type = invmap[orig->dst.u.icmp.type] - 1;
        tuple->dst.u.icmp.code = orig->dst.u.icmp.code;
-       return 1;
+       return true;
 }
 
 /* Print out the per-protocol part of the tuple. */
@@ -87,9 +87,8 @@ static int icmp_packet(struct nf_conn *ct,
           means this will only run once even if count hits zero twice
           (theoretically possible with SMP) */
        if (CTINFO2DIR(ctinfo) == IP_CT_DIR_REPLY) {
-               if (atomic_dec_and_test(&ct->proto.icmp.count)
-                   && del_timer(&ct->timeout))
-                       ct->timeout.function((unsigned long)ct);
+               if (atomic_dec_and_test(&ct->proto.icmp.count))
+                       nf_ct_kill_acct(ct, ctinfo, skb);
        } else {
                atomic_inc(&ct->proto.icmp.count);
                nf_conntrack_event_cache(IPCT_PROTOINFO_VOLATILE, skb);
@@ -100,8 +99,8 @@ static int icmp_packet(struct nf_conn *ct,
 }
 
 /* Called when a new connection for this protocol found. */
-static int icmp_new(struct nf_conn *conntrack,
-                   const struct sk_buff *skb, unsigned int dataoff)
+static bool icmp_new(struct nf_conn *ct, const struct sk_buff *skb,
+                    unsigned int dataoff)
 {
        static const u_int8_t valid_new[] = {
                [ICMP_ECHO] = 1,
@@ -110,16 +109,16 @@ static int icmp_new(struct nf_conn *conntrack,
                [ICMP_ADDRESS] = 1
        };
 
-       if (conntrack->tuplehash[0].tuple.dst.u.icmp.type >= sizeof(valid_new)
-           || !valid_new[conntrack->tuplehash[0].tuple.dst.u.icmp.type]) {
+       if (ct->tuplehash[0].tuple.dst.u.icmp.type >= sizeof(valid_new)
+           || !valid_new[ct->tuplehash[0].tuple.dst.u.icmp.type]) {
                /* Can't create a new ICMP `conn' with this. */
                pr_debug("icmp: can't create new conn with type %u\n",
-                        conntrack->tuplehash[0].tuple.dst.u.icmp.type);
-               NF_CT_DUMP_TUPLE(&conntrack->tuplehash[0].tuple);
-               return 0;
+                        ct->tuplehash[0].tuple.dst.u.icmp.type);
+               nf_ct_dump_tuple_ip(&ct->tuplehash[0].tuple);
+               return false;
        }
-       atomic_set(&conntrack->proto.icmp.count, 0);
-       return 1;
+       atomic_set(&ct->proto.icmp.count, 0);
+       return true;
 }
 
 /* Returns conntrack if it dealt with ICMP, and filled in skb fields */
@@ -129,8 +128,8 @@ icmp_error_message(struct sk_buff *skb,
                 unsigned int hooknum)
 {
        struct nf_conntrack_tuple innertuple, origtuple;
-       struct nf_conntrack_l4proto *innerproto;
-       struct nf_conntrack_tuple_hash *h;
+       const struct nf_conntrack_l4proto *innerproto;
+       const struct nf_conntrack_tuple_hash *h;
 
        NF_CT_ASSERT(skb->nfct == NULL);
 
@@ -176,7 +175,8 @@ static int
 icmp_error(struct sk_buff *skb, unsigned int dataoff,
           enum ip_conntrack_info *ctinfo, int pf, unsigned int hooknum)
 {
-       struct icmphdr _ih, *icmph;
+       const struct icmphdr *icmph;
+       struct icmphdr _ih;
 
        /* Not enough header? */
        icmph = skb_header_pointer(skb, ip_hdrlen(skb), sizeof(_ih), &_ih);