Thanks. To make this invariant really clear, I added a comment: * * (As usually true for value/mask pairs in OVS, any 1-bit in a value must have * a corresponding 1-bit in its mask.) */
On Wed, Apr 15, 2015 at 12:36:40PM -0700, Andy Zhou wrote: > Thanks for explaining. Given av == av & am is a prerequisite, this > function looks fine. > > For the patch: > Acked-by: Andy Zhou <az...@nicira.com> > > On Wed, Apr 15, 2015 at 11:35 AM, Ben Pfaff <b...@nicira.com> wrote: > > This combination of av with am is invalid because av has a 1-bit (its > > least-significant bit) where am has a 0-bit. Suppose that we pretend > > that am is instead 1001, which would make av/am valid. Then av/am > > requires the least-significant bit to be 1 and bv/bm requires it to be > > 0. This is the "impossible" case described in the function-level > > comment, which makes the function return false because: > > > > (av ^ bv) & (am & bm) > > == (1001 ^ 1000) & (1001 & 1001) > > == 0001 & 1001 > > == 1 > > > > which is nonzero, hence the if statement returns false. > > > > On Tue, Apr 07, 2015 at 02:14:31PM -0700, Andy Zhou wrote: > >> assume av=1001, am = 1000, bv=1000, bm=1001. > >> > >> Should dv's last bit be zero? if not, then my interpretation of what > >> this function does > >> is wrong. > >> > >> On Mon, Apr 6, 2015 at 9:31 PM, Ben Pfaff <b...@nicira.com> wrote: > >> > On Mon, Apr 06, 2015 at 03:28:37PM -0700, Andy Zhou wrote: > >> >> On Tue, Mar 31, 2015 at 9:52 PM, Ben Pfaff <b...@nicira.com> wrote: > >> >> > To be first used in upcoming commits. > >> >> > > >> >> > Signed-off-by: Ben Pfaff <b...@nicira.com> > >> >> > >> >> > +/* Consider the two value/mask pairs 'a_value/a_mask' and > >> >> > 'b_value/b_mask' as > >> >> > + * restrictions on a field's value. Then, this function initializes > >> >> > + * 'dst_value/dst_mask' such that it combines the restrictions of > >> >> > both pairs. > >> >> > + * This is not always possible, i.e. if one pair insists on a value > >> >> > of 0 in > >> >> > + * some bit and the other pair insists on a value of 1 in that bit. > >> >> > This > >> >> > + * function returns false in a case where the combined restriction is > >> >> > + * impossible (in which case 'dst_value/dst_mask' is not fully > >> >> > initialized), > >> >> > + * true otherwise. */ > >> >> > +bool > >> >> > +mf_subvalue_intersect(const union mf_subvalue *a_value, > >> >> > + const union mf_subvalue *a_mask, > >> >> > + const union mf_subvalue *b_value, > >> >> > + const union mf_subvalue *b_mask, > >> >> > + union mf_subvalue *dst_value, > >> >> > + union mf_subvalue *dst_mask) > >> >> > +{ > >> >> > + for (int i = 0; i < ARRAY_SIZE(a_value->be64); i++) { > >> >> > + ovs_be64 av = a_value->be64[i]; > >> >> > + ovs_be64 am = a_mask->be64[i]; > >> >> > + ovs_be64 bv = b_value->be64[i]; > >> >> > + ovs_be64 bm = b_mask->be64[i]; > >> >> > + ovs_be64 *dv = &dst_value->be64[i]; > >> >> > + ovs_be64 *dm = &dst_mask->be64[i]; > >> >> > + > >> >> > + if ((av ^ bv) & (am & bm)) { > >> >> > + return false; > >> >> > + } > >> >> > + *dv = av | bv; > >> >> > + *dm = am | bm; > >> >> Should this be *dv = (av & am) | (bv & bm)? I have not read the > >> >> following patch > >> >> to check the actual usage, so my interpretation of 'intersect' may be > >> >> different than > >> >> what's intended here. > >> > > >> > I think that in the cases where the expression you suggest would have a > >> > different value, the "if" statement just before would have bailed out. _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev