On Mon, Feb 20, 2023 at 5:05 AM Han Ding <[email protected]> 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 <[email protected]>
> ---
>
> 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
> [email protected]
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev