extern struct nf_conntrack_l3proto __rcu *nf_ct_l3protos[NFPROTO_NUMPROTO];
 
 /* Protocol global registration. */
-int nf_ct_l3proto_register(struct nf_conntrack_l3proto *proto);
-void nf_ct_l3proto_unregister(struct nf_conntrack_l3proto *proto);
+int nf_ct_l3proto_register(const struct nf_conntrack_l3proto *proto);
+void nf_ct_l3proto_unregister(const struct nf_conntrack_l3proto *proto);
 
-struct nf_conntrack_l3proto *nf_ct_l3proto_find_get(u_int16_t l3proto);
+const struct nf_conntrack_l3proto *nf_ct_l3proto_find_get(u_int16_t l3proto);
 
 /* Existing built-in protocols */
 extern struct nf_conntrack_l3proto nf_conntrack_l3proto_generic;
 
 
 #define MAX_NF_CT_PROTO 256
 
-struct nf_conntrack_l4proto *__nf_ct_l4proto_find(u_int16_t l3proto,
+const struct nf_conntrack_l4proto *__nf_ct_l4proto_find(u_int16_t l3proto,
                                                  u_int8_t l4proto);
 
-struct nf_conntrack_l4proto *nf_ct_l4proto_find_get(u_int16_t l3proto,
+const struct nf_conntrack_l4proto *nf_ct_l4proto_find_get(u_int16_t l3proto,
                                                    u_int8_t l4proto);
 void nf_ct_l4proto_put(const struct nf_conntrack_l4proto *p);
 
 
        refcount_t              refcnt;
        char                    name[CTNL_TIMEOUT_NAME_MAX];
        __u16                   l3num;
-       struct nf_conntrack_l4proto *l4proto;
+       const struct nf_conntrack_l4proto *l4proto;
        char                    data[0];
 };
 
 
                       u_int16_t l3num,
                       struct net *net, struct nf_conntrack_tuple *tuple)
 {
-       struct nf_conntrack_l3proto *l3proto;
-       struct nf_conntrack_l4proto *l4proto;
+       const struct nf_conntrack_l3proto *l3proto;
+       const struct nf_conntrack_l4proto *l4proto;
        unsigned int protoff;
        u_int8_t protonum;
        int ret;
 destroy_conntrack(struct nf_conntrack *nfct)
 {
        struct nf_conn *ct = (struct nf_conn *)nfct;
-       struct nf_conntrack_l4proto *l4proto;
+       const struct nf_conntrack_l4proto *l4proto;
 
        pr_debug("destroy_conntrack(%p)\n", ct);
        NF_CT_ASSERT(atomic_read(&nfct->use) == 0);
 {
        /* This is the conntrack entry already in hashes that won race. */
        struct nf_conn *ct = nf_ct_tuplehash_to_ctrack(h);
-       struct nf_conntrack_l4proto *l4proto;
+       const struct nf_conntrack_l4proto *l4proto;
 
        l4proto = __nf_ct_l4proto_find(nf_ct_l3num(ct), nf_ct_protonum(ct));
        if (l4proto->allow_clash &&
 nf_conntrack_in(struct net *net, u_int8_t pf, unsigned int hooknum,
                struct sk_buff *skb)
 {
+       const struct nf_conntrack_l3proto *l3proto;
+       const struct nf_conntrack_l4proto *l4proto;
        struct nf_conn *ct, *tmpl;
        enum ip_conntrack_info ctinfo;
-       struct nf_conntrack_l3proto *l3proto;
-       struct nf_conntrack_l4proto *l4proto;
        unsigned int *timeouts;
        unsigned int dataoff;
        u_int8_t protonum;
 
 static int ctnetlink_dump_tuples(struct sk_buff *skb,
                                 const struct nf_conntrack_tuple *tuple)
 {
+       const struct nf_conntrack_l3proto *l3proto;
+       const struct nf_conntrack_l4proto *l4proto;
        int ret;
-       struct nf_conntrack_l3proto *l3proto;
-       struct nf_conntrack_l4proto *l4proto;
 
        rcu_read_lock();
        l3proto = __nf_ct_l3proto_find(tuple->src.l3num);
 
 static int ctnetlink_dump_protoinfo(struct sk_buff *skb, struct nf_conn *ct)
 {
-       struct nf_conntrack_l4proto *l4proto;
+       const struct nf_conntrack_l4proto *l4proto;
        struct nlattr *nest_proto;
        int ret;
 
 
 static inline size_t ctnetlink_proto_size(const struct nf_conn *ct)
 {
-       struct nf_conntrack_l3proto *l3proto;
-       struct nf_conntrack_l4proto *l4proto;
-       size_t len = 0;
+       const struct nf_conntrack_l3proto *l3proto;
+       const struct nf_conntrack_l4proto *l4proto;
+       size_t len;
 
        l3proto = __nf_ct_l3proto_find(nf_ct_l3num(ct));
        len = l3proto->nla_size;
 static int ctnetlink_parse_tuple_proto(struct nlattr *attr,
                                       struct nf_conntrack_tuple *tuple)
 {
+       const struct nf_conntrack_l4proto *l4proto;
        struct nlattr *tb[CTA_PROTO_MAX+1];
-       struct nf_conntrack_l4proto *l4proto;
        int ret = 0;
 
        ret = nla_parse_nested(tb, CTA_PROTO_MAX, attr, proto_nla_policy,
                                      const struct nlattr * const cda[])
 {
        const struct nlattr *attr = cda[CTA_PROTOINFO];
+       const struct nf_conntrack_l4proto *l4proto;
        struct nlattr *tb[CTA_PROTOINFO_MAX+1];
-       struct nf_conntrack_l4proto *l4proto;
        int err = 0;
 
        err = nla_parse_nested(tb, CTA_PROTOINFO_MAX, attr, protoinfo_policy,
                                   const struct nf_conntrack_tuple *tuple,
                                   const struct nf_conntrack_tuple_mask *mask)
 {
-       int ret;
-       struct nf_conntrack_l3proto *l3proto;
-       struct nf_conntrack_l4proto *l4proto;
+       const struct nf_conntrack_l3proto *l3proto;
+       const struct nf_conntrack_l4proto *l4proto;
        struct nf_conntrack_tuple m;
        struct nlattr *nest_parms;
+       int ret;
 
        memset(&m, 0xFF, sizeof(m));
        memcpy(&m.src.u3, &mask->src.u3, sizeof(m.src.u3));
 
 }
 #endif
 
-struct nf_conntrack_l4proto *
+const struct nf_conntrack_l4proto *
 __nf_ct_l4proto_find(u_int16_t l3proto, u_int8_t l4proto)
 {
        if (unlikely(l3proto >= NFPROTO_NUMPROTO || nf_ct_protos[l3proto] == NULL))
 
 /* this is guaranteed to always return a valid protocol helper, since
  * it falls back to generic_protocol */
-struct nf_conntrack_l3proto *
+const struct nf_conntrack_l3proto *
 nf_ct_l3proto_find_get(u_int16_t l3proto)
 {
        struct nf_conntrack_l3proto *p;
 int
 nf_ct_l3proto_try_module_get(unsigned short l3proto)
 {
+       const struct nf_conntrack_l3proto *p;
        int ret;
-       struct nf_conntrack_l3proto *p;
 
 retry: p = nf_ct_l3proto_find_get(l3proto);
        if (p == &nf_conntrack_l3proto_generic) {
 }
 EXPORT_SYMBOL_GPL(nf_ct_netns_put);
 
-struct nf_conntrack_l4proto *
+const struct nf_conntrack_l4proto *
 nf_ct_l4proto_find_get(u_int16_t l3num, u_int8_t l4num)
 {
-       struct nf_conntrack_l4proto *p;
+       const struct nf_conntrack_l4proto *p;
 
        rcu_read_lock();
        p = __nf_ct_l4proto_find(l3num, l4num);
 
 static int kill_l3proto(struct nf_conn *i, void *data)
 {
-       return nf_ct_l3num(i) == ((struct nf_conntrack_l3proto *)data)->l3proto;
+       return nf_ct_l3num(i) == ((const struct nf_conntrack_l3proto *)data)->l3proto;
 }
 
 static int kill_l4proto(struct nf_conn *i, void *data)
 {
-       struct nf_conntrack_l4proto *l4proto;
+       const struct nf_conntrack_l4proto *l4proto;
        l4proto = data;
        return nf_ct_protonum(i) == l4proto->l4proto &&
               nf_ct_l3num(i) == l4proto->l3proto;
 }
 
-int nf_ct_l3proto_register(struct nf_conntrack_l3proto *proto)
+int nf_ct_l3proto_register(const struct nf_conntrack_l3proto *proto)
 {
        int ret = 0;
        struct nf_conntrack_l3proto *old;
 }
 EXPORT_SYMBOL_GPL(nf_ct_l3proto_register);
 
-void nf_ct_l3proto_unregister(struct nf_conntrack_l3proto *proto)
+void nf_ct_l3proto_unregister(const struct nf_conntrack_l3proto *proto)
 {
        BUG_ON(proto->l3proto >= NFPROTO_NUMPROTO);
 
 
        synchronize_rcu();
        /* Remove all contrack entries for this protocol */
-       nf_ct_iterate_destroy(kill_l3proto, proto);
+       nf_ct_iterate_destroy(kill_l3proto, (void*)proto);
 }
 EXPORT_SYMBOL_GPL(nf_ct_l3proto_unregister);
 
 
 {
        __u16 l3num;
        __u8 l4num;
-       struct nf_conntrack_l4proto *l4proto;
+       const struct nf_conntrack_l4proto *l4proto;
        struct ctnl_timeout *timeout, *matching = NULL;
        char *name;
        int ret;
        struct nlmsghdr *nlh;
        struct nfgenmsg *nfmsg;
        unsigned int flags = portid ? NLM_F_MULTI : 0;
-       struct nf_conntrack_l4proto *l4proto = timeout->l4proto;
+       const struct nf_conntrack_l4proto *l4proto = timeout->l4proto;
 
        event = nfnl_msg_type(NFNL_SUBSYS_CTNETLINK_TIMEOUT, event);
        nlh = nlmsg_put(skb, portid, seq, event, sizeof(*nfmsg), flags);
                                 const struct nlattr * const cda[],
                                 struct netlink_ext_ack *extack)
 {
+       const struct nf_conntrack_l4proto *l4proto;
+       unsigned int *timeouts;
        __u16 l3num;
        __u8 l4num;
-       struct nf_conntrack_l4proto *l4proto;
-       unsigned int *timeouts;
        int ret;
 
        if (!cda[CTA_TIMEOUT_L3PROTO] ||
                                 const struct nlattr * const cda[],
                                 struct netlink_ext_ack *extack)
 {
-       __u16 l3num;
-       __u8 l4num;
-       struct nf_conntrack_l4proto *l4proto;
+       const struct nf_conntrack_l4proto *l4proto;
        struct sk_buff *skb2;
        int ret, err;
+       __u16 l3num;
+       __u8 l4num;
 
        if (!cda[CTA_TIMEOUT_L3PROTO] || !cda[CTA_TIMEOUT_L4PROTO])
                return -EINVAL;
 
 {
 #ifdef CONFIG_NF_CONNTRACK_TIMEOUT
        typeof(nf_ct_timeout_find_get_hook) timeout_find_get;
+       const struct nf_conntrack_l4proto *l4proto;
        struct ctnl_timeout *timeout;
        struct nf_conn_timeout *timeout_ext;
-       struct nf_conntrack_l4proto *l4proto;
        int ret = 0;
        u8 proto;
 
 
 ovs_ct_find_existing(struct net *net, const struct nf_conntrack_zone *zone,
                     u8 l3num, struct sk_buff *skb, bool natted)
 {
-       struct nf_conntrack_l3proto *l3proto;
-       struct nf_conntrack_l4proto *l4proto;
+       const struct nf_conntrack_l3proto *l3proto;
+       const struct nf_conntrack_l4proto *l4proto;
        struct nf_conntrack_tuple tuple;
        struct nf_conntrack_tuple_hash *h;
        struct nf_conn *ct;