Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
[safe/jmp/linux-2.6] / net / netfilter / nf_conntrack_ftp.c
index 7eff876..5509dd1 100644 (file)
@@ -29,6 +29,7 @@ MODULE_LICENSE("GPL");
 MODULE_AUTHOR("Rusty Russell <rusty@rustcorp.com.au>");
 MODULE_DESCRIPTION("ftp connection tracking helper");
 MODULE_ALIAS("ip_conntrack_ftp");
+MODULE_ALIAS_NFCT_HELPER("ftp");
 
 /* This is slow, but it's simple. --RR */
 static char *ftp_buffer;
@@ -318,7 +319,8 @@ static int find_nl_seq(u32 seq, const struct nf_ct_ftp_master *info, int dir)
 }
 
 /* We don't update if it's older than what we have. */
-static void update_nl_seq(u32 nl_seq, struct nf_ct_ftp_master *info, int dir,
+static void update_nl_seq(struct nf_conn *ct, u32 nl_seq,
+                         struct nf_ct_ftp_master *info, int dir,
                          struct sk_buff *skb)
 {
        unsigned int i, oldest = NUM_SEQ_TO_REMEMBER;
@@ -336,11 +338,9 @@ static void update_nl_seq(u32 nl_seq, struct nf_ct_ftp_master *info, int dir,
 
        if (info->seq_aft_nl_num[dir] < NUM_SEQ_TO_REMEMBER) {
                info->seq_aft_nl[dir][info->seq_aft_nl_num[dir]++] = nl_seq;
-               nf_conntrack_event_cache(IPCT_HELPINFO_VOLATILE, skb);
        } else if (oldest != NUM_SEQ_TO_REMEMBER &&
                   after(nl_seq, info->seq_aft_nl[dir][oldest])) {
                info->seq_aft_nl[dir][oldest] = nl_seq;
-               nf_conntrack_event_cache(IPCT_HELPINFO_VOLATILE, skb);
        }
 }
 
@@ -350,12 +350,13 @@ static int help(struct sk_buff *skb,
                enum ip_conntrack_info ctinfo)
 {
        unsigned int dataoff, datalen;
-       struct tcphdr _tcph, *th;
-       char *fb_ptr;
+       const struct tcphdr *th;
+       struct tcphdr _tcph;
+       const char *fb_ptr;
        int ret;
        u32 seq;
        int dir = CTINFO2DIR(ctinfo);
-       unsigned int matchlen, matchoff;
+       unsigned int uninitialized_var(matchlen), uninitialized_var(matchoff);
        struct nf_ct_ftp_master *ct_ftp_info = &nfct_help(ct)->help.ct_ftp_info;
        struct nf_conntrack_expect *exp;
        union nf_inet_addr *daddr;
@@ -405,7 +406,7 @@ static int help(struct sk_buff *skb,
 
        /* Initialize IP/IPv6 addr to expected address (it's not mentioned
           in EPSV responses) */
-       cmd.l3num = ct->tuplehash[dir].tuple.src.l3num;
+       cmd.l3num = nf_ct_l3num(ct);
        memcpy(cmd.u3.all, &ct->tuplehash[dir].tuple.src.u3.all,
               sizeof(cmd.u3.all));
 
@@ -425,10 +426,8 @@ static int help(struct sk_buff *skb,
                   connection tracking, not packet filtering.
                   However, it is necessary for accurate tracking in
                   this case. */
-               if (net_ratelimit())
-                       printk("conntrack_ftp: partial %s %u+%u\n",
-                              search[dir][i].pattern,
-                              ntohl(th->seq), datalen);
+               pr_debug("conntrack_ftp: partial %s %u+%u\n",
+                        search[dir][i].pattern,  ntohl(th->seq), datalen);
                ret = NF_DROP;
                goto out;
        } else if (found == 0) { /* No match */
@@ -452,7 +451,7 @@ static int help(struct sk_buff *skb,
        daddr = &ct->tuplehash[!dir].tuple.dst.u3;
 
        /* Update the ftp info */
-       if ((cmd.l3num == ct->tuplehash[dir].tuple.src.l3num) &&
+       if ((cmd.l3num == nf_ct_l3num(ct)) &&
            memcmp(&cmd.u3.all, &ct->tuplehash[dir].tuple.src.u3.all,
                     sizeof(cmd.u3.all))) {
                /* Enrico Scholz's passive FTP to partially RNAT'd ftp
@@ -460,16 +459,13 @@ static int help(struct sk_buff *skb,
                   different IP address.  Simply don't record it for
                   NAT. */
                if (cmd.l3num == PF_INET) {
-                       pr_debug("conntrack_ftp: NOT RECORDING: " NIPQUAD_FMT
-                                " != " NIPQUAD_FMT "\n",
-                                NIPQUAD(cmd.u3.ip),
-                                NIPQUAD(ct->tuplehash[dir].tuple.src.u3.ip));
+                       pr_debug("conntrack_ftp: NOT RECORDING: %pI4 != %pI4\n",
+                                &cmd.u3.ip,
+                                &ct->tuplehash[dir].tuple.src.u3.ip);
                } else {
-                       pr_debug("conntrack_ftp: NOT RECORDING: " NIP6_FMT
-                                " != " NIP6_FMT "\n",
-                                NIP6(*((struct in6_addr *)cmd.u3.ip6)),
-                                NIP6(*((struct in6_addr *)
-                                       ct->tuplehash[dir].tuple.src.u3.ip6)));
+                       pr_debug("conntrack_ftp: NOT RECORDING: %pI6 != %pI6\n",
+                                cmd.u3.ip6,
+                                ct->tuplehash[dir].tuple.src.u3.ip6);
                }
 
                /* Thanks to Cristiano Lincoln Mattos
@@ -508,7 +504,7 @@ out_update_nl:
        /* Now if this ends in \n, update ftp info.  Seq may have been
         * adjusted by NAT code. */
        if (ends_in_nl)
-               update_nl_seq(seq, ct_ftp_info, dir, skb);
+               update_nl_seq(ct, seq, ct_ftp_info, dir, skb);
  out:
        spin_unlock_bh(&nf_ftp_lock);
        return ret;