summaryrefslogtreecommitdiff
path: root/lib/dpif.h
diff options
context:
space:
mode:
authorBen Pfaff <blp@nicira.com>2010-08-04 14:08:26 -0700
committerBen Pfaff <blp@nicira.com>2010-08-27 10:10:23 -0700
commit9dbb9d5e94d1db5a0fb5cb3867c26d7c3d07d0c4 (patch)
treed1554eccb64ba2442ec26371b1425a57e1af8276 /lib/dpif.h
parent3a46ca6e46d32a2bc898ff7238f8276db952c050 (diff)
downloadopenvswitch-9dbb9d5e94d1db5a0fb5cb3867c26d7c3d07d0c4.tar.gz
ofproto: Avoid user->kernel->user round-trip for many controller actions.
When an OpenFlow flow says to send packets to the controller, until now ofproto has executed that using dpif_execute(), which passes the packet up to the kernel. The kernel queues the packet into its "action" queue, and then later ofproto pulls the packet back down from the kernel and sends it to the controller. However, this is unnecessary. Open vSwitch can just recognize in advance that it will get the packet back and handle it directly, skipping the round trip. This commit implements this optimization. This generally affects only the first packet in a flow, since generally the rest come directly down from the kernel. It only optimizes the "easy" case where the first action in a flow is to send the packet to the controller, since this seems to be the common case in the flows that I'm looking at now.
Diffstat (limited to 'lib/dpif.h')
-rw-r--r--lib/dpif.h12
1 files changed, 11 insertions, 1 deletions
diff --git a/lib/dpif.h b/lib/dpif.h
index a63972545..1496c227f 100644
--- a/lib/dpif.h
+++ b/lib/dpif.h
@@ -18,10 +18,12 @@
#ifndef DPIF_H
#define DPIF_H 1
-#include "openvswitch/datapath-protocol.h"
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
+#include "openflow/openflow.h"
+#include "openvswitch/datapath-protocol.h"
+#include "util.h"
#ifdef __cplusplus
extern "C" {
@@ -90,6 +92,14 @@ int dpif_execute(struct dpif *, uint16_t in_port,
const union odp_action[], size_t n_actions,
const struct ofpbuf *);
+/* Minimum number of bytes of headroom for a packet returned by dpif_recv()
+ * member function. This headroom allows "struct odp_msg" to be replaced by
+ * "struct ofp_packet_in" without copying the buffer. */
+#define DPIF_RECV_MSG_PADDING (sizeof(struct ofp_packet_in) \
+ - sizeof(struct odp_msg))
+BUILD_ASSERT_DECL(sizeof(struct ofp_packet_in) > sizeof(struct odp_msg));
+BUILD_ASSERT_DECL(DPIF_RECV_MSG_PADDING % 4 == 0);
+
int dpif_recv_get_mask(const struct dpif *, int *listen_mask);
int dpif_recv_set_mask(struct dpif *, int listen_mask);
int dpif_get_sflow_probability(const struct dpif *, uint32_t *probability);