summaryrefslogtreecommitdiff
path: root/ofproto
diff options
context:
space:
mode:
authorJarno Rajahalme <jarno@ovn.org>2016-08-31 08:43:48 -0700
committerJarno Rajahalme <jarno@ovn.org>2016-08-31 08:43:48 -0700
commit128684a6613a4f97c12a35b686c658c189238bfa (patch)
tree05a70572e75d7f62197aba3e99aefc2b6fe7b7a0 /ofproto
parentdfe191d5faa60d34a64e3bd1040fd6fa02b4889c (diff)
downloadopenvswitch-128684a6613a4f97c12a35b686c658c189238bfa.tar.gz
ofp-actions: Waste less memory in set field and load actions.
Change the value and mask to be added to the end of the set field action without any extra bytes, exept for the usual ofp-actions padding to 8 bytes. Together with some structure member packing this saves on average about to 256 bytes for each set field and load action (as set field internal representation is also used for load actions). On a specific production data set each flow entry uses on average about 4.2 load or set field actions. This means that with this patch an average of more than 1kb can be saved for each flow with such a flow table. Signed-off-by: Jarno Rajahalme <jarno@ovn.org> Acked-by: Ben Pfaff <blp@ovn.org>
Diffstat (limited to 'ofproto')
-rw-r--r--ofproto/ofproto-dpif-xlate.c14
1 files changed, 6 insertions, 8 deletions
diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c
index 893c0335e..1e2957c83 100644
--- a/ofproto/ofproto-dpif-xlate.c
+++ b/ofproto/ofproto-dpif-xlate.c
@@ -4924,9 +4924,10 @@ do_xlate_actions(const struct ofpact *ofpacts, size_t ofpacts_len,
/* Set the field only if the packet actually has it. */
if (mf_are_prereqs_ok(mf, flow, wc)) {
- mf_mask_field_masked(mf, &set_field->mask, wc);
- mf_set_flow_value_masked(mf, &set_field->value,
- &set_field->mask, flow);
+ mf_mask_field_masked(mf, ofpact_set_field_mask(set_field), wc);
+ mf_set_flow_value_masked(mf, set_field->value,
+ ofpact_set_field_mask(set_field),
+ flow);
}
break;
@@ -5754,11 +5755,8 @@ xlate_send_packet(const struct ofport_dpif *ofport, bool oam,
}
if (oam) {
- struct ofpact_set_field *sf = ofpact_put_SET_FIELD(&ofpacts);
-
- sf->field = mf_from_id(MFF_TUN_FLAGS);
- sf->value.be16 = htons(NX_TUN_FLAG_OAM);
- sf->mask.be16 = htons(NX_TUN_FLAG_OAM);
+ const ovs_be16 oam = htons(NX_TUN_FLAG_OAM);
+ ofpact_put_set_field(&ofpacts, mf_from_id(MFF_TUN_FLAGS), &oam, &oam);
}
ofpact_put_OUTPUT(&ofpacts)->port = xport->ofp_port;