struct nf_conntrack_helper;
 
+/* Must be kept in sync with the classes defined by helpers */
+#define NF_CT_MAX_EXPECT_CLASSES       1
+
 /* nf_conn feature for connections that have a helper */
 struct nf_conn_help {
        /* Helper. if any */
        struct hlist_head expectations;
 
        /* Current number of expected connections */
-       unsigned int expecting;
+       u8 expecting[NF_CT_MAX_EXPECT_CLASSES];
 };
 
 
 
        /* Flags */
        unsigned int flags;
 
+       /* Expectation class */
+       unsigned int class;
+
 #ifdef CONFIG_NF_NAT_NEEDED
        __be32 saved_ip;
        /* This is the original per-proto part, used to map the
        struct rcu_head rcu;
 };
 
+struct nf_conntrack_expect_policy
+{
+       unsigned int    max_expected;
+       unsigned int    timeout;
+};
+
+#define NF_CT_EXPECT_CLASS_DEFAULT     0
+
 #define NF_CT_EXPECT_PERMANENT 0x1
 #define NF_CT_EXPECT_INACTIVE  0x2
 
 /* Allocate space for an expectation: this is mandatory before calling
    nf_ct_expect_related.  You will have to call put afterwards. */
 struct nf_conntrack_expect *nf_ct_expect_alloc(struct nf_conn *me);
-void nf_ct_expect_init(struct nf_conntrack_expect *, int,
+void nf_ct_expect_init(struct nf_conntrack_expect *, unsigned int, int,
                       const union nf_inet_addr *,
                       const union nf_inet_addr *,
                       u_int8_t, const __be16 *, const __be16 *);
 
 
        const char *name;               /* name of the module */
        struct module *me;              /* pointer to self */
-       unsigned int max_expected;      /* Maximum number of concurrent 
-                                        * expected connections */
-       unsigned int timeout;           /* timeout for expecteds */
+       const struct nf_conntrack_expect_policy *expect_policy;
 
        /* Tuple of things we will help (compared against server response) */
        struct nf_conntrack_tuple tuple;
        void (*destroy)(struct nf_conn *ct);
 
        int (*to_nlattr)(struct sk_buff *skb, const struct nf_conn *ct);
+       unsigned int expect_class_max;
 };
 
 extern struct nf_conntrack_helper *
 
 #include <net/udp.h>
 
 #include <net/netfilter/nf_nat.h>
+#include <net/netfilter/nf_conntrack_expect.h>
 #include <net/netfilter/nf_conntrack_helper.h>
 #include <net/netfilter/nf_nat_helper.h>
 
        return ret;
 }
 
+static const struct nf_conntrack_expect_policy snmp_exp_policy = {
+       .max_expected   = 0,
+       .timeout        = 180,
+};
+
 static struct nf_conntrack_helper snmp_helper __read_mostly = {
-       .max_expected           = 0,
-       .timeout                = 180,
        .me                     = THIS_MODULE,
        .help                   = help,
+       .expect_policy          = &snmp_exp_policy,
        .name                   = "snmp",
        .tuple.src.l3num        = AF_INET,
        .tuple.src.u.udp.port   = __constant_htons(SNMP_PORT),
 };
 
 static struct nf_conntrack_helper snmp_trap_helper __read_mostly = {
-       .max_expected           = 0,
-       .timeout                = 180,
        .me                     = THIS_MODULE,
        .help                   = help,
+       .expect_policy          = &snmp_exp_policy,
        .name                   = "snmp_trap",
        .tuple.src.l3num        = AF_INET,
        .tuple.src.u.udp.port   = __constant_htons(SNMP_TRAP_PORT),
 
                        goto out;
                }
                tuple = &ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple;
-               nf_ct_expect_init(exp, family, &tuple->src.u3, &tuple->dst.u3,
+               nf_ct_expect_init(exp, NF_CT_EXPECT_CLASS_DEFAULT, family,
+                                 &tuple->src.u3, &tuple->dst.u3,
                                  IPPROTO_TCP, NULL, &port);
 
                nf_nat_amanda = rcu_dereference(nf_nat_amanda_hook);
        return ret;
 }
 
