Acked-by: Jarno Rajahalme <ja...@ovn.org> IMO this and the earlier (2/5) one are bug fixes that should be cherry-picked to branches 2.6 and 2.5, if applicable.
Jarno > On Aug 30, 2016, at 6:47 PM, Daniele Di Proietto <diproiet...@vmware.com> > wrote: > > tnl_neigh_snoop() is part of the translation. During translation we > have to unwildcard all the fields we examine to make a decision. > > tnl_arp_snoop() and tnl_nd_snoop() failed to unwildcard fileds in case > of failure. The solution is to do unwildcarding before the field is > inspected. > > Signed-off-by: Daniele Di Proietto <diproiet...@vmware.com> > --- > lib/flow.h | 7 +++++++ > lib/tnl-neigh-cache.c | 22 ++++++++-------------- > 2 files changed, 15 insertions(+), 14 deletions(-) > > diff --git a/lib/flow.h b/lib/flow.h > index 5b83695..ea24e28 100644 > --- a/lib/flow.h > +++ b/lib/flow.h > @@ -854,6 +854,13 @@ pkt_metadata_from_flow(struct pkt_metadata *md, const > struct flow *flow) > md->ct_label = flow->ct_label; > } > > +/* Often, during translation we need to read a value from a flow('FLOW') and > + * unwildcard the corresponding bits in the wildcards('WC'). This macro > makes > + * it easier to do that. */ > + > +#define FLOW_WC_GET_AND_MASK_WC(FLOW, WC, FIELD) \ > + (((WC) ? WC_MASK_FIELD(WC, FIELD) : NULL), ((FLOW)->FIELD)) > + > static inline bool is_vlan(const struct flow *flow, > struct flow_wildcards *wc) > { > diff --git a/lib/tnl-neigh-cache.c b/lib/tnl-neigh-cache.c > index f7d29f6..499efff 100644 > --- a/lib/tnl-neigh-cache.c > +++ b/lib/tnl-neigh-cache.c > @@ -115,7 +115,7 @@ tnl_neigh_delete(struct tnl_neigh_entry *neigh) > > static void > tnl_neigh_set__(const char name[IFNAMSIZ], const struct in6_addr *dst, > - const struct eth_addr mac) > + const struct eth_addr mac) > { > ovs_mutex_lock(&mutex); > struct tnl_neigh_entry *neigh = tnl_neigh_lookup__(name, dst); > @@ -151,26 +151,21 @@ static int > tnl_arp_snoop(const struct flow *flow, struct flow_wildcards *wc, > const char name[IFNAMSIZ]) > { > - if (flow->dl_type != htons(ETH_TYPE_ARP) || > - flow->nw_proto != ARP_OP_REPLY || > - eth_addr_is_zero(flow->arp_sha)) { > + if (flow->dl_type != htons(ETH_TYPE_ARP) > + || FLOW_WC_GET_AND_MASK_WC(flow, wc, nw_proto) != ARP_OP_REPLY > + || eth_addr_is_zero(FLOW_WC_GET_AND_MASK_WC(flow, wc, arp_sha))) { > return EINVAL; > } > > - /* Exact Match on all ARP flows. */ > - memset(&wc->masks.nw_proto, 0xff, sizeof wc->masks.nw_proto); > - memset(&wc->masks.nw_src, 0xff, sizeof wc->masks.nw_src); > - memset(&wc->masks.arp_sha, 0xff, sizeof wc->masks.arp_sha); > - > - tnl_arp_set(name, flow->nw_src, flow->arp_sha); > + tnl_arp_set(name, FLOW_WC_GET_AND_MASK_WC(flow, wc, 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]) > { > - if (!is_nd(flow, NULL) || flow->tp_src != htons(ND_NEIGHBOR_ADVERT)) { > + if (!is_nd(flow, wc) || flow->tp_src != htons(ND_NEIGHBOR_ADVERT)) { > return EINVAL; > } > /* - RFC4861 says Neighbor Advertisements sent in response to unicast > Neighbor > @@ -179,14 +174,13 @@ tnl_nd_snoop(const struct flow *flow, struct > flow_wildcards *wc, > * TLL address and other Advertisements not including it can be ignored. > * - OVS flow extract can set this field to zero in case of packet > parsing errors. > * For details refer miniflow_extract()*/ > - if (eth_addr_is_zero(flow->arp_tha)) { > + if (eth_addr_is_zero(FLOW_WC_GET_AND_MASK_WC(flow, wc, arp_tha))) { > return EINVAL; > } > > memset(&wc->masks.ipv6_src, 0xff, sizeof wc->masks.ipv6_src); > memset(&wc->masks.ipv6_dst, 0xff, sizeof wc->masks.ipv6_dst); > memset(&wc->masks.nd_target, 0xff, sizeof wc->masks.nd_target); > - memset(&wc->masks.arp_tha, 0xff, sizeof wc->masks.arp_tha); > > tnl_neigh_set__(name, &flow->nd_target, flow->arp_tha); > return 0; > -- > 2.9.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