]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - net/netfilter/nf_conntrack_h323_main.c
nf_conntrack_h323: fix module unload crash
[karo-tx-linux.git] / net / netfilter / nf_conntrack_h323_main.c
index a8a9dfbe7a67b6d6a0dce18293aaad11335de1ba..ea48f71845145286805de0fdb5255b30ee92678e 100644 (file)
@@ -47,27 +47,27 @@ MODULE_PARM_DESC(callforward_filter, "only create call forwarding expectations "
                                     "(determined by routing information)");
 
 /* Hooks for NAT */
-int (*set_h245_addr_hook) (struct sk_buff **pskb,
+int (*set_h245_addr_hook) (struct sk_buff *skb,
                           unsigned char **data, int dataoff,
                           H245_TransportAddress *taddr,
-                          union nf_conntrack_address *addr, __be16 port)
+                          union nf_inet_addr *addr, __be16 port)
                           __read_mostly;
-int (*set_h225_addr_hook) (struct sk_buff **pskb,
+int (*set_h225_addr_hook) (struct sk_buff *skb,
                           unsigned char **data, int dataoff,
                           TransportAddress *taddr,
-                          union nf_conntrack_address *addr, __be16 port)
+                          union nf_inet_addr *addr, __be16 port)
                           __read_mostly;