+static const struct nf_conntrack_expect_policy amanda_exp_policy = {
+       .max_expected           = 3,
+       .timeout                = 180,
+};
+
 static struct nf_conntrack_helper amanda_helper[2] __read_mostly = {
        {
                .name                   = "amanda",
-               .max_expected           = 3,
-               .timeout                = 180,
                .me                     = THIS_MODULE,
                .help                   = amanda_help,
                .tuple.src.l3num        = AF_INET,
                .tuple.src.u.udp.port   = __constant_htons(10080),
                .tuple.dst.protonum     = IPPROTO_UDP,
+               .expect_policy          = &amanda_exp_policy,
        },
        {
                .name                   = "amanda",
-               .max_expected           = 3,
-               .timeout                = 180,
                .me                     = THIS_MODULE,
                .help                   = amanda_help,
                .tuple.src.l3num        = AF_INET6,
                .tuple.src.u.udp.port   = __constant_htons(10080),
                .tuple.dst.protonum     = IPPROTO_UDP,
+               .expect_policy          = &amanda_exp_policy,
        },
 };
 
 
        nf_ct_expect_count--;
 
        hlist_del(&exp->lnode);
-       master_help->expecting--;
+       master_help->expecting[exp->class]--;
        nf_ct_expect_put(exp);
 
        NF_CT_STAT_INC(expect_delete);
        struct hlist_node *n, *next;
 
        /* Optimization: most connection never expect any others. */
-       if (!help || help->expecting == 0)
+       if (!help)
                return;
 
        hlist_for_each_entry_safe(exp, n, next, &help->expectations, lnode) {
 static inline int expect_matches(const struct nf_conntrack_expect *a,
                                 const struct nf_conntrack_expect *b)
 {
-       return a->master == b->master
+       return a->master == b->master && a->class == b->class
                && nf_ct_tuple_equal(&a->tuple, &b->tuple)
                && nf_ct_tuple_mask_equal(&a->mask, &b->mask);
 }
 }
 EXPORT_SYMBOL_GPL(nf_ct_expect_alloc);
 
