[ovs-dev] [optimize 11/13] ofproto-dpif: Factor controller optimization out of execute_odp_actions().
Ben Pfaff
blp at nicira.com
Tue Sep 27 23:27:06 UTC 2011
An upcoming commit will use this code separately from
execute_odp_actions(), so this prepares for that.
---
ofproto/ofproto-dpif.c | 53 +++++++++++++++++++++++++++++++----------------
1 files changed, 35 insertions(+), 18 deletions(-)
diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c
index fb870be..7d7d6af 100644
--- a/ofproto/ofproto-dpif.c
+++ b/ofproto/ofproto-dpif.c
@@ -263,6 +263,11 @@ static struct facet *facet_lookup_valid(struct ofproto_dpif *,
const struct flow *);
static bool facet_revalidate(struct ofproto_dpif *, struct facet *);
+static bool execute_controller_action(struct ofproto_dpif *,
+ const struct flow *,
+ const struct nlattr *odp_actions,
+ size_t actions_len,
+ struct ofpbuf *packet);
static void facet_execute(struct ofproto_dpif *, struct facet *,
struct ofpbuf *packet);
@@ -2184,14 +2189,11 @@ facet_free(struct facet *facet)
free(facet);
}
-/* Executes, within 'ofproto', the 'n_actions' actions in 'actions' on
- * 'packet', which arrived on 'in_port'.
- *
- * Takes ownership of 'packet'. */
static bool
-execute_odp_actions(struct ofproto_dpif *ofproto, const struct flow *flow,
- const struct nlattr *odp_actions, size_t actions_len,
- struct ofpbuf *packet)
+execute_controller_action(struct ofproto_dpif *ofproto,
+ const struct flow *flow,
+ const struct nlattr *odp_actions, size_t actions_len,
+ struct ofpbuf *packet)
{
if (actions_len == NLA_ALIGN(NLA_HDRLEN + sizeof(uint64_t))
&& odp_actions->nla_type == OVS_ACTION_ATTR_USERSPACE) {
@@ -2200,22 +2202,37 @@ execute_odp_actions(struct ofproto_dpif *ofproto, const struct flow *flow,
* buffers along the way. */
send_packet_in_action(ofproto, packet, nl_attr_get_u64(odp_actions),
flow, false);
-
return true;
} else {
- struct odputil_keybuf keybuf;
- struct ofpbuf key;
- int error;
-
- ofpbuf_use_stack(&key, &keybuf, sizeof keybuf);
- odp_flow_key_from_flow(&key, flow);
+ return false;
+ }
+}
- error = dpif_execute(ofproto->dpif, key.data, key.size,
- odp_actions, actions_len, packet);
+/* Executes, within 'ofproto', the 'n_actions' actions in 'actions' on
+ * 'packet', which arrived on 'in_port'.
+ *
+ * Takes ownership of 'packet'. */
+static bool
+execute_odp_actions(struct ofproto_dpif *ofproto, const struct flow *flow,
+ const struct nlattr *odp_actions, size_t actions_len,
+ struct ofpbuf *packet)
+{
+ struct odputil_keybuf keybuf;
+ struct ofpbuf key;
+ int error;
- ofpbuf_delete(packet);
- return !error;
+ if (execute_controller_action(ofproto, flow, odp_actions, actions_len,
+ packet)) {
+ return true;
}
+
+ ofpbuf_use_stack(&key, &keybuf, sizeof keybuf);
+ odp_flow_key_from_flow(&key, flow);
+ error = dpif_execute(ofproto->dpif, key.data, key.size,
+ odp_actions, actions_len, packet);
+ ofpbuf_delete(packet);
+
+ return !error;
}
/* Executes the actions indicated by 'facet' on 'packet' and credits 'facet''s
--
1.7.4.4
More information about the dev
mailing list