On Mon, Feb 20, 2023 at 5:05 AM Han Ding <hand...@chinatelecom.cn> wrote:
>
>
> Function is_gratuitous_arp() and function is_garp() are all used to judge
> whether the flow is gratuitous arp. It is not necessary to use two functions
> to do the same thing and just keep one.
>
> Gratuitous ARP message is a generally link-level broadcast messages and
> carry the same IP in sender and target fields. This patch add the check
> in function is_garp() whether the arp is a broadcast message and whether
> the arp is an arp request or an arp reply.
>
> Signed-off-by: Han Ding <hand...@chinatelecom.cn>
> ---
>
> Notes:
>     v2:
>     - Add the check whether the ARP packet is a broadcast message in 
> is_garp().
>
>     v3:
>     - Add the check whether the packet is an arp request or an arp reply in 
> is_garp().
>
>     v4:
>     - Add description of differences between patch versions
>     - Use WC_MASK_FIELD() macro instead of memset.
>
>  lib/flow.h                   | 16 +++++++++++++---
>  ofproto/ofproto-dpif-xlate.c | 32 ++------------------------------
>  2 files changed, 15 insertions(+), 33 deletions(-)
>
> diff --git a/lib/flow.h b/lib/flow.h
> index c647ad83c..037deb6cd 100644
> --- a/lib/flow.h
> +++ b/lib/flow.h
> @@ -1133,10 +1133,20 @@ static inline bool is_garp(const struct flow *flow,
>                             struct flow_wildcards *wc)
>  {
>      if (is_arp(flow)) {
> -        return (FLOW_WC_GET_AND_MASK_WC(flow, wc, nw_src) ==
> -                FLOW_WC_GET_AND_MASK_WC(flow, wc, nw_dst));
> -    }
> +        if (!eth_addr_is_broadcast(FLOW_WC_GET_AND_MASK_WC(flow, wc, 
> dl_dst))) {

This line is too long.

Other than that, This patch looks good to me. The new behaviour seems
to be more correct than before as well.


Thanks,
M

> +            return false;
> +        }
>
> +        if (wc) {
> +            WC_MASK_FIELD(wc, nw_proto);
> +        }
> +
> +        if (flow->nw_proto == ARP_OP_REQUEST ||
> +            flow->nw_proto == ARP_OP_REPLY) {
> +            return (FLOW_WC_GET_AND_MASK_WC(flow, wc, nw_src) ==
> +                    FLOW_WC_GET_AND_MASK_WC(flow, wc, nw_dst));
> +        }
> +    }
>      return false;
>  }
>
> diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c
> index a9cf3cbee..b3c13f6bf 100644
> --- a/ofproto/ofproto-dpif-xlate.c
> +++ b/ofproto/ofproto-dpif-xlate.c
> @@ -2543,34 +2543,6 @@ output_normal(struct xlate_ctx *ctx, const struct 
> xbundle *out_xbundle,
>      memcpy(&ctx->xin->flow.vlans, &old_vlans, sizeof(old_vlans));
>  }
>
> -/* A VM broadcasts a gratuitous ARP to indicate that it has resumed after
> - * migration.  Older Citrix-patched Linux DomU used gratuitous ARP replies to
> - * indicate this; newer upstream kernels use gratuitous ARP requests. */
> -static bool
> -is_gratuitous_arp(const struct flow *flow, struct flow_wildcards *wc)
> -{
> -    if (flow->dl_type != htons(ETH_TYPE_ARP)) {
> -        return false;
> -    }
> -
> -    memset(&wc->masks.dl_dst, 0xff, sizeof wc->masks.dl_dst);
> -    if (!eth_addr_is_broadcast(flow->dl_dst)) {
> -        return false;
> -    }
> -
> -    memset(&wc->masks.nw_proto, 0xff, sizeof wc->masks.nw_proto);
> -    if (flow->nw_proto == ARP_OP_REPLY) {
> -        return true;
> -    } else if (flow->nw_proto == ARP_OP_REQUEST) {
> -        memset(&wc->masks.nw_src, 0xff, sizeof wc->masks.nw_src);
> -        memset(&wc->masks.nw_dst, 0xff, sizeof wc->masks.nw_dst);
> -
> -        return flow->nw_src == flow->nw_dst;
> -    } else {
> -        return false;
> -    }
> -}
> -
>  /* Determines whether packets in 'flow' within 'xbridge' should be forwarded 
> or
>   * dropped.  Returns true if they may be forwarded, false if they should be
>   * dropped.
> @@ -2619,7 +2591,7 @@ is_admissible(struct xlate_ctx *ctx, struct xport 
> *in_port,
>              mac = mac_learning_lookup(xbridge->ml, flow->dl_src, vlan);
>              if (mac
>                  && mac_entry_get_port(xbridge->ml, mac) != 
> in_xbundle->ofbundle
> -                && (!is_gratuitous_arp(flow, ctx->wc)
> +                && (!is_garp(flow, ctx->wc)
>                      || mac_entry_is_grat_arp_locked(mac))) {
>                  ovs_rwlock_unlock(&xbridge->ml->rwlock);
>                  xlate_report(ctx, OFT_DETAIL,
> @@ -3062,7 +3034,7 @@ xlate_normal(struct xlate_ctx *ctx)
>      }
>
>      /* Learn source MAC. */
> -    bool is_grat_arp = is_gratuitous_arp(flow, wc);
> +    bool is_grat_arp = is_garp(flow, wc);
>      if (ctx->xin->allow_side_effects
>          && flow->packet_type == htonl(PT_ETH)
>          && in_port && in_port->pt_mode != NETDEV_PT_LEGACY_L3
> --
> 2.27.0
>
>
>
>
> _______________________________________________
> dev mailing list
> d...@openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>

_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to