-void nf_ct_expect_init(struct nf_conntrack_expect *exp, int family,
+void nf_ct_expect_init(struct nf_conntrack_expect *exp, unsigned int class,
+                      int family,
                       const union nf_inet_addr *saddr,
                       const union nf_inet_addr *daddr,
                       u_int8_t proto, const __be16 *src, const __be16 *dst)
                len = 16;
 
        exp->flags = 0;
+       exp->class = class;
        exp->expectfn = NULL;
        exp->helper = NULL;
        exp->tuple.src.l3num = family;
 static void nf_ct_expect_insert(struct nf_conntrack_expect *exp)
 {
        struct nf_conn_help *master_help = nfct_help(exp->master);
+       const struct nf_conntrack_expect_policy *p;
        unsigned int h = nf_ct_expect_dst_hash(&exp->tuple);
 
        atomic_inc(&exp->use);
 
        hlist_add_head(&exp->lnode, &master_help->expectations);
-       master_help->expecting++;
+       master_help->expecting[exp->class]++;
 
        hlist_add_head_rcu(&exp->hnode, &nf_ct_expect_hash[h]);
        nf_ct_expect_count++;
 
        setup_timer(&exp->timeout, nf_ct_expectation_timed_out,
                    (unsigned long)exp);
-       exp->timeout.expires = jiffies + master_help->helper->timeout * HZ;
+       p = &master_help->helper->expect_policy[exp->class];
+       exp->timeout.expires = jiffies + p->timeout * HZ;
        add_timer(&exp->timeout);
 
        atomic_inc(&exp->use);
 }
 
 /* Race with expectations being used means we could have none to find; OK. */
-static void evict_oldest_expect(struct nf_conn *master)
+static void evict_oldest_expect(struct nf_conn *master,
+                               struct nf_conntrack_expect *new)
 {
        struct nf_conn_help *master_help = nfct_help(master);
-       struct nf_conntrack_expect *exp = NULL;
+       struct nf_conntrack_expect *exp, *last = NULL;
        struct hlist_node *n;
 
-       hlist_for_each_entry(exp, n, &master_help->expectations, lnode)
-               ; /* nothing */
+       hlist_for_each_entry(exp, n, &master_help->expectations, lnode) {
+               if (exp->class == new->class)
+                       last = exp;
+       }
 
-       if (exp && del_timer(&exp->timeout)) {
-               nf_ct_unlink_expect(exp);
-               nf_ct_expect_put(exp);
+       if (last && del_timer(&last->timeout)) {
+               nf_ct_unlink_expect(last);
+               nf_ct_expect_put(last);
        }
 }
 
 static inline int refresh_timer(struct nf_conntrack_expect *i)
 {
        struct nf_conn_help *master_help = nfct_help(i->master);
+       const struct nf_conntrack_expect_policy *p;
 
        if (!del_timer(&i->timeout))
                return 0;
 
-       i->timeout.expires = jiffies + master_help->helper->timeout*HZ;
+       p = &master_help->helper->expect_policy[i->class];
+       i->timeout.expires = jiffies + p->timeout * HZ;
        add_timer(&i->timeout);
        return 1;
 }
 
 int nf_ct_expect_related(struct nf_conntrack_expect *expect)
 {
+       const struct nf_conntrack_expect_policy *p;
        struct nf_conntrack_expect *i;
        struct nf_conn *master = expect->master;
        struct nf_conn_help *master_help = nfct_help(master);
                }
        }
        /* Will be over limit? */
-       if (master_help->helper->max_expected &&
-           master_help->expecting >= master_help->helper->max_expected)
-               evict_oldest_expect(master);
+       p = &master_help->helper->expect_policy[expect->class];
+       if (p->max_expected &&
+           master_help->expecting[expect->class] >= p->max_expected) {
+               evict_oldest_expect(master, expect);
+               if (master_help->expecting[expect->class] >= p->max_expected) {
+                       ret = -EMFILE;
+                       goto out;
+               }
+       }
 
        if (nf_ct_expect_count >= nf_ct_expect_max) {
                if (net_ratelimit())
 
                daddr = &cmd.u3;
        }
 
-       nf_ct_expect_init(exp, cmd.l3num,
+       nf_ct_expect_init(exp, NF_CT_EXPECT_CLASS_DEFAULT, cmd.l3num,
                          &ct->tuplehash[!dir].tuple.src.u3, daddr,
                          IPPROTO_TCP, NULL, &cmd.u.tcp.port);
 
 static struct nf_conntrack_helper ftp[MAX_PORTS][2] __read_mostly;
 static char ftp_names[MAX_PORTS][2][sizeof("ftp-65535")] __read_mostly;
 
+static const struct nf_conntrack_expect_policy ftp_exp_policy = {
+       .max_expected   = 1,
+       .timeout        = 5 * 60,
+};
+
 /* don't make this __exit, since it's called from __init ! */
 static void nf_conntrack_ftp_fini(void)
 {
                for (j = 0; j < 2; j++) {
                        ftp[i][j].tuple.src.u.tcp.port = htons(ports[i]);
                        ftp[i][j].tuple.dst.protonum = IPPROTO_TCP;
-                       ftp[i][j].max_expected = 1;
-                       ftp[i][j].timeout = 5 * 60;     /* 5 Minutes */
+                       ftp[i][j].expect_policy = &ftp_exp_policy;
                        ftp[i][j].me = THIS_MODULE;
                        ftp[i][j].help = help;
                        tmpname = &ftp_names[i][j][0];
 
        /* Create expect for RTP */
        if ((rtp_exp = nf_ct_expect_alloc(ct)) == NULL)
                return -1;
-       nf_ct_expect_init(rtp_exp, ct->tuplehash[!dir].tuple.src.l3num,
+       nf_ct_expect_init(rtp_exp, NF_CT_EXPECT_CLASS_DEFAULT,
+                         ct->tuplehash[!dir].tuple.src.l3num,
                          &ct->tuplehash[!dir].tuple.src.u3,
                          &ct->tuplehash[!dir].tuple.dst.u3,
                          IPPROTO_UDP, NULL, &rtp_port);
                nf_ct_expect_put(rtp_exp);
                return -1;
        }
-       nf_ct_expect_init(rtcp_exp, ct->tuplehash[!dir].tuple.src.l3num,
+       nf_ct_expect_init(rtcp_exp, NF_CT_EXPECT_CLASS_DEFAULT,
+                         ct->tuplehash[!dir].tuple.src.l3num,
                          &ct->tuplehash[!dir].tuple.src.u3,
                          &ct->tuplehash[!dir].tuple.dst.u3,
                          IPPROTO_UDP, NULL, &rtcp_port);
        /* Create expect for T.120 connections */
        if ((exp = nf_ct_expect_alloc(ct)) == NULL)
                return -1;
-       nf_ct_expect_init(exp, ct->tuplehash[!dir].tuple.src.l3num,
+       nf_ct_expect_init(exp, NF_CT_EXPECT_CLASS_DEFAULT,
+                         ct->tuplehash[!dir].tuple.src.l3num,
                          &ct->tuplehash[!dir].tuple.src.u3,
                          &ct->tuplehash[!dir].tuple.dst.u3,
                          IPPROTO_TCP, NULL, &port);
 }
 
 /****************************************************************************/
+static const struct nf_conntrack_expect_policy h245_exp_policy = {
+       .max_expected   = H323_RTP_CHANNEL_MAX * 4 + 2 /* T.120 */,
+       .timeout        = 240,
+};
+
 static struct nf_conntrack_helper nf_conntrack_helper_h245 __read_mostly = {
        .name                   = "H.245",
        .me                     = THIS_MODULE,
-       .max_expected           = H323_RTP_CHANNEL_MAX * 4 + 2 /* T.120 */,
-       .timeout                = 240,
        .tuple.dst.protonum     = IPPROTO_UDP,
-       .help                   = h245_help
+       .help                   = h245_help,
+       .expect_policy          = &h245_exp_policy,
 };
 
 /****************************************************************************/
        /* Create expect for h245 connection */
        if ((exp = nf_ct_expect_alloc(ct)) == NULL)
                return -1;
-       nf_ct_expect_init(exp, ct->tuplehash[!dir].tuple.src.l3num,
+       nf_ct_expect_init(exp, NF_CT_EXPECT_CLASS_DEFAULT,
+                         ct->tuplehash[!dir].tuple.src.l3num,
                          &ct->tuplehash[!dir].tuple.src.u3,
                          &ct->tuplehash[!dir].tuple.dst.u3,
                          IPPROTO_TCP, NULL, &port);
        /* Create expect for the second call leg */
        if ((exp = nf_ct_expect_alloc(ct)) == NULL)
                return -1;
-       nf_ct_expect_init(exp, ct->tuplehash[!dir].tuple.src.l3num,
+       nf_ct_expect_init(exp, NF_CT_EXPECT_CLASS_DEFAULT,
+                         ct->tuplehash[!dir].tuple.src.l3num,
                          &ct->tuplehash[!dir].tuple.src.u3, &addr,
                          IPPROTO_TCP, NULL, &port);
        exp->helper = nf_conntrack_helper_q931;
 }
 
 /****************************************************************************/
+static const struct nf_conntrack_expect_policy q931_exp_policy = {
+       /* T.120 and H.245 */
+       .max_expected           = H323_RTP_CHANNEL_MAX * 4 + 4,
+       .timeout                = 240,
+};
+
 static struct nf_conntrack_helper nf_conntrack_helper_q931[] __read_mostly = {
        {
                .name                   = "Q.931",
                .me                     = THIS_MODULE,
-                                         /* T.120 and H.245 */
-               .max_expected           = H323_RTP_CHANNEL_MAX * 4 + 4,
-               .timeout                = 240,
                .tuple.src.l3num        = AF_INET,
                .tuple.src.u.tcp.port   = __constant_htons(Q931_PORT),
                .tuple.dst.protonum     = IPPROTO_TCP,
-               .help                   = q931_help
+               .help                   = q931_help,
+               .expect_policy          = &q931_exp_policy,
        },
        {
                .name                   = "Q.931",
                .me                     = THIS_MODULE,
-                                         /* T.120 and H.245 */
-               .max_expected           = H323_RTP_CHANNEL_MAX * 4 + 4,
-               .timeout                = 240,
                .tuple.src.l3num        = AF_INET6,
                .tuple.src.u.tcp.port   = __constant_htons(Q931_PORT),
                .tuple.dst.protonum     = IPPROTO_TCP,
-               .help                   = q931_help
+               .help                   = q931_help,
+               .expect_policy          = &q931_exp_policy,
        },
 };
 
        /* Create expect for Q.931 */
        if ((exp = nf_ct_expect_alloc(ct)) == NULL)
                return -1;
-       nf_ct_expect_init(exp, ct->tuplehash[!dir].tuple.src.l3num,
+       nf_ct_expect_init(exp, NF_CT_EXPECT_CLASS_DEFAULT,
+                         ct->tuplehash[!dir].tuple.src.l3num,
                          gkrouted_only ? /* only accept calls from GK? */
                                &ct->tuplehash[!dir].tuple.src.u3 : NULL,
                          &ct->tuplehash[!dir].tuple.dst.u3,
        /* Need new expect */
        if ((exp = nf_ct_expect_alloc(ct)) == NULL)
                return -1;
-       nf_ct_expect_init(exp, ct->tuplehash[!dir].tuple.src.l3num,
+       nf_ct_expect_init(exp, NF_CT_EXPECT_CLASS_DEFAULT,
+                         ct->tuplehash[!dir].tuple.src.l3num,
                          &ct->tuplehash[!dir].tuple.src.u3, &addr,
                          IPPROTO_UDP, NULL, &port);
        exp->helper = nf_conntrack_helper_ras;
        /* Need new expect */
        if ((exp = nf_ct_expect_alloc(ct)) == NULL)
                return -1;
-       nf_ct_expect_init(exp, ct->tuplehash[!dir].tuple.src.l3num,
+       nf_ct_expect_init(exp, NF_CT_EXPECT_CLASS_DEFAULT,
+                         ct->tuplehash[!dir].tuple.src.l3num,
                          &ct->tuplehash[!dir].tuple.src.u3, &addr,
                          IPPROTO_TCP, NULL, &port);
        exp->flags = NF_CT_EXPECT_PERMANENT;
        /* Need new expect for call signal */
        if ((exp = nf_ct_expect_alloc(ct)) == NULL)
                return -1;
-       nf_ct_expect_init(exp, ct->tuplehash[!dir].tuple.src.l3num,
+       nf_ct_expect_init(exp, NF_CT_EXPECT_CLASS_DEFAULT,
+                         ct->tuplehash[!dir].tuple.src.l3num,
                          &ct->tuplehash[!dir].tuple.src.u3, &addr,
                          IPPROTO_TCP, NULL, &port);
        exp->flags = NF_CT_EXPECT_PERMANENT;
 }
 
 /****************************************************************************/
+static const struct nf_conntrack_expect_policy ras_exp_policy = {
+       .max_expected           = 32,
+       .timeout                = 240,
+};
+
 static struct nf_conntrack_helper nf_conntrack_helper_ras[] __read_mostly = {
        {
                .name                   = "RAS",
                .me                     = THIS_MODULE,
-               .max_expected           = 32,
-               .timeout                = 240,
                .tuple.src.l3num        = AF_INET,
                .tuple.src.u.udp.port   = __constant_htons(RAS_PORT),
                .tuple.dst.protonum     = IPPROTO_UDP,
                .help                   = ras_help,
+               .expect_policy          = &ras_exp_policy,
        },
        {
                .name                   = "RAS",
                .me                     = THIS_MODULE,
-               .max_expected           = 32,
-               .timeout                = 240,
                .tuple.src.l3num        = AF_INET6,
                .tuple.src.u.udp.port   = __constant_htons(RAS_PORT),
                .tuple.dst.protonum     = IPPROTO_UDP,
                .help                   = ras_help,
+               .expect_policy          = &ras_exp_policy,
        },
 };
 
 
 {
        unsigned int h = helper_hash(&me->tuple);
 
-       BUG_ON(me->timeout == 0);
+       BUG_ON(me->expect_policy == NULL);
+       BUG_ON(me->expect_class_max >= NF_CT_MAX_EXPECT_CLASSES);
 
        mutex_lock(&nf_ct_helper_mutex);
        hlist_add_head_rcu(&me->hnode, &nf_ct_helper_hash[h]);
 
                        }
                        tuple = &ct->tuplehash[!dir].tuple;
                        port = htons(dcc_port);
-                       nf_ct_expect_init(exp, tuple->src.l3num,
+                       nf_ct_expect_init(exp, NF_CT_EXPECT_CLASS_DEFAULT,
+                                         tuple->src.l3num,
                                          NULL, &tuple->dst.u3,
                                          IPPROTO_TCP, NULL, &port);
 
 
 static struct nf_conntrack_helper irc[MAX_PORTS] __read_mostly;
 static char irc_names[MAX_PORTS][sizeof("irc-65535")] __read_mostly;
+static struct nf_conntrack_expect_policy irc_exp_policy;
 
 static void nf_conntrack_irc_fini(void);
 
                return -EINVAL;
        }
 
+       irc_exp_policy.max_expected = max_dcc_channels;
+       irc_exp_policy.timeout = dcc_timeout;
+
        irc_buffer = kmalloc(65536, GFP_KERNEL);
        if (!irc_buffer)
                return -ENOMEM;
                irc[i].tuple.src.l3num = AF_INET;
                irc[i].tuple.src.u.tcp.port = htons(ports[i]);
                irc[i].tuple.dst.protonum = IPPROTO_TCP;
-               irc[i].max_expected = max_dcc_channels;
-               irc[i].timeout = dcc_timeout;
+               irc[i].expect_policy = &irc_exp_policy;
                irc[i].me = THIS_MODULE;
                irc[i].help = help;
 
 
 
        exp->expectfn             = NULL;
        exp->flags                = NF_CT_EXPECT_PERMANENT;
+       exp->class                = NF_CT_EXPECT_CLASS_DEFAULT;
        exp->helper               = NULL;
 
        nf_ct_expect_related(exp);
        return NF_ACCEPT;
 }
 
+static struct nf_conntrack_expect_policy exp_policy = {
+       .max_expected   = 1,
+};
+
 static struct nf_conntrack_helper helper __read_mostly = {
        .name                   = "netbios-ns",
        .tuple.src.l3num        = AF_INET,
        .tuple.src.u.udp.port   = __constant_htons(NMBD_PORT),
        .tuple.dst.protonum     = IPPROTO_UDP,
-       .max_expected           = 1,
        .me                     = THIS_MODULE,
        .help                   = help,
+       .expect_policy          = &exp_policy,
 };
 
 static int __init nf_conntrack_netbios_ns_init(void)
 {
-       helper.timeout = timeout;
+       exp_policy.timeout = timeout;
        return nf_conntrack_helper_register(&helper);
 }
 
 
 
        /* original direction, PNS->PAC */
        dir = IP_CT_DIR_ORIGINAL;
-       nf_ct_expect_init(exp_orig, ct->tuplehash[dir].tuple.src.l3num,
+       nf_ct_expect_init(exp_orig, NF_CT_EXPECT_CLASS_DEFAULT,
+                         ct->tuplehash[dir].tuple.src.l3num,
                          &ct->tuplehash[dir].tuple.src.u3,
                          &ct->tuplehash[dir].tuple.dst.u3,
                          IPPROTO_GRE, &peer_callid, &callid);
 
        /* reply direction, PAC->PNS */
        dir = IP_CT_DIR_REPLY;
-       nf_ct_expect_init(exp_reply, ct->tuplehash[dir].tuple.src.l3num,
+       nf_ct_expect_init(exp_reply, NF_CT_EXPECT_CLASS_DEFAULT,
+                         ct->tuplehash[dir].tuple.src.l3num,
                          &ct->tuplehash[dir].tuple.src.u3,
                          &ct->tuplehash[dir].tuple.dst.u3,
                          IPPROTO_GRE, &callid, &peer_callid);
        return ret;
 }
 
+static const struct nf_conntrack_expect_policy pptp_exp_policy = {
+       .max_expected   = 2,
+       .timeout        = 5 * 60,
+};
+
 /* control protocol helper */
 static struct nf_conntrack_helper pptp __read_mostly = {
        .name                   = "pptp",
        .me                     = THIS_MODULE,
-       .max_expected           = 2,
-       .timeout                = 5 * 60,
        .tuple.src.l3num        = AF_INET,
        .tuple.src.u.tcp.port   = __constant_htons(PPTP_CONTROL_PORT),
        .tuple.dst.protonum     = IPPROTO_TCP,
        .help                   = conntrack_pptp_help,
        .destroy                = pptp_destroy_siblings,
+       .expect_policy          = &pptp_exp_policy,
 };
 
 static int __init nf_conntrack_pptp_init(void)
 
        }
 
        tuple = &ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple;
-       nf_ct_expect_init(exp, family, &tuple->src.u3, &tuple->dst.u3,
+       nf_ct_expect_init(exp, NF_CT_EXPECT_CLASS_DEFAULT, family,
+                         &tuple->src.u3, &tuple->dst.u3,
                          IPPROTO_TCP, NULL, &reply->port);
 
        pr_debug("nf_ct_sane: expect: ");
 static struct nf_conntrack_helper sane[MAX_PORTS][2] __read_mostly;
 static char sane_names[MAX_PORTS][2][sizeof("sane-65535")] __read_mostly;
 
+static const struct nf_conntrack_expect_policy sane_exp_policy = {
+       .max_expected   = 1,
+       .timeout        = 5 * 60,
+};
+
 /* don't make this __exit, since it's called from __init ! */
 static void nf_conntrack_sane_fini(void)
 {
                for (j = 0; j < 2; j++) {
                        sane[i][j].tuple.src.u.tcp.port = htons(ports[i]);
                        sane[i][j].tuple.dst.protonum = IPPROTO_TCP;
-                       sane[i][j].max_expected = 1;
-                       sane[i][j].timeout = 5 * 60;    /* 5 Minutes */
+                       sane[i][j].expect_policy = &sane_exp_policy;
                        sane[i][j].me = THIS_MODULE;
                        sane[i][j].help = help;
                        tmpname = &sane_names[i][j][0];
 
        exp = nf_ct_expect_alloc(ct);
        if (exp == NULL)
                return NF_DROP;
-       nf_ct_expect_init(exp, family,
+       nf_ct_expect_init(exp, NF_CT_EXPECT_CLASS_DEFAULT, family,
                          &ct->tuplehash[!dir].tuple.src.u3, addr,
                          IPPROTO_UDP, NULL, &port);
 
 static struct nf_conntrack_helper sip[MAX_PORTS][2] __read_mostly;
 static char sip_names[MAX_PORTS][2][sizeof("sip-65535")] __read_mostly;
 
+static const struct nf_conntrack_expect_policy sip_exp_policy = {
+       .max_expected   = 2,
+       .timeout        = 3 * 60,
+};
+
 static void nf_conntrack_sip_fini(void)
 {
        int i, j;
                for (j = 0; j < 2; j++) {
                        sip[i][j].tuple.dst.protonum = IPPROTO_UDP;
                        sip[i][j].tuple.src.u.udp.port = htons(ports[i]);
-                       sip[i][j].max_expected = 2;
-                       sip[i][j].timeout = 3 * 60; /* 3 minutes */
+                       sip[i][j].expect_policy = &sip_exp_policy;
                        sip[i][j].me = THIS_MODULE;
                        sip[i][j].help = sip_help;
 
 
                if (exp == NULL)
                        return NF_DROP;
                tuple = &ct->tuplehash[IP_CT_DIR_REPLY].tuple;
-               nf_ct_expect_init(exp, family, &tuple->src.u3, &tuple->dst.u3,
+               nf_ct_expect_init(exp, NF_CT_EXPECT_CLASS_DEFAULT, family,
+                                 &tuple->src.u3, &tuple->dst.u3,
                                  IPPROTO_UDP, NULL, &tuple->dst.u.udp.port);
 
                pr_debug("expect: ");
 static struct nf_conntrack_helper tftp[MAX_PORTS][2] __read_mostly;
 static char tftp_names[MAX_PORTS][2][sizeof("tftp-65535")] __read_mostly;
 
+static const struct nf_conntrack_expect_policy tftp_exp_policy = {
+       .max_expected   = 1,
+       .timeout        = 5 * 60,
+};
+
 static void nf_conntrack_tftp_fini(void)
 {
        int i, j;
                for (j = 0; j < 2; j++) {
                        tftp[i][j].tuple.dst.protonum = IPPROTO_UDP;
                        tftp[i][j].tuple.src.u.udp.port = htons(ports[i]);
-                       tftp[i][j].max_expected = 1;
-                       tftp[i][j].timeout = 5 * 60; /* 5 minutes */
+                       tftp[i][j].expect_policy = &tftp_exp_policy;
                        tftp[i][j].me = THIS_MODULE;
                        tftp[i][j].help = tftp_help;