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 | 41 +++++++++++++++++++++++------------------ 1 files changed, 23 insertions(+), 18 deletions(-)
diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c index 15d0883..4661720 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,19 @@ 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, uint16_t ofp_port) { + uint16_t odp_port = ofp_port_to_odp_port(ofp_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); if (ofport) { if (ofport->up.opp.config & htonl(OFPPC_NO_FWD) @@ -3796,8 +3795,14 @@ add_output_action(struct action_xlate_ctx *ctx, uint16_t ofp_port) */ } + force_compose_output_action(ctx, ofp_port); +} + +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; } @@ -3877,14 +3882,14 @@ flood_packets(struct action_xlate_ctx *ctx, bool all) commit_odp_actions(ctx); HMAP_FOR_EACH (ofport, up.hmap_node, &ctx->ofproto->up.ports) { uint16_t ofp_port = ofport->up.ofp_port; - if (ofp_port == ctx->flow.in_port) { 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, ofp_port); + } else if (!(ofport->up.opp.config & htonl(OFPPC_NO_FLOOD))) { + compose_output_action(ctx, ofport->up.ofp_port); } } @@ -3913,7 +3918,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 +3937,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 +4005,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 +4368,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 +4511,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