On 12/1/22 07:39, Han Ding 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.

Hi.  Thanks for the patch!

These function are indeed similar, but they are not identical.  It looks
like is_gratuitous_arp() is handling arp replies along with arp requests,
it also checks for the packet to be broadcast.  is_garp() doesn't do that.

In case we want to keep only one implementation, we should probably keep
the more robust version, which is is_gratuitous_arp().

What do you think?

Best regards, Ilya Maximets.

> 
> Signed-off-by: Han Ding <hand...@chinatelecom.cn>
> ---
>  ofproto/ofproto-dpif-xlate.c | 32 ++------------------------------
>  1 file changed, 2 insertions(+), 30 deletions(-)
> 
> 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

Reply via email to