|
@@ -167,6 +167,9 @@ int nf_conntrack_l3proto_register(struct nf_conntrack_l3proto *proto)
|
|
|
if (proto->l3proto >= AF_MAX)
|
|
|
return -EBUSY;
|
|
|
|
|
|
+ if (proto->tuple_to_nlattr && !proto->nlattr_tuple_size)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
mutex_lock(&nf_ct_proto_mutex);
|
|
|
if (nf_ct_l3protos[proto->l3proto] != &nf_conntrack_l3proto_generic) {
|
|
|
ret = -EBUSY;
|
|
@@ -177,6 +180,9 @@ int nf_conntrack_l3proto_register(struct nf_conntrack_l3proto *proto)
|
|
|
if (ret < 0)
|
|
|
goto out_unlock;
|
|
|
|
|
|
+ if (proto->nlattr_tuple_size)
|
|
|
+ proto->nla_size = 3 * proto->nlattr_tuple_size();
|
|
|
+
|
|
|
rcu_assign_pointer(nf_ct_l3protos[proto->l3proto], proto);
|
|
|
|
|
|
out_unlock:
|
|
@@ -263,6 +269,10 @@ int nf_conntrack_l4proto_register(struct nf_conntrack_l4proto *l4proto)
|
|
|
if (l4proto->l3proto >= PF_MAX)
|
|
|
return -EBUSY;
|
|
|
|
|
|
+ if ((l4proto->to_nlattr && !l4proto->nlattr_size)
|
|
|
+ || (l4proto->tuple_to_nlattr && !l4proto->nlattr_tuple_size))
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
mutex_lock(&nf_ct_proto_mutex);
|
|
|
if (!nf_ct_protos[l4proto->l3proto]) {
|
|
|
/* l3proto may be loaded latter. */
|
|
@@ -290,6 +300,12 @@ int nf_conntrack_l4proto_register(struct nf_conntrack_l4proto *l4proto)
|
|
|
if (ret < 0)
|
|
|
goto out_unlock;
|
|
|
|
|
|
+ l4proto->nla_size = 0;
|
|
|
+ if (l4proto->nlattr_size)
|
|
|
+ l4proto->nla_size += l4proto->nlattr_size();
|
|
|
+ if (l4proto->nlattr_tuple_size)
|
|
|
+ l4proto->nla_size += 3 * l4proto->nlattr_tuple_size();
|
|
|
+
|
|
|
rcu_assign_pointer(nf_ct_protos[l4proto->l3proto][l4proto->l4proto],
|
|
|
l4proto);
|
|
|
|