Setting up a miniflow for lookup is faster than a full struct flow.

Signed-off-by: Jarno Rajahalme <jrajaha...@nicira.com>
---
 lib/ovs-router.c |   20 ++++++++++++++------
 1 file changed, 14 insertions(+), 6 deletions(-)

diff --git a/lib/ovs-router.c b/lib/ovs-router.c
index 6b5ba00..5da99ba 100644
--- a/lib/ovs-router.c
+++ b/lib/ovs-router.c
@@ -62,16 +62,24 @@ ovs_router_entry_cast(const struct cls_rule *cr)
     }
 }
 
+static const struct ovs_router_entry *
+ovs_router_lookup__(ovs_be32 ip_dst)
+{
+    struct miniflow mf;
+    struct mf_ctx ctx = MF_CTX_INITIALIZER(mf.inline_values, MINI_N_INLINE);
+
+    miniflow_push_be32(ctx, nw_dst, ip_dst);
+    MF_CTX_FINISH(ctx, &mf);
+
+    return ovs_router_entry_cast(classifier_lookup_miniflow(&cls, &mf));
+}
+
 bool
 ovs_router_lookup(ovs_be32 ip_dst, char output_bridge[], ovs_be32 *gw)
 {
-    const struct cls_rule *cr;
-    struct flow flow = {.nw_dst = ip_dst};
-
-    cr = classifier_lookup(&cls, &flow, NULL);
-    if (cr) {
-        struct ovs_router_entry *p = ovs_router_entry_cast(cr);
+    const struct ovs_router_entry *p = ovs_router_lookup__(ip_dst);
 
+    if (p) {
         strncpy(output_bridge, p->output_bridge, IFNAMSIZ);
         *gw = p->gw;
         return true;
-- 
1.7.10.4

_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to