aboutsummaryrefslogtreecommitdiff
path: root/ofproto
diff options
context:
space:
mode:
authorEthan Jackson <ethan@nicira.com>2013-02-16 12:07:18 -0800
committerEthan Jackson <ethan@nicira.com>2013-02-16 16:22:22 -0800
commitce680be7f7315dcfb29b1dc82c21bcb74efd47c1 (patch)
tree58cd78019d7bfd17ab58aa9a1a7b54a99fe1a6c2 /ofproto
parent5a7e6ad73e369739c4267ed7cda2443a93c4d6a1 (diff)
ofproto-dpif: Receive special packets on patch ports.
Commit 0a740f48293 (ofproto-dpif: Implement patch ports in userspace.) allowed special packets (i.e. LACP, CFM, etc) to be sent on patch ports, but not received. This patch implements the logic required to receive special packets on patch ports. Bug #15154. Signed-off-by: Ethan Jackson <ethan@nicira.com>
Diffstat (limited to 'ofproto')
-rw-r--r--ofproto/ofproto-dpif.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c
index 19b0827f..6261df54 100644
--- a/ofproto/ofproto-dpif.c
+++ b/ofproto/ofproto-dpif.c
@@ -5732,6 +5732,7 @@ compose_output_action__(struct action_xlate_ctx *ctx, uint16_t ofp_port,
struct ofport_dpif *peer = ofport_get_peer(ofport);
struct flow old_flow = ctx->flow;
const struct ofproto_dpif *peer_ofproto;
+ enum slow_path_reason special;
struct ofport_dpif *in_port;
if (!peer) {
@@ -5752,7 +5753,11 @@ compose_output_action__(struct action_xlate_ctx *ctx, uint16_t ofp_port,
memset(ctx->flow.regs, 0, sizeof ctx->flow.regs);
in_port = get_ofp_port(ctx->ofproto, ctx->flow.in_port);
- if (!in_port || may_receive(in_port, ctx)) {
+ special = process_special(ctx->ofproto, &ctx->flow, in_port,
+ ctx->packet);
+ if (special) {
+ ctx->slow |= special;
+ } else if (!in_port || may_receive(in_port, ctx)) {
if (!in_port || stp_forward_in_state(in_port->stp_state)) {
xlate_table_action(ctx, ctx->flow.in_port, 0, true);
} else {