-int (*set_sig_addr_hook) (struct sk_buff **pskb,
+int (*set_sig_addr_hook) (struct sk_buff *skb,
                          struct nf_conn *ct,
                          enum ip_conntrack_info ctinfo,
                          unsigned char **data,
                          TransportAddress *taddr, int count) __read_mostly;
-int (*set_ras_addr_hook) (struct sk_buff **pskb,
+int (*set_ras_addr_hook) (struct sk_buff *skb,
                          struct nf_conn *ct,
                          enum ip_conntrack_info ctinfo,
                          unsigned char **data,
                          TransportAddress *taddr, int count) __read_mostly;
-int (*nat_rtp_rtcp_hook) (struct sk_buff **pskb,
+int (*nat_rtp_rtcp_hook) (struct sk_buff *skb,
                          struct nf_conn *ct,
                          enum ip_conntrack_info ctinfo,
                          unsigned char **data, int dataoff,
@@ -75,25 +75,25 @@ int (*nat_rtp_rtcp_hook) (struct sk_buff **pskb,
                          __be16 port, __be16 rtp_port,
                          struct nf_conntrack_expect *rtp_exp,
                          struct nf_conntrack_expect *rtcp_exp) __read_mostly;
-int (*nat_t120_hook) (struct sk_buff **pskb,
+int (*nat_t120_hook) (struct sk_buff *skb,
                      struct nf_conn *ct,
                      enum ip_conntrack_info ctinfo,
                      unsigned char **data, int dataoff,
                      H245_TransportAddress *taddr, __be16 port,
                      struct nf_conntrack_expect *exp) __read_mostly;
-int (*nat_h245_hook) (struct sk_buff **pskb,
+int (*nat_h245_hook) (struct sk_buff *skb,
                      struct nf_conn *ct,
                      enum ip_conntrack_info ctinfo,
                      unsigned char **data, int dataoff,
                      TransportAddress *taddr, __be16 port,
                      struct nf_conntrack_expect *exp) __read_mostly;
-int (*nat_callforwarding_hook) (struct sk_buff **pskb,
+int (*nat_callforwarding_hook) (struct sk_buff *skb,
                                struct nf_conn *ct,
                                enum ip_conntrack_info ctinfo,
                                unsigned char **data, int dataoff,
                                TransportAddress *taddr, __be16 port,
                                struct nf_conntrack_expect *exp) __read_mostly;
-int (*nat_q931_hook) (struct sk_buff **pskb,
+int (*nat_q931_hook) (struct sk_buff *skb,
                      struct nf_conn *ct,
                      enum ip_conntrack_info ctinfo,
                      unsigned char **data, TransportAddress *taddr, int idx,
@@ -108,13 +108,14 @@ static struct nf_conntrack_helper nf_conntrack_helper_q931[];
 static struct nf_conntrack_helper nf_conntrack_helper_ras[];
 
 /****************************************************************************/
-static int get_tpkt_data(struct sk_buff **pskb, unsigned int protoff,
+static int get_tpkt_data(struct sk_buff *skb, unsigned int protoff,
                         struct nf_conn *ct, enum ip_conntrack_info ctinfo,
                         unsigned char **data, int *datalen, int *dataoff)
 {
        struct nf_ct_h323_master *info = &nfct_help(ct)->help.ct_h323_info;
        int dir = CTINFO2DIR(ctinfo);
-       struct tcphdr _tcph, *th;
+       const struct tcphdr *th;
+       struct tcphdr _tcph;
        int tcpdatalen;
        int tcpdataoff;
        unsigned char *tpkt;
@@ -122,7 +123,7 @@ static int get_tpkt_data(struct sk_buff **pskb, unsigned int protoff,
        int tpktoff;
 
        /* Get TCP header */
-       th = skb_header_pointer(*pskb, protoff, sizeof(_tcph), &_tcph);
+       th = skb_header_pointer(skb, protoff, sizeof(_tcph), &_tcph);
        if (th == NULL)
                return 0;
 
@@ -130,13 +131,13 @@ static int get_tpkt_data(struct sk_buff **pskb, unsigned int protoff,
        tcpdataoff = protoff + th->doff * 4;
 
        /* Get TCP data length */
-       tcpdatalen = (*pskb)->len - tcpdataoff;
+       tcpdatalen = skb->len - tcpdataoff;
        if (tcpdatalen <= 0)    /* No TCP data */
                goto clear_out;
 
        if (*data == NULL) {    /* first TPKT */
                /* Get first TPKT pointer */
-               tpkt = skb_header_pointer(*pskb, tcpdataoff, tcpdatalen,
+               tpkt = skb_header_pointer(skb, tcpdataoff, tcpdatalen,
                                          h323_buffer);
                BUG_ON(tpkt == NULL);
 
@@ -212,11 +213,11 @@ static int get_tpkt_data(struct sk_buff **pskb, unsigned int protoff,
 }
 
 /****************************************************************************/
-static int get_h245_addr(struct nf_conn *ct, unsigned char *data,
+static int get_h245_addr(struct nf_conn *ct, const unsigned char *data,
                         H245_TransportAddress *taddr,
-                        union nf_conntrack_address *addr, __be16 *port)
+                        union nf_inet_addr *addr, __be16 *port)
 {
-       unsigned char *p;
+       const unsigned char *p;
        int family = ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.l3num;
        int len;
 
@@ -248,7 +249,7 @@ static int get_h245_addr(struct nf_conn *ct, unsigned char *data,
 }
 
 /****************************************************************************/
-static int expect_rtp_rtcp(struct sk_buff **pskb, struct nf_conn *ct,
+static int expect_rtp_rtcp(struct sk_buff *skb, struct nf_conn *ct,
                           enum ip_conntrack_info ctinfo,
                           unsigned char **data, int dataoff,
                           H245_TransportAddress *taddr)
@@ -257,7 +258,7 @@ static int expect_rtp_rtcp(struct sk_buff **pskb, struct nf_conn *ct,
        int ret = 0;
        __be16 port;
        __be16 rtp_port, rtcp_port;
-       union nf_conntrack_address addr;
+       union nf_inet_addr addr;
        struct nf_conntrack_expect *rtp_exp;
        struct nf_conntrack_expect *rtcp_exp;
        typeof(nat_rtp_rtcp_hook) nat_rtp_rtcp;
@@ -297,7 +298,7 @@ static int expect_rtp_rtcp(struct sk_buff **pskb, struct nf_conn *ct,
                   (nat_rtp_rtcp = rcu_dereference(nat_rtp_rtcp_hook)) &&
                   ct->status & IPS_NAT_MASK) {
                /* NAT needed */
-               ret = nat_rtp_rtcp(pskb, ct, ctinfo, data, dataoff,
+               ret = nat_rtp_rtcp(skb, ct, ctinfo, data, dataoff,
                                   taddr, port, rtp_port, rtp_exp, rtcp_exp);
        } else {                /* Conntrack only */
                if (nf_ct_expect_related(rtp_exp) == 0) {
@@ -321,7 +322,7 @@ static int expect_rtp_rtcp(struct sk_buff **pskb, struct nf_conn *ct,
 }
 
 /****************************************************************************/
-static int expect_t120(struct sk_buff **pskb,
+static int expect_t120(struct sk_buff *skb,
                       struct nf_conn *ct,
                       enum ip_conntrack_info ctinfo,
                       unsigned char **data, int dataoff,
@@ -330,7 +331,7 @@ static int expect_t120(struct sk_buff **pskb,
        int dir = CTINFO2DIR(ctinfo);
        int ret = 0;
        __be16 port;
-       union nf_conntrack_address addr;
+       union nf_inet_addr addr;
        struct nf_conntrack_expect *exp;
        typeof(nat_t120_hook) nat_t120;
 
@@ -355,7 +356,7 @@ static int expect_t120(struct sk_buff **pskb,
            (nat_t120 = rcu_dereference(nat_t120_hook)) &&
            ct->status & IPS_NAT_MASK) {
                /* NAT needed */
-               ret = nat_t120(pskb, ct, ctinfo, data, dataoff, taddr,
+               ret = nat_t120(skb, ct, ctinfo, data, dataoff, taddr,
                               port, exp);
        } else {                /* Conntrack only */
                if (nf_ct_expect_related(exp) == 0) {
@@ -371,7 +372,7 @@ static int expect_t120(struct sk_buff **pskb,
 }
 
 /****************************************************************************/
-static int process_h245_channel(struct sk_buff **pskb,
+static int process_h245_channel(struct sk_buff *skb,
                                struct nf_conn *ct,
                                enum ip_conntrack_info ctinfo,
                                unsigned char **data, int dataoff,
@@ -381,7 +382,7 @@ static int process_h245_channel(struct sk_buff **pskb,
 
        if (channel->options & eH2250LogicalChannelParameters_mediaChannel) {
                /* RTP */
-               ret = expect_rtp_rtcp(pskb, ct, ctinfo, data, dataoff,
+               ret = expect_rtp_rtcp(skb, ct, ctinfo, data, dataoff,
                                      &channel->mediaChannel);
                if (ret < 0)
                        return -1;
@@ -390,7 +391,7 @@ static int process_h245_channel(struct sk_buff **pskb,
        if (channel->
            options & eH2250LogicalChannelParameters_mediaControlChannel) {
                /* RTCP */
-               ret = expect_rtp_rtcp(pskb, ct, ctinfo, data, dataoff,
+               ret = expect_rtp_rtcp(skb, ct, ctinfo, data, dataoff,
                                      &channel->mediaControlChannel);
                if (ret < 0)
                        return -1;
@@ -400,7 +401,7 @@ static int process_h245_channel(struct sk_buff **pskb,
 }
 
 /****************************************************************************/
-static int process_olc(struct sk_buff **pskb, struct nf_conn *ct,
+static int process_olc(struct sk_buff *skb, struct nf_conn *ct,
                       enum ip_conntrack_info ctinfo,
                       unsigned char **data, int dataoff,
                       OpenLogicalChannel *olc)
@@ -412,7 +413,7 @@ static int process_olc(struct sk_buff **pskb, struct nf_conn *ct,
        if (olc->forwardLogicalChannelParameters.multiplexParameters.choice ==
            eOpenLogicalChannel_forwardLogicalChannelParameters_multiplexParameters_h2250LogicalChannelParameters)
        {
-               ret = process_h245_channel(pskb, ct, ctinfo, data, dataoff,
+               ret = process_h245_channel(skb, ct, ctinfo, data, dataoff,
                                           &olc->
                                           forwardLogicalChannelParameters.
                                           multiplexParameters.
@@ -430,7 +431,7 @@ static int process_olc(struct sk_buff **pskb, struct nf_conn *ct,
                eOpenLogicalChannel_reverseLogicalChannelParameters_multiplexParameters_h2250LogicalChannelParameters))
        {
                ret =
-                   process_h245_channel(pskb, ct, ctinfo, data, dataoff,
+                   process_h245_channel(skb, ct, ctinfo, data, dataoff,
                                         &olc->
                                         reverseLogicalChannelParameters.
                                         multiplexParameters.
@@ -448,7 +449,7 @@ static int process_olc(struct sk_buff **pskb, struct nf_conn *ct,
            t120.choice == eDataProtocolCapability_separateLANStack &&
            olc->separateStack.networkAddress.choice ==
            eNetworkAccessParameters_networkAddress_localAreaAddress) {
-               ret = expect_t120(pskb, ct, ctinfo, data, dataoff,
+               ret = expect_t120(skb, ct, ctinfo, data, dataoff,
                                  &olc->separateStack.networkAddress.
                                  localAreaAddress);
                if (ret < 0)
@@ -459,7 +460,7 @@ static int process_olc(struct sk_buff **pskb, struct nf_conn *ct,
 }
 
 /****************************************************************************/
-static int process_olca(struct sk_buff **pskb, struct nf_conn *ct,
+static int process_olca(struct sk_buff *skb, struct nf_conn *ct,
                        enum ip_conntrack_info ctinfo,
                        unsigned char **data, int dataoff,
                        OpenLogicalChannelAck *olca)
@@ -477,7 +478,7 @@ static int process_olca(struct sk_buff **pskb, struct nf_conn *ct,
                choice ==
                eOpenLogicalChannelAck_reverseLogicalChannelParameters_multiplexParameters_h2250LogicalChannelParameters))
        {
-               ret = process_h245_channel(pskb, ct, ctinfo, data, dataoff,
+               ret = process_h245_channel(skb, ct, ctinfo, data, dataoff,
                                           &olca->
                                           reverseLogicalChannelParameters.
                                           multiplexParameters.
@@ -496,7 +497,7 @@ static int process_olca(struct sk_buff **pskb, struct nf_conn *ct,
                if (ack->options &
                    eH2250LogicalChannelAckParameters_mediaChannel) {
                        /* RTP */
-                       ret = expect_rtp_rtcp(pskb, ct, ctinfo, data, dataoff,
+                       ret = expect_rtp_rtcp(skb, ct, ctinfo, data, dataoff,
                                              &ack->mediaChannel);
                        if (ret < 0)
                                return -1;
@@ -505,7 +506,7 @@ static int process_olca(struct sk_buff **pskb, struct nf_conn *ct,
                if (ack->options &
                    eH2250LogicalChannelAckParameters_mediaControlChannel) {
                        /* RTCP */
-                       ret = expect_rtp_rtcp(pskb, ct, ctinfo, data, dataoff,
+                       ret = expect_rtp_rtcp(skb, ct, ctinfo, data, dataoff,
                                              &ack->mediaControlChannel);
                        if (ret < 0)
                                return -1;
@@ -515,7 +516,7 @@ static int process_olca(struct sk_buff **pskb, struct nf_conn *ct,
        if ((olca->options & eOpenLogicalChannelAck_separateStack) &&
                olca->separateStack.networkAddress.choice ==
                eNetworkAccessParameters_networkAddress_localAreaAddress) {
-               ret = expect_t120(pskb, ct, ctinfo, data, dataoff,
+               ret = expect_t120(skb, ct, ctinfo, data, dataoff,
                                  &olca->separateStack.networkAddress.
                                  localAreaAddress);
                if (ret < 0)
@@ -526,7 +527,7 @@ static int process_olca(struct sk_buff **pskb, struct nf_conn *ct,
 }
 
 /****************************************************************************/
-static int process_h245(struct sk_buff **pskb, struct nf_conn *ct,
+static int process_h245(struct sk_buff *skb, struct nf_conn *ct,
                        enum ip_conntrack_info ctinfo,
                        unsigned char **data, int dataoff,
                        MultimediaSystemControlMessage *mscm)
@@ -535,7 +536,7 @@ static int process_h245(struct sk_buff **pskb, struct nf_conn *ct,
        case eMultimediaSystemControlMessage_request:
                if (mscm->request.choice ==
                    eRequestMessage_openLogicalChannel) {
-                       return process_olc(pskb, ct, ctinfo, data, dataoff,
+                       return process_olc(skb, ct, ctinfo, data, dataoff,
                                           &mscm->request.openLogicalChannel);
                }
                pr_debug("nf_ct_h323: H.245 Request %d\n",
@@ -544,7 +545,7 @@ static int process_h245(struct sk_buff **pskb, struct nf_conn *ct,
        case eMultimediaSystemControlMessage_response:
                if (mscm->response.choice ==
                    eResponseMessage_openLogicalChannelAck) {
-                       return process_olca(pskb, ct, ctinfo, data, dataoff,
+                       return process_olca(skb, ct, ctinfo, data, dataoff,
                                            &mscm->response.
                                            openLogicalChannelAck);
                }
@@ -560,7 +561,7 @@ static int process_h245(struct sk_buff **pskb, struct nf_conn *ct,
 }
 
 /****************************************************************************/
-static int h245_help(struct sk_buff **pskb, unsigned int protoff,
+static int h245_help(struct sk_buff *skb, unsigned int protoff,
                     struct nf_conn *ct, enum ip_conntrack_info ctinfo)
 {
        static MultimediaSystemControlMessage mscm;
@@ -574,12 +575,12 @@ static int h245_help(struct sk_buff **pskb, unsigned int protoff,
            ctinfo != IP_CT_ESTABLISHED + IP_CT_IS_REPLY) {
                return NF_ACCEPT;
        }
-       pr_debug("nf_ct_h245: skblen = %u\n", (*pskb)->len);
+       pr_debug("nf_ct_h245: skblen = %u\n", skb->len);
 
        spin_lock_bh(&nf_h323_lock);
 
        /* Process each TPKT */
-       while (get_tpkt_data(pskb, protoff, ct, ctinfo,
+       while (get_tpkt_data(skb, protoff, ct, ctinfo,
                             &data, &datalen, &dataoff)) {
                pr_debug("nf_ct_h245: TPKT len=%d ", datalen);
                NF_CT_DUMP_TUPLE(&ct->tuplehash[CTINFO2DIR(ctinfo)].tuple);
@@ -596,7 +597,7 @@ static int h245_help(struct sk_buff **pskb, unsigned int protoff,
                }
 
                /* Process H.245 signal */
-               if (process_h245(pskb, ct, ctinfo, &data, dataoff, &mscm) < 0)
+               if (process_h245(skb, ct, ctinfo, &data, dataoff, &mscm) < 0)
                        goto drop;
        }
 
@@ -616,6 +617,7 @@ static struct nf_conntrack_helper nf_conntrack_helper_h245 __read_mostly = {
        .me                     = THIS_MODULE,
        .max_expected           = H323_RTP_CHANNEL_MAX * 4 + 2 /* T.120 */,
        .timeout                = 240,
+       .tuple.src.l3num        = AF_UNSPEC,
        .tuple.dst.protonum     = IPPROTO_UDP,
        .help                   = h245_help
 };
@@ -623,9 +625,9 @@ static struct nf_conntrack_helper nf_conntrack_helper_h245 __read_mostly = {
 /****************************************************************************/
 int get_h225_addr(struct nf_conn *ct, unsigned char *data,
                  TransportAddress *taddr,
-                 union nf_conntrack_address *addr, __be16 *port)
+                 union nf_inet_addr *addr, __be16 *port)
 {
-       unsigned char *p;
+       const unsigned char *p;
        int family = ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.l3num;
        int len;
 
@@ -654,7 +656,7 @@ int get_h225_addr(struct nf_conn *ct, unsigned char *data,
 }
 
 /****************************************************************************/
-static int expect_h245(struct sk_buff **pskb, struct nf_conn *ct,
+static int expect_h245(struct sk_buff *skb, struct nf_conn *ct,
                       enum ip_conntrack_info ctinfo,
                       unsigned char **data, int dataoff,
                       TransportAddress *taddr)
@@ -662,7 +664,7 @@ static int expect_h245(struct sk_buff **pskb, struct nf_conn *ct,
        int dir = CTINFO2DIR(ctinfo);
        int ret = 0;
        __be16 port;
-       union nf_conntrack_address addr;
+       union nf_inet_addr addr;
        struct nf_conntrack_expect *exp;
        typeof(nat_h245_hook) nat_h245;
 
@@ -687,7 +689,7 @@ static int expect_h245(struct sk_buff **pskb, struct nf_conn *ct,
            (nat_h245 = rcu_dereference(nat_h245_hook)) &&
            ct->status & IPS_NAT_MASK) {
                /* NAT needed */
-               ret = nat_h245(pskb, ct, ctinfo, data, dataoff, taddr,
+               ret = nat_h245(skb, ct, ctinfo, data, dataoff, taddr,
                               port, exp);
        } else {                /* Conntrack only */
                if (nf_ct_expect_related(exp) == 0) {
@@ -704,13 +706,18 @@ static int expect_h245(struct sk_buff **pskb, struct nf_conn *ct,
 
 /* If the calling party is on the same side of the forward-to party,
  * we don't need to track the second call */
-static int callforward_do_filter(union nf_conntrack_address *src,
-                                union nf_conntrack_address *dst,
-                                int family)
+static int callforward_do_filter(const union nf_inet_addr *src,
+                                 const union nf_inet_addr *dst, int family)
 {
+       const struct nf_afinfo *afinfo;
        struct flowi fl1, fl2;
        int ret = 0;
 
+       /* rcu_read_lock()ed by nf_hook_slow() */
+       afinfo = nf_get_afinfo(family);
+       if (!afinfo)
+               return 0;
+
        memset(&fl1, 0, sizeof(fl1));
        memset(&fl2, 0, sizeof(fl2));
 
@@ -720,8 +727,8 @@ static int callforward_do_filter(union nf_conntrack_address *src,
 
                fl1.fl4_dst = src->ip;
                fl2.fl4_dst = dst->ip;
-               if (ip_route_output_key(&rt1, &fl1) == 0) {
-                       if (ip_route_output_key(&rt2, &fl2) == 0) {
+               if (!afinfo->route((struct dst_entry **)&rt1, &fl1)) {
+                       if (!afinfo->route((struct dst_entry **)&rt2, &fl2)) {
                                if (rt1->rt_gateway == rt2->rt_gateway &&
                                    rt1->u.dst.dev  == rt2->u.dst.dev)
                                        ret = 1;
@@ -731,16 +738,15 @@ static int callforward_do_filter(union nf_conntrack_address *src,
                }
                break;
        }
-#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
+#if defined(CONFIG_NF_CONNTRACK_IPV6) || \
+    defined(CONFIG_NF_CONNTRACK_IPV6_MODULE)
        case AF_INET6: {
                struct rt6_info *rt1, *rt2;
 
                memcpy(&fl1.fl6_dst, src, sizeof(fl1.fl6_dst));
                memcpy(&fl2.fl6_dst, dst, sizeof(fl2.fl6_dst));
-               rt1 = (struct rt6_info *)ip6_route_output(NULL, &fl1);
-               if (rt1) {
-                       rt2 = (struct rt6_info *)ip6_route_output(NULL, &fl2);
-                       if (rt2) {
+               if (!afinfo->route((struct dst_entry **)&rt1, &fl1)) {
+                       if (!afinfo->route((struct dst_entry **)&rt2, &fl2)) {
                                if (!memcmp(&rt1->rt6i_gateway, &rt2->rt6i_gateway,
                                            sizeof(rt1->rt6i_gateway)) &&
                                    rt1->u.dst.dev == rt2->u.dst.dev)
@@ -758,7 +764,7 @@ static int callforward_do_filter(union nf_conntrack_address *src,
 }
 
 /****************************************************************************/
-static int expect_callforwarding(struct sk_buff **pskb,
+static int expect_callforwarding(struct sk_buff *skb,
                                 struct nf_conn *ct,
                                 enum ip_conntrack_info ctinfo,
                                 unsigned char **data, int dataoff,
@@ -767,7 +773,7 @@ static int expect_callforwarding(struct sk_buff **pskb,
        int dir = CTINFO2DIR(ctinfo);
        int ret = 0;
        __be16 port;
-       union nf_conntrack_address addr;
+       union nf_inet_addr addr;
        struct nf_conntrack_expect *exp;
        typeof(nat_callforwarding_hook) nat_callforwarding;
 
@@ -798,7 +804,7 @@ static int expect_callforwarding(struct sk_buff **pskb,
            (nat_callforwarding = rcu_dereference(nat_callforwarding_hook)) &&
            ct->status & IPS_NAT_MASK) {
                /* Need NAT */
-               ret = nat_callforwarding(pskb, ct, ctinfo, data, dataoff,
+               ret = nat_callforwarding(skb, ct, ctinfo, data, dataoff,
                                         taddr, port, exp);
        } else {                /* Conntrack only */
                if (nf_ct_expect_related(exp) == 0) {
@@ -814,7 +820,7 @@ static int expect_callforwarding(struct sk_buff **pskb,
 }
 
 /****************************************************************************/
-static int process_setup(struct sk_buff **pskb, struct nf_conn *ct,
+static int process_setup(struct sk_buff *skb, struct nf_conn *ct,
                         enum ip_conntrack_info ctinfo,
                         unsigned char **data, int dataoff,
                         Setup_UUIE *setup)
@@ -823,13 +829,13 @@ static int process_setup(struct sk_buff **pskb, struct nf_conn *ct,
        int ret;
        int i;
        __be16 port;
-       union nf_conntrack_address addr;
+       union nf_inet_addr addr;
        typeof(set_h225_addr_hook) set_h225_addr;
 
        pr_debug("nf_ct_q931: Setup\n");
 
        if (setup->options & eSetup_UUIE_h245Address) {
-               ret = expect_h245(pskb, ct, ctinfo, data, dataoff,
+               ret = expect_h245(skb, ct, ctinfo, data, dataoff,
                                  &setup->h245Address);
                if (ret < 0)
                        return -1;
@@ -837,7 +843,7 @@ static int process_setup(struct sk_buff **pskb, struct nf_conn *ct,
 
        set_h225_addr = rcu_dereference(set_h225_addr_hook);
        if ((setup->options & eSetup_UUIE_destCallSignalAddress) &&
-           (set_h225_addr) && ct->status && IPS_NAT_MASK &&
+           (set_h225_addr) && ct->status & IPS_NAT_MASK &&
            get_h225_addr(ct, *data, &setup->destCallSignalAddress,
                          &addr, &port) &&
            memcmp(&addr, &ct->tuplehash[!dir].tuple.src.u3, sizeof(addr))) {
@@ -846,7 +852,7 @@ static int process_setup(struct sk_buff **pskb, struct nf_conn *ct,
                         NIP6(*(struct in6_addr *)&addr), ntohs(port),
                         NIP6(*(struct in6_addr *)&ct->tuplehash[!dir].tuple.src.u3),
                         ntohs(ct->tuplehash[!dir].tuple.src.u.tcp.port));
-               ret = set_h225_addr(pskb, data, dataoff,
+               ret = set_h225_addr(skb, data, dataoff,
                                    &setup->destCallSignalAddress,
                                    &ct->tuplehash[!dir].tuple.src.u3,
                                    ct->tuplehash[!dir].tuple.src.u.tcp.port);
@@ -864,7 +870,7 @@ static int process_setup(struct sk_buff **pskb, struct nf_conn *ct,
                         NIP6(*(struct in6_addr *)&addr), ntohs(port),
                         NIP6(*(struct in6_addr *)&ct->tuplehash[!dir].tuple.dst.u3),
                         ntohs(ct->tuplehash[!dir].tuple.dst.u.tcp.port));
-               ret = set_h225_addr(pskb, data, dataoff,
+               ret = set_h225_addr(skb, data, dataoff,
                                    &setup->sourceCallSignalAddress,
                                    &ct->tuplehash[!dir].tuple.dst.u3,
                                    ct->tuplehash[!dir].tuple.dst.u.tcp.port);
@@ -874,7 +880,7 @@ static int process_setup(struct sk_buff **pskb, struct nf_conn *ct,
 
        if (setup->options & eSetup_UUIE_fastStart) {
                for (i = 0; i < setup->fastStart.count; i++) {
-                       ret = process_olc(pskb, ct, ctinfo, data, dataoff,
+                       ret = process_olc(skb, ct, ctinfo, data, dataoff,
                                          &setup->fastStart.item[i]);
                        if (ret < 0)
                                return -1;
@@ -885,7 +891,7 @@ static int process_setup(struct sk_buff **pskb, struct nf_conn *ct,
 }
 
 /****************************************************************************/
-static int process_callproceeding(struct sk_buff **pskb,
+static int process_callproceeding(struct sk_buff *skb,
                                  struct nf_conn *ct,
                                  enum ip_conntrack_info ctinfo,
                                  unsigned char **data, int dataoff,
@@ -897,7 +903,7 @@ static int process_callproceeding(struct sk_buff **pskb,
        pr_debug("nf_ct_q931: CallProceeding\n");
 
        if (callproc->options & eCallProceeding_UUIE_h245Address) {
-               ret = expect_h245(pskb, ct, ctinfo, data, dataoff,
+               ret = expect_h245(skb, ct, ctinfo, data, dataoff,
                                  &callproc->h245Address);
                if (ret < 0)
                        return -1;
@@ -905,7 +911,7 @@ static int process_callproceeding(struct sk_buff **pskb,
 
        if (callproc->options & eCallProceeding_UUIE_fastStart) {
                for (i = 0; i < callproc->fastStart.count; i++) {
-                       ret = process_olc(pskb, ct, ctinfo, data, dataoff,
+                       ret = process_olc(skb, ct, ctinfo, data, dataoff,
                                          &callproc->fastStart.item[i]);
                        if (ret < 0)
                                return -1;
@@ -916,7 +922,7 @@ static int process_callproceeding(struct sk_buff **pskb,
 }
 
 /****************************************************************************/
-static int process_connect(struct sk_buff **pskb, struct nf_conn *ct,
+static int process_connect(struct sk_buff *skb, struct nf_conn *ct,
                           enum ip_conntrack_info ctinfo,
                           unsigned char **data, int dataoff,
                           Connect_UUIE *connect)
@@ -927,7 +933,7 @@ static int process_connect(struct sk_buff **pskb, struct nf_conn *ct,
        pr_debug("nf_ct_q931: Connect\n");
 
        if (connect->options & eConnect_UUIE_h245Address) {
-               ret = expect_h245(pskb, ct, ctinfo, data, dataoff,
+               ret = expect_h245(skb, ct, ctinfo, data, dataoff,
                                  &connect->h245Address);
                if (ret < 0)
                        return -1;
@@ -935,7 +941,7 @@ static int process_connect(struct sk_buff **pskb, struct nf_conn *ct,
 
        if (connect->options & eConnect_UUIE_fastStart) {
                for (i = 0; i < connect->fastStart.count; i++) {
-                       ret = process_olc(pskb, ct, ctinfo, data, dataoff,
+                       ret = process_olc(skb, ct, ctinfo, data, dataoff,
                                          &connect->fastStart.item[i]);
                        if (ret < 0)
                                return -1;
@@ -946,7 +952,7 @@ static int process_connect(struct sk_buff **pskb, struct nf_conn *ct,
 }
 
 /****************************************************************************/
-static int process_alerting(struct sk_buff **pskb, struct nf_conn *ct,
+static int process_alerting(struct sk_buff *skb, struct nf_conn *ct,
                            enum ip_conntrack_info ctinfo,
                            unsigned char **data, int dataoff,
                            Alerting_UUIE *alert)
@@ -957,7 +963,7 @@ static int process_alerting(struct sk_buff **pskb, struct nf_conn *ct,
        pr_debug("nf_ct_q931: Alerting\n");
 
        if (alert->options & eAlerting_UUIE_h245Address) {
-               ret = expect_h245(pskb, ct, ctinfo, data, dataoff,
+               ret = expect_h245(skb, ct, ctinfo, data, dataoff,
                                  &alert->h245Address);
                if (ret < 0)
                        return -1;
@@ -965,7 +971,7 @@ static int process_alerting(struct sk_buff **pskb, struct nf_conn *ct,
 
        if (alert->options & eAlerting_UUIE_fastStart) {
                for (i = 0; i < alert->fastStart.count; i++) {
-                       ret = process_olc(pskb, ct, ctinfo, data, dataoff,
+                       ret = process_olc(skb, ct, ctinfo, data, dataoff,
                                          &alert->fastStart.item[i]);
                        if (ret < 0)
                                return -1;
@@ -976,7 +982,7 @@ static int process_alerting(struct sk_buff **pskb, struct nf_conn *ct,
 }
 
 /****************************************************************************/
-static int process_facility(struct sk_buff **pskb, struct nf_conn *ct,
+static int process_facility(struct sk_buff *skb, struct nf_conn *ct,
                            enum ip_conntrack_info ctinfo,
                            unsigned char **data, int dataoff,
                            Facility_UUIE *facility)
@@ -988,7 +994,7 @@ static int process_facility(struct sk_buff **pskb, struct nf_conn *ct,
 
        if (facility->reason.choice == eFacilityReason_callForwarded) {
                if (facility->options & eFacility_UUIE_alternativeAddress)
-                       return expect_callforwarding(pskb, ct, ctinfo, data,
+                       return expect_callforwarding(skb, ct, ctinfo, data,
                                                     dataoff,
                                                     &facility->
                                                     alternativeAddress);
@@ -996,7 +1002,7 @@ static int process_facility(struct sk_buff **pskb, struct nf_conn *ct,
        }
 
        if (facility->options & eFacility_UUIE_h245Address) {
-               ret = expect_h245(pskb, ct, ctinfo, data, dataoff,
+               ret = expect_h245(skb, ct, ctinfo, data, dataoff,
                                  &facility->h245Address);
                if (ret < 0)
                        return -1;
@@ -1004,7 +1010,7 @@ static int process_facility(struct sk_buff **pskb, struct nf_conn *ct,
 
        if (facility->options & eFacility_UUIE_fastStart) {
                for (i = 0; i < facility->fastStart.count; i++) {
-                       ret = process_olc(pskb, ct, ctinfo, data, dataoff,
+                       ret = process_olc(skb, ct, ctinfo, data, dataoff,
                                          &facility->fastStart.item[i]);
                        if (ret < 0)
                                return -1;
@@ -1015,7 +1021,7 @@ static int process_facility(struct sk_buff **pskb, struct nf_conn *ct,
 }
 
 /****************************************************************************/
-static int process_progress(struct sk_buff **pskb, struct nf_conn *ct,
+static int process_progress(struct sk_buff *skb, struct nf_conn *ct,
                            enum ip_conntrack_info ctinfo,
                            unsigned char **data, int dataoff,
                            Progress_UUIE *progress)
@@ -1026,7 +1032,7 @@ static int process_progress(struct sk_buff **pskb, struct nf_conn *ct,
        pr_debug("nf_ct_q931: Progress\n");
 
        if (progress->options & eProgress_UUIE_h245Address) {
-               ret = expect_h245(pskb, ct, ctinfo, data, dataoff,
+               ret = expect_h245(skb, ct, ctinfo, data, dataoff,
                                  &progress->h245Address);
                if (ret < 0)
                        return -1;
@@ -1034,7 +1040,7 @@ static int process_progress(struct sk_buff **pskb, struct nf_conn *ct,
 
        if (progress->options & eProgress_UUIE_fastStart) {
                for (i = 0; i < progress->fastStart.count; i++) {
-                       ret = process_olc(pskb, ct, ctinfo, data, dataoff,
+                       ret = process_olc(skb, ct, ctinfo, data, dataoff,
                                          &progress->fastStart.item[i]);
                        if (ret < 0)
                                return -1;
@@ -1045,7 +1051,7 @@ static int process_progress(struct sk_buff **pskb, struct nf_conn *ct,
 }
 
 /****************************************************************************/
-static int process_q931(struct sk_buff **pskb, struct nf_conn *ct,
+static int process_q931(struct sk_buff *skb, struct nf_conn *ct,
                        enum ip_conntrack_info ctinfo,
                        unsigned char **data, int dataoff, Q931 *q931)
 {
@@ -1055,28 +1061,28 @@ static int process_q931(struct sk_buff **pskb, struct nf_conn *ct,
 
        switch (pdu->h323_message_body.choice) {
        case eH323_UU_PDU_h323_message_body_setup:
-               ret = process_setup(pskb, ct, ctinfo, data, dataoff,
+               ret = process_setup(skb, ct, ctinfo, data, dataoff,
                                    &pdu->h323_message_body.setup);
                break;
        case eH323_UU_PDU_h323_message_body_callProceeding:
-               ret = process_callproceeding(pskb, ct, ctinfo, data, dataoff,
+               ret = process_callproceeding(skb, ct, ctinfo, data, dataoff,
                                             &pdu->h323_message_body.
                                             callProceeding);
                break;
        case eH323_UU_PDU_h323_message_body_connect:
-               ret = process_connect(pskb, ct, ctinfo, data, dataoff,
+               ret = process_connect(skb, ct, ctinfo, data, dataoff,
                                      &pdu->h323_message_body.connect);
                break;
        case eH323_UU_PDU_h323_message_body_alerting:
-               ret = process_alerting(pskb, ct, ctinfo, data, dataoff,
+               ret = process_alerting(skb, ct, ctinfo, data, dataoff,
                                       &pdu->h323_message_body.alerting);
                break;
        case eH323_UU_PDU_h323_message_body_facility:
-               ret = process_facility(pskb, ct, ctinfo, data, dataoff,
+               ret = process_facility(skb, ct, ctinfo, data, dataoff,
                                       &pdu->h323_message_body.facility);
                break;
        case eH323_UU_PDU_h323_message_body_progress:
-               ret = process_progress(pskb, ct, ctinfo, data, dataoff,
+               ret = process_progress(skb, ct, ctinfo, data, dataoff,
                                       &pdu->h323_message_body.progress);
                break;
        default:
@@ -1090,7 +1096,7 @@ static int process_q931(struct sk_buff **pskb, struct nf_conn *ct,
 
        if (pdu->options & eH323_UU_PDU_h245Control) {
                for (i = 0; i < pdu->h245Control.count; i++) {
-                       ret = process_h245(pskb, ct, ctinfo, data, dataoff,
+                       ret = process_h245(skb, ct, ctinfo, data, dataoff,
                                           &pdu->h245Control.item[i]);
                        if (ret < 0)
                                return -1;
@@ -1101,7 +1107,7 @@ static int process_q931(struct sk_buff **pskb, struct nf_conn *ct,
 }
 
 /****************************************************************************/
-static int q931_help(struct sk_buff **pskb, unsigned int protoff,
+static int q931_help(struct sk_buff *skb, unsigned int protoff,
                     struct nf_conn *ct, enum ip_conntrack_info ctinfo)
 {
        static Q931 q931;
@@ -1115,12 +1121,12 @@ static int q931_help(struct sk_buff **pskb, unsigned int protoff,
            ctinfo != IP_CT_ESTABLISHED + IP_CT_IS_REPLY) {
                return NF_ACCEPT;
        }
-       pr_debug("nf_ct_q931: skblen = %u\n", (*pskb)->len);
+       pr_debug("nf_ct_q931: skblen = %u\n", skb->len);
 
        spin_lock_bh(&nf_h323_lock);
 
        /* Process each TPKT */
-       while (get_tpkt_data(pskb, protoff, ct, ctinfo,
+       while (get_tpkt_data(skb, protoff, ct, ctinfo,
                             &data, &datalen, &dataoff)) {
                pr_debug("nf_ct_q931: TPKT len=%d ", datalen);
                NF_CT_DUMP_TUPLE(&ct->tuplehash[CTINFO2DIR(ctinfo)].tuple);
@@ -1136,7 +1142,7 @@ static int q931_help(struct sk_buff **pskb, unsigned int protoff,
                }
 
                /* Process Q.931 signal */
-               if (process_q931(pskb, ct, ctinfo, &data, dataoff, &q931) < 0)
+               if (process_q931(skb, ct, ctinfo, &data, dataoff, &q931) < 0)
                        goto drop;
        }
 
@@ -1177,25 +1183,26 @@ static struct nf_conntrack_helper nf_conntrack_helper_q931[] __read_mostly = {
 };
 
 /****************************************************************************/
-static unsigned char *get_udp_data(struct sk_buff **pskb, unsigned int protoff,
+static unsigned char *get_udp_data(struct sk_buff *skb, unsigned int protoff,
                                   int *datalen)
 {
-       struct udphdr _uh, *uh;
+       const struct udphdr *uh;
+       struct udphdr _uh;
        int dataoff;
 
-       uh = skb_header_pointer(*pskb, protoff, sizeof(_uh), &_uh);
+       uh = skb_header_pointer(skb, protoff, sizeof(_uh), &_uh);
        if (uh == NULL)
                return NULL;
        dataoff = protoff + sizeof(_uh);
-       if (dataoff >= (*pskb)->len)
+       if (dataoff >= skb->len)
                return NULL;
-       *datalen = (*pskb)->len - dataoff;
-       return skb_header_pointer(*pskb, dataoff, *datalen, h323_buffer);
+       *datalen = skb->len - dataoff;
+       return skb_header_pointer(skb, dataoff, *datalen, h323_buffer);
 }
 
 /****************************************************************************/
 static struct nf_conntrack_expect *find_expect(struct nf_conn *ct,
-                                              union nf_conntrack_address *addr,
+                                              union nf_inet_addr *addr,
                                               __be16 port)
 {
        struct nf_conntrack_expect *exp;
@@ -1227,7 +1234,7 @@ static int set_expect_timeout(struct nf_conntrack_expect *exp,
 }
 
 /****************************************************************************/
-static int expect_q931(struct sk_buff **pskb, struct nf_conn *ct,
+static int expect_q931(struct sk_buff *skb, struct nf_conn *ct,
                       enum ip_conntrack_info ctinfo,
                       unsigned char **data,
                       TransportAddress *taddr, int count)
@@ -1237,7 +1244,7 @@ static int expect_q931(struct sk_buff **pskb, struct nf_conn *ct,
        int ret = 0;
        int i;
        __be16 port;
-       union nf_conntrack_address addr;
+       union nf_inet_addr addr;
        struct nf_conntrack_expect *exp;
        typeof(nat_q931_hook) nat_q931;
 
@@ -1265,7 +1272,7 @@ static int expect_q931(struct sk_buff **pskb, struct nf_conn *ct,
 
        nat_q931 = rcu_dereference(nat_q931_hook);
        if (nat_q931 && ct->status & IPS_NAT_MASK) {    /* Need NAT */
-               ret = nat_q931(pskb, ct, ctinfo, data, taddr, i, port, exp);
+               ret = nat_q931(skb, ct, ctinfo, data, taddr, i, port, exp);
        } else {                /* Conntrack only */
                if (nf_ct_expect_related(exp) == 0) {
                        pr_debug("nf_ct_ras: expect Q.931 ");
@@ -1283,7 +1290,7 @@ static int expect_q931(struct sk_buff **pskb, struct nf_conn *ct,
 }
 
 /****************************************************************************/
-static int process_grq(struct sk_buff **pskb, struct nf_conn *ct,
+static int process_grq(struct sk_buff *skb, struct nf_conn *ct,
                       enum ip_conntrack_info ctinfo,
                       unsigned char **data, GatekeeperRequest *grq)
 {
@@ -1293,20 +1300,20 @@ static int process_grq(struct sk_buff **pskb, struct nf_conn *ct,
 
        set_ras_addr = rcu_dereference(set_ras_addr_hook);
        if (set_ras_addr && ct->status & IPS_NAT_MASK)  /* NATed */
-               return set_ras_addr(pskb, ct, ctinfo, data,
+               return set_ras_addr(skb, ct, ctinfo, data,
                                    &grq->rasAddress, 1);
        return 0;
 }
 
 /****************************************************************************/
-static int process_gcf(struct sk_buff **pskb, struct nf_conn *ct,
+static int process_gcf(struct sk_buff *skb, struct nf_conn *ct,
                       enum ip_conntrack_info ctinfo,
                       unsigned char **data, GatekeeperConfirm *gcf)
 {
        int dir = CTINFO2DIR(ctinfo);
        int ret = 0;
        __be16 port;
-       union nf_conntrack_address addr;
+       union nf_inet_addr addr;
        struct nf_conntrack_expect *exp;
 
        pr_debug("nf_ct_ras: GCF\n");
@@ -1343,7 +1350,7 @@ static int process_gcf(struct sk_buff **pskb, struct nf_conn *ct,
 }
 
 /****************************************************************************/
-static int process_rrq(struct sk_buff **pskb, struct nf_conn *ct,
+static int process_rrq(struct sk_buff *skb, struct nf_conn *ct,
                       enum ip_conntrack_info ctinfo,
                       unsigned char **data, RegistrationRequest *rrq)
 {
@@ -1353,7 +1360,7 @@ static int process_rrq(struct sk_buff **pskb, struct nf_conn *ct,
 
        pr_debug("nf_ct_ras: RRQ\n");
 
-       ret = expect_q931(pskb, ct, ctinfo, data,
+       ret = expect_q931(skb, ct, ctinfo, data,
                          rrq->callSignalAddress.item,
                          rrq->callSignalAddress.count);
        if (ret < 0)
@@ -1361,7 +1368,7 @@ static int process_rrq(struct sk_buff **pskb, struct nf_conn *ct,
 
        set_ras_addr = rcu_dereference(set_ras_addr_hook);
        if (set_ras_addr && ct->status & IPS_NAT_MASK) {
-               ret = set_ras_addr(pskb, ct, ctinfo, data,
+               ret = set_ras_addr(skb, ct, ctinfo, data,
                                   rrq->rasAddress.item,
                                   rrq->rasAddress.count);
                if (ret < 0)
@@ -1378,7 +1385,7 @@ static int process_rrq(struct sk_buff **pskb, struct nf_conn *ct,
 }
 
 /****************************************************************************/
-static int process_rcf(struct sk_buff **pskb, struct nf_conn *ct,
+static int process_rcf(struct sk_buff *skb, struct nf_conn *ct,
                       enum ip_conntrack_info ctinfo,
                       unsigned char **data, RegistrationConfirm *rcf)
 {
@@ -1392,7 +1399,7 @@ static int process_rcf(struct sk_buff **pskb, struct nf_conn *ct,
 
        set_sig_addr = rcu_dereference(set_sig_addr_hook);
        if (set_sig_addr && ct->status & IPS_NAT_MASK) {
-               ret = set_sig_addr(pskb, ct, ctinfo, data,
+               ret = set_sig_addr(skb, ct, ctinfo, data,
                                        rcf->callSignalAddress.item,
                                        rcf->callSignalAddress.count);
                if (ret < 0)
@@ -1407,10 +1414,10 @@ static int process_rcf(struct sk_buff **pskb, struct nf_conn *ct,
        if (info->timeout > 0) {
                pr_debug("nf_ct_ras: set RAS connection timeout to "
                         "%u seconds\n", info->timeout);
-               nf_ct_refresh(ct, *pskb, info->timeout * HZ);
+               nf_ct_refresh(ct, skb, info->timeout * HZ);
 
                /* Set expect timeout */
-               read_lock_bh(&nf_conntrack_lock);
+               spin_lock_bh(&nf_conntrack_lock);
                exp = find_expect(ct, &ct->tuplehash[dir].tuple.dst.u3,
                                  info->sig_port[!dir]);
                if (exp) {
@@ -1420,14 +1427,14 @@ static int process_rcf(struct sk_buff **pskb, struct nf_conn *ct,
                        NF_CT_DUMP_TUPLE(&exp->tuple);
                        set_expect_timeout(exp, info->timeout);
                }
-               read_unlock_bh(&nf_conntrack_lock);
+               spin_unlock_bh(&nf_conntrack_lock);
        }
 
        return 0;
 }
 
 /****************************************************************************/
-static int process_urq(struct sk_buff **pskb, struct nf_conn *ct,
+static int process_urq(struct sk_buff *skb, struct nf_conn *ct,
                       enum ip_conntrack_info ctinfo,
                       unsigned char **data, UnregistrationRequest *urq)
 {
@@ -1440,7 +1447,7 @@ static int process_urq(struct sk_buff **pskb, struct nf_conn *ct,
 
        set_sig_addr = rcu_dereference(set_sig_addr_hook);
        if (set_sig_addr && ct->status & IPS_NAT_MASK) {
-               ret = set_sig_addr(pskb, ct, ctinfo, data,
+               ret = set_sig_addr(skb, ct, ctinfo, data,
                                   urq->callSignalAddress.item,
                                   urq->callSignalAddress.count);
                if (ret < 0)
@@ -1453,20 +1460,20 @@ static int process_urq(struct sk_buff **pskb, struct nf_conn *ct,
        info->sig_port[!dir] = 0;
 
        /* Give it 30 seconds for UCF or URJ */
-       nf_ct_refresh(ct, *pskb, 30 * HZ);
+       nf_ct_refresh(ct, skb, 30 * HZ);
 
        return 0;
 }
 
 /****************************************************************************/
-static int process_arq(struct sk_buff **pskb, struct nf_conn *ct,
+static int process_arq(struct sk_buff *skb, struct nf_conn *ct,
                       enum ip_conntrack_info ctinfo,
                       unsigned char **data, AdmissionRequest *arq)
 {
-       struct nf_ct_h323_master *info = &nfct_help(ct)->help.ct_h323_info;
+       const struct nf_ct_h323_master *info = &nfct_help(ct)->help.ct_h323_info;
        int dir = CTINFO2DIR(ctinfo);
        __be16 port;
-       union nf_conntrack_address addr;
+       union nf_inet_addr addr;
        typeof(set_h225_addr_hook) set_h225_addr;
 
        pr_debug("nf_ct_ras: ARQ\n");
@@ -1479,7 +1486,7 @@ static int process_arq(struct sk_buff **pskb, struct nf_conn *ct,
            port == info->sig_port[dir] &&
            set_h225_addr && ct->status & IPS_NAT_MASK) {
                /* Answering ARQ */
-               return set_h225_addr(pskb, data, 0,
+               return set_h225_addr(skb, data, 0,
                                     &arq->destCallSignalAddress,
                                     &ct->tuplehash[!dir].tuple.dst.u3,
                                     info->sig_port[!dir]);
@@ -1491,7 +1498,7 @@ static int process_arq(struct sk_buff **pskb, struct nf_conn *ct,
            !memcmp(&addr, &ct->tuplehash[dir].tuple.src.u3, sizeof(addr)) &&
            set_h225_addr && ct->status & IPS_NAT_MASK) {
                /* Calling ARQ */
-               return set_h225_addr(pskb, data, 0,
+               return set_h225_addr(skb, data, 0,
                                     &arq->srcCallSignalAddress,
                                     &ct->tuplehash[!dir].tuple.dst.u3,
                                     port);
@@ -1501,14 +1508,14 @@ static int process_arq(struct sk_buff **pskb, struct nf_conn *ct,
 }
 
 /****************************************************************************/
-static int process_acf(struct sk_buff **pskb, struct nf_conn *ct,
+static int process_acf(struct sk_buff *skb, struct nf_conn *ct,
                       enum ip_conntrack_info ctinfo,
                       unsigned char **data, AdmissionConfirm *acf)
 {
        int dir = CTINFO2DIR(ctinfo);
        int ret = 0;
        __be16 port;
-       union nf_conntrack_address addr;
+       union nf_inet_addr addr;
        struct nf_conntrack_expect *exp;
        typeof(set_sig_addr_hook) set_sig_addr;
 
@@ -1522,7 +1529,7 @@ static int process_acf(struct sk_buff **pskb, struct nf_conn *ct,
                /* Answering ACF */
                set_sig_addr = rcu_dereference(set_sig_addr_hook);
                if (set_sig_addr && ct->status & IPS_NAT_MASK)
-                       return set_sig_addr(pskb, ct, ctinfo, data,
+                       return set_sig_addr(skb, ct, ctinfo, data,
                                            &acf->destCallSignalAddress, 1);
                return 0;
        }
@@ -1548,7 +1555,7 @@ static int process_acf(struct sk_buff **pskb, struct nf_conn *ct,
 }
 
 /****************************************************************************/
-static int process_lrq(struct sk_buff **pskb, struct nf_conn *ct,
+static int process_lrq(struct sk_buff *skb, struct nf_conn *ct,
                       enum ip_conntrack_info ctinfo,
                       unsigned char **data, LocationRequest *lrq)
 {
@@ -1558,20 +1565,20 @@ static int process_lrq(struct sk_buff **pskb, struct nf_conn *ct,
 
        set_ras_addr = rcu_dereference(set_ras_addr_hook);
        if (set_ras_addr && ct->status & IPS_NAT_MASK)
-               return set_ras_addr(pskb, ct, ctinfo, data,
+               return set_ras_addr(skb, ct, ctinfo, data,
                                    &lrq->replyAddress, 1);
        return 0;
 }
 
 /****************************************************************************/
-static int process_lcf(struct sk_buff **pskb, struct nf_conn *ct,
+static int process_lcf(struct sk_buff *skb, struct nf_conn *ct,
                       enum ip_conntrack_info ctinfo,
                       unsigned char **data, LocationConfirm *lcf)
 {
        int dir = CTINFO2DIR(ctinfo);
        int ret = 0;
        __be16 port;
-       union nf_conntrack_address addr;
+       union nf_inet_addr addr;
        struct nf_conntrack_expect *exp;
 
        pr_debug("nf_ct_ras: LCF\n");
@@ -1603,7 +1610,7 @@ static int process_lcf(struct sk_buff **pskb, struct nf_conn *ct,
 }
 
 /****************************************************************************/
-static int process_irr(struct sk_buff **pskb, struct nf_conn *ct,
+static int process_irr(struct sk_buff *skb, struct nf_conn *ct,
                       enum ip_conntrack_info ctinfo,
                       unsigned char **data, InfoRequestResponse *irr)
 {
@@ -1615,7 +1622,7 @@ static int process_irr(struct sk_buff **pskb, struct nf_conn *ct,
 
        set_ras_addr = rcu_dereference(set_ras_addr_hook);
        if (set_ras_addr && ct->status & IPS_NAT_MASK) {
-               ret = set_ras_addr(pskb, ct, ctinfo, data,
+               ret = set_ras_addr(skb, ct, ctinfo, data,
                                   &irr->rasAddress, 1);
                if (ret < 0)
                        return -1;
@@ -1623,7 +1630,7 @@ static int process_irr(struct sk_buff **pskb, struct nf_conn *ct,
 
        set_sig_addr = rcu_dereference(set_sig_addr_hook);
        if (set_sig_addr && ct->status & IPS_NAT_MASK) {
-               ret = set_sig_addr(pskb, ct, ctinfo, data,
+               ret = set_sig_addr(skb, ct, ctinfo, data,
                                        irr->callSignalAddress.item,
                                        irr->callSignalAddress.count);
                if (ret < 0)
@@ -1634,40 +1641,40 @@ static int process_irr(struct sk_buff **pskb, struct nf_conn *ct,
 }
 
 /****************************************************************************/
-static int process_ras(struct sk_buff **pskb, struct nf_conn *ct,
+static int process_ras(struct sk_buff *skb, struct nf_conn *ct,
                       enum ip_conntrack_info ctinfo,
                       unsigned char **data, RasMessage *ras)
 {
        switch (ras->choice) {
        case eRasMessage_gatekeeperRequest:
-               return process_grq(pskb, ct, ctinfo, data,
+               return process_grq(skb, ct, ctinfo, data,
                                   &ras->gatekeeperRequest);
        case eRasMessage_gatekeeperConfirm:
-               return process_gcf(pskb, ct, ctinfo, data,
+               return process_gcf(skb, ct, ctinfo, data,
                                   &ras->gatekeeperConfirm);
        case eRasMessage_registrationRequest:
-               return process_rrq(pskb, ct, ctinfo, data,
+               return process_rrq(skb, ct, ctinfo, data,
                                   &ras->registrationRequest);
        case eRasMessage_registrationConfirm:
-               return process_rcf(pskb, ct, ctinfo, data,
+               return process_rcf(skb, ct, ctinfo, data,
                                   &ras->registrationConfirm);
        case eRasMessage_unregistrationRequest:
-               return process_urq(pskb, ct, ctinfo, data,
+               return process_urq(skb, ct, ctinfo, data,
                                   &ras->unregistrationRequest);
        case eRasMessage_admissionRequest:
-               return process_arq(pskb, ct, ctinfo, data,
+               return process_arq(skb, ct, ctinfo, data,
                                   &ras->admissionRequest);
        case eRasMessage_admissionConfirm:
-               return process_acf(pskb, ct, ctinfo, data,
+               return process_acf(skb, ct, ctinfo, data,
                                   &ras->admissionConfirm);
        case eRasMessage_locationRequest:
-               return process_lrq(pskb, ct, ctinfo, data,
+               return process_lrq(skb, ct, ctinfo, data,
                                   &ras->locationRequest);
        case eRasMessage_locationConfirm:
-               return process_lcf(pskb, ct, ctinfo, data,
+               return process_lcf(skb, ct, ctinfo, data,
                                   &ras->locationConfirm);
        case eRasMessage_infoRequestResponse:
-               return process_irr(pskb, ct, ctinfo, data,
+               return process_irr(skb, ct, ctinfo, data,
                                   &ras->infoRequestResponse);
        default:
                pr_debug("nf_ct_ras: RAS message %d\n", ras->choice);
@@ -1678,7 +1685,7 @@ static int process_ras(struct sk_buff **pskb, struct nf_conn *ct,
 }
 
 /****************************************************************************/
-static int ras_help(struct sk_buff **pskb, unsigned int protoff,
+static int ras_help(struct sk_buff *skb, unsigned int protoff,
                    struct nf_conn *ct, enum ip_conntrack_info ctinfo)
 {
        static RasMessage ras;
@@ -1686,12 +1693,12 @@ static int ras_help(struct sk_buff **pskb, unsigned int protoff,
        int datalen = 0;
        int ret;
 
-       pr_debug("nf_ct_ras: skblen = %u\n", (*pskb)->len);
+       pr_debug("nf_ct_ras: skblen = %u\n", skb->len);
 
        spin_lock_bh(&nf_h323_lock);
 
        /* Get UDP data */
-       data = get_udp_data(pskb, protoff, &datalen);
+       data = get_udp_data(skb, protoff, &datalen);
        if (data == NULL)
                goto accept;
        pr_debug("nf_ct_ras: RAS message len=%d ", datalen);
@@ -1707,7 +1714,7 @@ static int ras_help(struct sk_buff **pskb, unsigned int protoff,
        }
 
        /* Process RAS message */
-       if (process_ras(pskb, ct, ctinfo, &data, &ras) < 0)
+       if (process_ras(skb, ct, ctinfo, &data, &ras) < 0)
                goto drop;
 
       accept:
@@ -1752,6 +1759,7 @@ static void __exit nf_conntrack_h323_fini(void)
        nf_conntrack_helper_unregister(&nf_conntrack_helper_ras[0]);
        nf_conntrack_helper_unregister(&nf_conntrack_helper_q931[1]);
        nf_conntrack_helper_unregister(&nf_conntrack_helper_q931[0]);
+       nf_conntrack_helper_unregister(&nf_conntrack_helper_h245);
        kfree(h323_buffer);
        pr_debug("nf_ct_h323: fini\n");
 }
@@ -1764,27 +1772,32 @@ static int __init nf_conntrack_h323_init(void)
        h323_buffer = kmalloc(65536, GFP_KERNEL);
        if (!h323_buffer)
                return -ENOMEM;
-       ret = nf_conntrack_helper_register(&nf_conntrack_helper_q931[0]);
+       ret = nf_conntrack_helper_register(&nf_conntrack_helper_h245);
        if (ret < 0)
                goto err1;
-       ret = nf_conntrack_helper_register(&nf_conntrack_helper_q931[1]);
+       ret = nf_conntrack_helper_register(&nf_conntrack_helper_q931[0]);
        if (ret < 0)
                goto err2;
-       ret = nf_conntrack_helper_register(&nf_conntrack_helper_ras[0]);
+       ret = nf_conntrack_helper_register(&nf_conntrack_helper_q931[1]);
        if (ret < 0)
                goto err3;
-       ret = nf_conntrack_helper_register(&nf_conntrack_helper_ras[1]);
+       ret = nf_conntrack_helper_register(&nf_conntrack_helper_ras[0]);
        if (ret < 0)
                goto err4;
+       ret = nf_conntrack_helper_register(&nf_conntrack_helper_ras[1]);
+       if (ret < 0)
+               goto err5;
        pr_debug("nf_ct_h323: init success\n");
        return 0;
 
-err4:
+err5:
        nf_conntrack_helper_unregister(&nf_conntrack_helper_ras[0]);
-err3:
+err4:
        nf_conntrack_helper_unregister(&nf_conntrack_helper_q931[1]);
-err2:
+err3:
        nf_conntrack_helper_unregister(&nf_conntrack_helper_q931[0]);
+err2:
+       nf_conntrack_helper_unregister(&nf_conntrack_helper_h245);
 err1:
        return ret;
 }