summaryrefslogtreecommitdiff
path: root/datapath
diff options
context:
space:
mode:
authorJarno Rajahalme <jarno@ovn.org>2017-04-10 18:18:30 -0700
committerJarno Rajahalme <jarno@ovn.org>2017-04-11 09:39:53 -0700
commit280337736851db0358511ee211d02dc0975aad1a (patch)
tree827178b23ea0115890a52b36f1faa99d62a95f22 /datapath
parent2f2b904f9e28afaff3dfb7adaa62b96c0d144ace (diff)
downloadopenvswitch-280337736851db0358511ee211d02dc0975aad1a.tar.gz
datapath: Avoid struct copy on conntrack labels.
Older kernels have variable sized labels, and the struct itself contains only the length, so we must memcpy the bits explicitly. The modified system test fails on older kernels without this change. VMware-BZ: #1841876 Fixes: 09aa98ad496d ("datapath: Inherit master's labels.") Signed-off-by: Jarno Rajahalme <jarno@ovn.org> Acked-by: Andy Zhou <azhou@ovn.org>
Diffstat (limited to 'datapath')
-rw-r--r--datapath/conntrack.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/datapath/conntrack.c b/datapath/conntrack.c
index 4df73528b..47f1a9938 100644
--- a/datapath/conntrack.c
+++ b/datapath/conntrack.c
@@ -365,9 +365,12 @@ static int ovs_ct_init_labels(struct nf_conn *ct, struct sw_flow_key *key,
if (!cl)
return -ENOSPC;
- /* Inherit the master's labels, if any. */
+ /* Inherit the master's labels, if any. Must use memcpy for backport
+ * as struct assignment only copies the length field in older
+ * kernels.
+ */
if (master_cl)
- *cl = *master_cl;
+ memcpy(cl->bits, master_cl->bits, OVS_CT_LABELS_LEN);
if (have_mask) {
u32 *dst = (u32 *)cl->bits;