[ovs-dev] [RFC: add openvswitch actions using BPF 8/9] ofproto-dpif: Add datapath eBPF support detection

Andy Zhou azhou at nicira.com
Wed Feb 4 22:49:22 UTC 2015


First cut in added datpath eBPF support detector. This feature has not
been fully developed. The stub implementation simply assumes the
datpath support eBPF.

Signed-off-by: Andy Zhou <azhou at nicira.com>

----
Current interface only support 'yes' or 'no' detection. Should we
consider 'support level'?
---
 ofproto/ofproto-dpif.c | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c
index b909fd9..4bcd034 100644
--- a/ofproto/ofproto-dpif.c
+++ b/ofproto/ofproto-dpif.c
@@ -58,6 +58,7 @@
 #include "ofproto-dpif-sflow.h"
 #include "ofproto-dpif-upcall.h"
 #include "ofproto-dpif-xlate.h"
+#include "ofproto-dpif-bpf.h"
 #include "poll-loop.h"
 #include "ovs-rcu.h"
 #include "ovs-router.h"
@@ -293,6 +294,9 @@ struct dpif_backer {
      * actions. */
     bool masked_set_action;
 
+    /* True if the datapath supports bpf actions */
+    bool enable_bpf_action;
+
     /* Maximum number of MPLS label stack entries that the datapath supports
      * in a match */
     size_t max_mpls_depth;
@@ -909,6 +913,7 @@ static bool check_variable_length_userdata(struct dpif_backer *backer);
 static size_t check_max_mpls_depth(struct dpif_backer *backer);
 static bool check_recirc(struct dpif_backer *backer);
 static bool check_ufid(struct dpif_backer *backer);
+static bool check_bpf_actions(struct dpif_backer *backer);
 static bool check_masked_set_action(struct dpif_backer *backer);
 
 static int
@@ -1007,6 +1012,7 @@ open_dpif_backer(const char *type, struct dpif_backer **backerp)
     backer->max_mpls_depth = check_max_mpls_depth(backer);
     backer->masked_set_action = check_masked_set_action(backer);
     backer->enable_ufid = check_ufid(backer);
+    backer->enable_bpf_action = check_bpf_actions(backer);
     backer->rid_pool = recirc_id_pool_create();
     ovs_mutex_init(&backer->recirc_mutex);
     cmap_init(&backer->recirc_map);
@@ -1032,6 +1038,9 @@ open_dpif_backer(const char *type, struct dpif_backer **backerp)
     backer->variable_length_userdata = check_variable_length_userdata(backer);
     backer->dp_version_string = dpif_get_dp_version(backer->dpif);
 
+    /* Load eBPF actions if datapath supports it.  */
+    error = ofproto_dpif_bpf_init(backer->enable_bpf_action);
+
     return error;
 }
 
@@ -1110,7 +1119,19 @@ check_ufid(struct dpif_backer *backer)
     return enable_ufid;
 }
 
+/* Tests whether 'dpif' supports eBPF base flow actions.
+ *
+ * Returns true if 'dpif' supports eBPF based actions.
+ */
+static bool
+check_bpf_actions( struct dpif_backer *backer OVS_UNUSED)
+{
+    /* XXX */
+    return true;
+}
+
 /* Tests whether 'backer''s datapath supports variable-length
+ *
  * OVS_USERSPACE_ATTR_USERDATA in OVS_ACTION_ATTR_USERSPACE actions.  We need
  * to disable some features on older datapaths that don't support this
  * feature.
-- 
1.9.1




More information about the dev mailing list