Hi Paolo, On Thu, Oct 07, 2021 at 02:35:34PM +0200, Paolo Valerio wrote: > This is a minor issue but visible e.g. when you try to flush the neigh > cache while the ARP flow is still present in the datapath, triggering > the revalidation of the datapath flows which subsequntly
Typo > refreshes/adds the entry in the cache. Otherwise it looks ok. fbl > > Signed-off-by: Paolo Valerio <pvale...@redhat.com> > --- > lib/tnl-neigh-cache.c | 20 +++++++++++++------- > lib/tnl-neigh-cache.h | 2 +- > ofproto/ofproto-dpif-xlate.c | 3 ++- > 3 files changed, 16 insertions(+), 9 deletions(-) > > diff --git a/lib/tnl-neigh-cache.c b/lib/tnl-neigh-cache.c > index 9d3f00ad9..df8de48eb 100644 > --- a/lib/tnl-neigh-cache.c > +++ b/lib/tnl-neigh-cache.c > @@ -173,7 +173,7 @@ tnl_arp_set(const char name[IFNAMSIZ], ovs_be32 dst, > > static int > tnl_arp_snoop(const struct flow *flow, struct flow_wildcards *wc, > - const char name[IFNAMSIZ]) > + const char name[IFNAMSIZ], bool update) > { > /* Snoop normal ARP replies and gratuitous ARP requests/replies only */ > if (!is_arp(flow) > @@ -183,13 +183,17 @@ tnl_arp_snoop(const struct flow *flow, struct > flow_wildcards *wc, > return EINVAL; > } > > - tnl_arp_set(name, FLOW_WC_GET_AND_MASK_WC(flow, wc, nw_src), > flow->arp_sha); > + memset(&wc->masks.nw_src, 0xff, sizeof wc->masks.nw_src); > + > + if (update) { > + tnl_arp_set(name, flow->nw_src, flow->arp_sha); > + } > return 0; > } > > static int > tnl_nd_snoop(const struct flow *flow, struct flow_wildcards *wc, > - const char name[IFNAMSIZ]) > + const char name[IFNAMSIZ], bool update) > { > if (!is_nd(flow, wc) || flow->tp_src != htons(ND_NEIGHBOR_ADVERT)) { > return EINVAL; > @@ -208,20 +212,22 @@ tnl_nd_snoop(const struct flow *flow, struct > flow_wildcards *wc, > memset(&wc->masks.ipv6_dst, 0xff, sizeof wc->masks.ipv6_dst); > memset(&wc->masks.nd_target, 0xff, sizeof wc->masks.nd_target); > > - tnl_neigh_set(name, &flow->nd_target, flow->arp_tha); > + if (update) { > + tnl_neigh_set(name, &flow->nd_target, flow->arp_tha); > + } > return 0; > } > > int > tnl_neigh_snoop(const struct flow *flow, struct flow_wildcards *wc, > - const char name[IFNAMSIZ]) > + const char name[IFNAMSIZ], bool update) > { > int res; > - res = tnl_arp_snoop(flow, wc, name); > + res = tnl_arp_snoop(flow, wc, name, update); > if (res != EINVAL) { > return res; > } > - return tnl_nd_snoop(flow, wc, name); > + return tnl_nd_snoop(flow, wc, name, update); > } > > void > diff --git a/lib/tnl-neigh-cache.h b/lib/tnl-neigh-cache.h > index 92fdf5a93..a2fd9f4ae 100644 > --- a/lib/tnl-neigh-cache.h > +++ b/lib/tnl-neigh-cache.h > @@ -32,7 +32,7 @@ > #include "util.h" > > int tnl_neigh_snoop(const struct flow *flow, struct flow_wildcards *wc, > - const char dev_name[IFNAMSIZ]); > + const char dev_name[IFNAMSIZ], bool update); > void > tnl_neigh_set(const char name[IFNAMSIZ], const struct in6_addr *dst, > const struct eth_addr mac); > diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c > index 4430ac073..44a49dae8 100644 > --- a/ofproto/ofproto-dpif-xlate.c > +++ b/ofproto/ofproto-dpif-xlate.c > @@ -4097,7 +4097,8 @@ terminate_native_tunnel(struct xlate_ctx *ctx, struct > flow *flow, > (flow->dl_type == htons(ETH_TYPE_ARP) || > flow->nw_proto == IPPROTO_ICMPV6) && > is_neighbor_reply_correct(ctx, flow)) { > - tnl_neigh_snoop(flow, wc, ctx->xbridge->name); > + tnl_neigh_snoop(flow, wc, ctx->xbridge->name, > + ctx->xin->allow_side_effects); > } else if (*tnl_port != ODPP_NONE && > ctx->xin->allow_side_effects && > (flow->dl_type == htons(ETH_TYPE_IP) || > > _______________________________________________ > dev mailing list > d...@openvswitch.org > https://mail.openvswitch.org/mailman/listinfo/ovs-dev -- fbl _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev