Acked-by: Jarno Rajahalme <jrajaha...@nicira.com>

> On Jul 29, 2015, at 11:42 PM, Ben Pfaff <b...@nicira.com> wrote:
> 
> Packets should never be received on mirror output ports.  We drop them
> when we do receive them.  But by putting them through the processing that
> we did until now, we made it possible for MAC learning, etc. to happen
> based on these packets.  This commit drops them earlier to prevent that.
> 
> Found by inspection.
> 
> Signed-off-by: Ben Pfaff <b...@nicira.com>
> ---
> ofproto/ofproto-dpif-xlate.c | 29 ++++++++++++++---------------
> 1 file changed, 14 insertions(+), 15 deletions(-)
> 
> diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c
> index be0fd13..8c8da9a 100644
> --- a/ofproto/ofproto-dpif-xlate.c
> +++ b/ofproto/ofproto-dpif-xlate.c
> @@ -1548,18 +1548,6 @@ add_mirror_actions(struct xlate_ctx *ctx, const struct 
> flow *orig_flow)
>     }
>     mirrors |= xbundle_mirror_src(xbridge, in_xbundle);
> 
> -    /* Drop frames on bundles reserved for mirroring. */
> -    if (xbundle_mirror_out(xbridge, in_xbundle)) {
> -        if (ctx->xin->packet != NULL) {
> -            static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5);
> -            VLOG_WARN_RL(&rl, "bridge %s: dropping packet received on port "
> -                         "%s, which is reserved exclusively for mirroring",
> -                         ctx->xbridge->name, in_xbundle->name);
> -        }
> -        ofpbuf_clear(ctx->odp_actions);
> -        return;
> -    }
> -
>     /* Check VLAN. */
>     vid = vlan_tci_to_vid(orig_flow->vlan_tci);
>     if (!input_vid_is_valid(vid, in_xbundle, ctx->xin->packet != NULL)) {
> @@ -4919,9 +4907,20 @@ xlate_actions(struct xlate_in *xin, struct xlate_out 
> *xout)
>         }
>     }
> 
> -    /* Do not perform special processing on recirculated packets,
> -     * as recirculated packets are not really received by the bridge. */
> -    if (xin->recirc || !process_special(&ctx, in_port)) {
> +    if (!xin->recirc && process_special(&ctx, in_port)) {
> +        /* process_special() did all the processing for this packet.
> +         *
> +         * We do not perform special processing on recirculated packets, as
> +         * recirculated packets are not really received by the bridge.*/
> +    } else if (in_port && in_port->xbundle
> +               && xbundle_mirror_out(xbridge, in_port->xbundle)) {
> +        if (ctx.xin->packet != NULL) {
> +            static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5);
> +            VLOG_WARN_RL(&rl, "bridge %s: dropping packet received on port "
> +                         "%s, which is reserved exclusively for mirroring",
> +                         ctx.xbridge->name, in_port->xbundle->name);
> +        }
> +    } else {
>         /* Sampling is done only for packets really received by the bridge. */
>         unsigned int user_cookie_offset = 0;
>         if (!xin->recirc) {
> -- 
> 2.1.3
> 
> _______________________________________________
> dev mailing list
> dev@openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev

_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to