The frag member in the Netlink interface is an uint8_t enumeration type, not a bitrfield, so it should always be either fully masked or not masked at all.
Signed-off-by: Jarno Rajahalme <jrajaha...@nicira.com> --- lib/odp-util.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/lib/odp-util.c b/lib/odp-util.c index 8ac43c5..3c398ce 100644 --- a/lib/odp-util.c +++ b/lib/odp-util.c @@ -2485,20 +2485,20 @@ odp_flow_from_string(const char *s, const struct simap *port_names, static uint8_t ovs_to_odp_frag(uint8_t nw_frag) { - return (nw_frag == 0 ? OVS_FRAG_TYPE_NONE - : nw_frag == FLOW_NW_FRAG_ANY ? OVS_FRAG_TYPE_FIRST - : OVS_FRAG_TYPE_LATER); + return !(nw_frag & FLOW_NW_FRAG_ANY) ? OVS_FRAG_TYPE_NONE + : nw_frag & FLOW_NW_FRAG_LATER ? OVS_FRAG_TYPE_LATER + : OVS_FRAG_TYPE_FIRST; } +/* + * Netlink interface 'enum ovs_frag_type' is an 8-bit enumeration type, not a + * set of flags or bitfields. Hence, if the struct flow nw_frag mask, which is + * a set of bits, has the FLOW_NW_FRAG_ANY as zero, we must use a zero mask for + * the netlink frag field, and all ones mask otherwise. */ static uint8_t ovs_to_odp_frag_mask(uint8_t nw_frag_mask) { - uint8_t frag_mask = ~(OVS_FRAG_TYPE_FIRST | OVS_FRAG_TYPE_LATER); - - frag_mask |= (nw_frag_mask & FLOW_NW_FRAG_ANY) ? OVS_FRAG_TYPE_FIRST : 0; - frag_mask |= (nw_frag_mask & FLOW_NW_FRAG_LATER) ? OVS_FRAG_TYPE_LATER : 0; - - return frag_mask; + return (nw_frag_mask & FLOW_NW_FRAG_ANY) ? UINT8_MAX : 0; } static void @@ -2858,6 +2858,7 @@ odp_to_ovs_frag(uint8_t odp_frag, struct flow *flow) return false; } + flow->nw_frag = 0; if (odp_frag != OVS_FRAG_TYPE_NONE) { flow->nw_frag |= FLOW_NW_FRAG_ANY; if (odp_frag == OVS_FRAG_TYPE_LATER) { -- 1.7.10.4 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev