This version turned out to be a bit more convenient. Nothing's different except the prototype of force_compose_action().
--- Before this patch, the logic for outputting to a port was scattered all around ofproto-dpif. This patch simplifies the code by forcing it to use one code path to check if a port is forwarding, and output if appropriate. Future patches will rely on this simplification to implement new features. --- ofproto/ofproto-dpif.c | 43 +++++++++++++++++++++++++------------------ 1 files changed, 25 insertions(+), 18 deletions(-) diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c index 15d0883..00e185d 100644 --- a/ofproto/ofproto-dpif.c +++ b/ofproto/ofproto-dpif.c @@ -1229,8 +1229,7 @@ bundle_update(struct ofbundle *bundle) bundle->floodable = true; LIST_FOR_EACH (port, bundle_node, &bundle->ports) { - if (port->up.opp.config & htonl(OFPPC_NO_FLOOD) - || !stp_forward_in_state(port->stp_state)) { + if (port->up.opp.config & htonl(OFPPC_NO_FLOOD)) { bundle->floodable = false; break; } @@ -1277,8 +1276,7 @@ bundle_add_port(struct ofbundle *bundle, uint32_t ofp_port, port->bundle = bundle; list_push_back(&bundle->ports, &port->bundle_node); - if (port->up.opp.config & htonl(OFPPC_NO_FLOOD) - || !stp_forward_in_state(port->stp_state)) { + if (port->up.opp.config & htonl(OFPPC_NO_FLOOD)) { bundle->floodable = false; } } @@ -3769,18 +3767,20 @@ commit_odp_actions(struct action_xlate_ctx *ctx) } static void -compose_output_action(struct action_xlate_ctx *ctx, uint16_t odp_port) +force_compose_output_action(struct action_xlate_ctx *ctx, + struct ofport_dpif *ofport) { + uint16_t odp_port = ofport->odp_port; + nl_msg_put_u32(ctx->odp_actions, OVS_ACTION_ATTR_OUTPUT, odp_port); ctx->sflow_odp_port = odp_port; ctx->sflow_n_outputs++; } static void -add_output_action(struct action_xlate_ctx *ctx, uint16_t ofp_port) +compose_output_action(struct action_xlate_ctx *ctx, uint16_t ofp_port) { - const struct ofport_dpif *ofport = get_ofp_port(ctx->ofproto, ofp_port); - uint16_t odp_port = ofp_port_to_odp_port(ofp_port); + struct ofport_dpif *ofport = get_ofp_port(ctx->ofproto, ofp_port); if (ofport) { if (ofport->up.opp.config & htonl(OFPPC_NO_FWD) @@ -3796,8 +3796,14 @@ add_output_action(struct action_xlate_ctx *ctx, uint16_t ofp_port) */ } + force_compose_output_action(ctx, ofport); +} + +static void +commit_output_action(struct action_xlate_ctx *ctx, uint16_t ofp_port) +{ commit_odp_actions(ctx); - compose_output_action(ctx, odp_port); + compose_output_action(ctx, ofp_port); ctx->nf_output_iface = ofp_port; } @@ -3882,9 +3888,10 @@ flood_packets(struct action_xlate_ctx *ctx, bool all) continue; } - if (all || (!(ofport->up.opp.config & htonl(OFPPC_NO_FLOOD)) - && stp_forward_in_state(ofport->stp_state))) { - compose_output_action(ctx, ofport->odp_port); + if (all) { + force_compose_output_action(ctx, ofport); + } else if (!(ofport->up.opp.config & htonl(OFPPC_NO_FLOOD))) { + compose_output_action(ctx, ofp_port); } } @@ -3913,7 +3920,7 @@ xlate_output_action__(struct action_xlate_ctx *ctx, switch (port) { case OFPP_IN_PORT: - add_output_action(ctx, ctx->flow.in_port); + commit_output_action(ctx, ctx->flow.in_port); break; case OFPP_TABLE: xlate_table_action(ctx, ctx->flow.in_port, ctx->table_id); @@ -3932,13 +3939,13 @@ xlate_output_action__(struct action_xlate_ctx *ctx, compose_controller_action(ctx, max_len); break; case OFPP_LOCAL: - add_output_action(ctx, OFPP_LOCAL); + commit_output_action(ctx, OFPP_LOCAL); break; case OFPP_NONE: break; default: if (port != ctx->flow.in_port) { - add_output_action(ctx, port); + commit_output_action(ctx, port); } break; } @@ -4000,7 +4007,7 @@ xlate_enqueue_action(struct action_xlate_ctx *ctx, /* Add datapath actions. */ flow_priority = ctx->flow.priority; ctx->flow.priority = priority; - add_output_action(ctx, ofp_port); + commit_output_action(ctx, ofp_port); ctx->flow.priority = flow_priority; /* Update NetFlow output port. */ @@ -4363,7 +4370,7 @@ xlate_actions(struct action_xlate_ctx *ctx, if (ctx->packet && connmgr_msg_in_hook(ctx->ofproto->up.connmgr, &ctx->flow, ctx->packet)) { - compose_output_action(ctx, OVSP_LOCAL); + compose_output_action(ctx, OFPP_LOCAL); } } fix_sflow_action(ctx); @@ -4506,7 +4513,7 @@ output_normal(struct action_xlate_ctx *ctx, const struct ofbundle *out_bundle, } commit_vlan_action(ctx, tci); - compose_output_action(ctx, port->odp_port); + compose_output_action(ctx, port->up.ofp_port); ctx->nf_output_iface = port->up.ofp_port; } -- 1.7.7.1 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev