[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