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. > + } > + return true; > +} > + _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev