aboutsummaryrefslogtreecommitdiffstats
path: root/net/openvswitch
diff options
context:
space:
mode:
authorFlorian Westphal <fw@strlen.de>2016-07-21 06:51:16 -0400
committerPablo Neira Ayuso <pablo@netfilter.org>2016-07-22 11:04:55 -0400
commit23014011ba4209a086931ff402eac1c41abbe456 (patch)
treeec71c09d3666e89f6502c161e607d00c93dd2d45 /net/openvswitch
parent6e1f760e13c75eb0c21c75c6eed918e25b54cd07 (diff)
netfilter: conntrack: support a fixed size of 128 distinct labels
The conntrack label extension is currently variable-sized, e.g. if only 2 labels are used by iptables rules then the labels->bits[] array will only contain one element. We track size of each label storage area in the 'words' member. But in nftables and openvswitch we always have to ask for worst-case since we don't know what bit will be used at configuration time. As most arches are 64bit we need to allocate 24 bytes in this case: struct nf_conn_labels { u8 words; /* 0 1 */ /* XXX 7 bytes hole, try to pack */ long unsigned bits[2]; /* 8 24 */ Make bits a fixed size and drop the words member, it simplifies the code and only increases memory requirements on x86 when less than 64bit labels are required. We still only allocate the extension if its needed. Signed-off-by: Florian Westphal <fw@strlen.de> Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'net/openvswitch')
-rw-r--r--net/openvswitch/conntrack.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/net/openvswitch/conntrack.c b/net/openvswitch/conntrack.c
index b4069a90e375..c644c78ed485 100644
--- a/net/openvswitch/conntrack.c
+++ b/net/openvswitch/conntrack.c
@@ -135,7 +135,7 @@ static void ovs_ct_get_labels(const struct nf_conn *ct,
135 struct nf_conn_labels *cl = ct ? nf_ct_labels_find(ct) : NULL; 135 struct nf_conn_labels *cl = ct ? nf_ct_labels_find(ct) : NULL;
136 136
137 if (cl) { 137 if (cl) {
138 size_t len = cl->words * sizeof(long); 138 size_t len = sizeof(cl->bits);
139 139
140 if (len > OVS_CT_LABELS_LEN) 140 if (len > OVS_CT_LABELS_LEN)
141 len = OVS_CT_LABELS_LEN; 141 len = OVS_CT_LABELS_LEN;
@@ -274,7 +274,7 @@ static int ovs_ct_set_labels(struct sk_buff *skb, struct sw_flow_key *key,
274 nf_ct_labels_ext_add(ct); 274 nf_ct_labels_ext_add(ct);
275 cl = nf_ct_labels_find(ct); 275 cl = nf_ct_labels_find(ct);
276 } 276 }
277 if (!cl || cl->words * sizeof(long) < OVS_CT_LABELS_LEN) 277 if (!cl || sizeof(cl->bits) < OVS_CT_LABELS_LEN)
278 return -ENOSPC; 278 return -ENOSPC;
279 279
280 err = nf_connlabels_replace(ct, (u32 *)labels, (u32 *)mask, 280 err = nf_connlabels_replace(ct, (u32 *)labels, (u32 *)mask,