[ovs-dev] [PATCH 5/5] dpif-netdev: Use ofproto_flow_lookup() callback

Pravin pshelar at nicira.com
Thu Mar 27 16:44:39 UTC 2014


dpif-netdev queue packet to upcall handler thread to process
flow misses.  This adds latency for initial flow setup.
Using ofproto flow lookup method for netdev flow-table miss
can be handled in same thread.

Signed-off-by: Pravin B Shelar <pshelar at nicira.com>
---
 lib/dpif-netdev.c |   50 ++++++++++++++++++++++++++++++++++++++++----------
 1 file changed, 40 insertions(+), 10 deletions(-)

diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
index 7b921b1..5057833 100644
--- a/lib/dpif-netdev.c
+++ b/lib/dpif-netdev.c
@@ -350,10 +350,6 @@ static void dp_netdev_destroy_all_queues(struct dp_netdev *dp)
     OVS_REQ_WRLOCK(dp->queue_rwlock);
 static int dpif_netdev_open(const struct dpif_class *, const char *name,
                             bool create, void *handle_miss_data, struct dpif **);
-static int dp_netdev_output_userspace(struct dp_netdev *dp, struct ofpbuf *,
-                                      int queue_no, int type,
-                                      const struct flow *,
-                                      const struct nlattr *userdata);
 static void dp_netdev_execute_actions(struct dp_netdev *dp,
                                       const struct flow *, struct ofpbuf *, bool may_steal,
                                       struct pkt_metadata *,
@@ -1980,6 +1976,44 @@ dp_netdev_count_packet(struct dp_netdev *dp, enum dp_stat_type type)
 }
 
 static void
+dp_handle_miss(struct dp_netdev *dp, struct pkt_metadata *md,
+               struct ofpbuf *packet, struct flow *key)
+{
+    struct dp_netdev_flow *netdev_flow;
+    struct flow_wildcards wc;
+    struct ofpbuf actions;
+    uint64_t buf[4096 / 8];
+    int err;
+
+    dp_netdev_count_packet(dp, DP_STAT_MISS);
+    ofpbuf_use_stack(&actions, buf, 4096);
+
+    err = -EINVAL;
+    if (dp->handle_miss_data) {
+        struct flow pkt_key = *key;
+
+        err = fn_ofproto_flow_lookup(dp->handle_miss_data, packet,
+                                     &pkt_key, &wc, &actions);
+    }
+    if (err) {
+        ofpbuf_delete(packet);
+        return;
+    }
+
+    ovs_mutex_lock(&dp->flow_mutex);
+    netdev_flow = dp_netdev_lookup_flow(dp, key);
+    if (!netdev_flow) {
+        if (hmap_count(&dp->flow_table) < MAX_FLOWS) {
+            dp_netdev_flow_add(dp, key, &wc, actions.data, actions.size);
+        }
+    }
+    ovs_mutex_unlock(&dp->flow_mutex);
+
+    dp_netdev_execute_actions(dp, key, packet, true, md,
+                              actions.data, actions.size);
+}
+
+static void
 dp_netdev_port_input(struct dp_netdev *dp, struct ofpbuf *packet,
                      struct pkt_metadata *md)
 {
@@ -2001,12 +2035,8 @@ dp_netdev_port_input(struct dp_netdev *dp, struct ofpbuf *packet,
         dp_netdev_execute_actions(dp, &key, packet, true, md,
                                   actions->actions, actions->size);
         dp_netdev_count_packet(dp, DP_STAT_HIT);
-    } else if (dp->handler_queues) {
-        dp_netdev_count_packet(dp, DP_STAT_MISS);
-        dp_netdev_output_userspace(dp, packet,
-                                   flow_hash_5tuple(&key, 0) % dp->n_handlers,
-                                   DPIF_UC_MISS, &key, NULL);
-        ofpbuf_delete(packet);
+    } else {
+        dp_handle_miss(dp, md, packet, &key);
     }
 }
 
-- 
1.7.9.5




More information about the dev mailing list