提交 cb80d58f 编写于 作者: J Jarno Rajahalme 提交者: David S. Miller

openvswitch: Unionize ovs_key_ct_label with a u32 array.

Make the array of labels in struct ovs_key_ct_label an union, adding a
u32 array of the same byte size as the existing u8 array.  It is
faster to loop through the labels 32 bits at the time, which is also
the alignment of netlink attributes.
Signed-off-by: NJarno Rajahalme <jarno@ovn.org>
Acked-by: NJoe Stringer <joe@ovn.org>
Acked-by: NPravin B Shelar <pshelar@ovn.org>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 193e3096
...@@ -446,9 +446,13 @@ struct ovs_key_nd { ...@@ -446,9 +446,13 @@ struct ovs_key_nd {
__u8 nd_tll[ETH_ALEN]; __u8 nd_tll[ETH_ALEN];
}; };
#define OVS_CT_LABELS_LEN 16 #define OVS_CT_LABELS_LEN_32 4
#define OVS_CT_LABELS_LEN (OVS_CT_LABELS_LEN_32 * sizeof(__u32))
struct ovs_key_ct_labels { struct ovs_key_ct_labels {
union {
__u8 ct_labels[OVS_CT_LABELS_LEN]; __u8 ct_labels[OVS_CT_LABELS_LEN];
__u32 ct_labels_32[OVS_CT_LABELS_LEN_32];
};
}; };
/* OVS_KEY_ATTR_CT_STATE flags */ /* OVS_KEY_ATTR_CT_STATE flags */
......
...@@ -281,20 +281,21 @@ static int ovs_ct_set_labels(struct sk_buff *skb, struct sw_flow_key *key, ...@@ -281,20 +281,21 @@ static int ovs_ct_set_labels(struct sk_buff *skb, struct sw_flow_key *key,
/* Triggers a change event, which makes sense only for /* Triggers a change event, which makes sense only for
* confirmed connections. * confirmed connections.
*/ */
int err = nf_connlabels_replace(ct, (u32 *)labels, (u32 *)mask, int err = nf_connlabels_replace(ct, labels->ct_labels_32,
OVS_CT_LABELS_LEN / sizeof(u32)); mask->ct_labels_32,
OVS_CT_LABELS_LEN_32);
if (err) if (err)
return err; return err;
} else { } else {
u32 *dst = (u32 *)cl->bits; u32 *dst = (u32 *)cl->bits;
const u32 *msk = (const u32 *)mask->ct_labels; const u32 *msk = mask->ct_labels_32;
const u32 *lbl = (const u32 *)labels->ct_labels; const u32 *lbl = labels->ct_labels_32;
int i; int i;
/* No-one else has access to the non-confirmed entry, copy /* No-one else has access to the non-confirmed entry, copy
* labels over, keeping any bits we are not explicitly setting. * labels over, keeping any bits we are not explicitly setting.
*/ */
for (i = 0; i < OVS_CT_LABELS_LEN / sizeof(u32); i++) for (i = 0; i < OVS_CT_LABELS_LEN_32; i++)
dst[i] = (dst[i] & ~msk[i]) | (lbl[i] & msk[i]); dst[i] = (dst[i] & ~msk[i]) | (lbl[i] & msk[i]);
} }
...@@ -866,8 +867,8 @@ static bool labels_nonzero(const struct ovs_key_ct_labels *labels) ...@@ -866,8 +867,8 @@ static bool labels_nonzero(const struct ovs_key_ct_labels *labels)
{ {
size_t i; size_t i;
for (i = 0; i < sizeof(*labels); i++) for (i = 0; i < OVS_CT_LABELS_LEN_32; i++)
if (labels->ct_labels[i]) if (labels->ct_labels_32[i])
return true; return true;
return false; return false;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册