From: Guolin Yang <gy...@nicira.com> For ICMPv6, when convert flow/mask to flow/mask key, the check for whether there is ND information is incorrect. Similar error in reverse conversion.
Signed-off-by: Guolin Yang <gy...@nicira.com> --- lib/odp-util.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/lib/odp-util.c b/lib/odp-util.c index 15ad2be..6ddde9d 100644 --- a/lib/odp-util.c +++ b/lib/odp-util.c @@ -2553,8 +2553,12 @@ odp_flow_key_from_flow__(struct ofpbuf *buf, const struct flow *data, icmpv6_key->icmpv6_type = ntohs(data->tp_src); icmpv6_key->icmpv6_code = ntohs(data->tp_dst); - if (icmpv6_key->icmpv6_type == ND_NEIGHBOR_SOLICIT - || icmpv6_key->icmpv6_type == ND_NEIGHBOR_ADVERT) { + if (flow->tp_dst == htons(0) && + (flow->tp_src == htons(ND_NEIGHBOR_SOLICIT) || + flow->tp_src == htons(ND_NEIGHBOR_ADVERT)) && + (!is_mask || (icmpv6_key->icmpv6_type == 0xffff && + icmpv6_key->icmpv6_code == 0xffff))) { + struct ovs_key_nd *nd_key; nd_key = nl_msg_put_unspec_uninit(buf, OVS_KEY_ATTR_ND, @@ -2965,8 +2969,9 @@ parse_l2_5_onward(const struct nlattr *attrs[OVS_KEY_ATTR_MAX + 1], flow->tp_src = htons(icmpv6_key->icmpv6_type); flow->tp_dst = htons(icmpv6_key->icmpv6_code); expected_bit = OVS_KEY_ATTR_ICMPV6; - if (src_flow->tp_src == htons(ND_NEIGHBOR_SOLICIT) || - src_flow->tp_src == htons(ND_NEIGHBOR_ADVERT)) { + if (src_flow->tp_dst == 0 && + (src_flow->tp_src == htons(ND_NEIGHBOR_SOLICIT) || + src_flow->tp_src == htons(ND_NEIGHBOR_ADVERT))) { if (!is_mask) { expected_attrs |= UINT64_C(1) << OVS_KEY_ATTR_ND; } @@ -2981,7 +2986,8 @@ parse_l2_5_onward(const struct nlattr *attrs[OVS_KEY_ATTR_MAX + 1], if (is_mask) { if (!is_all_zeros((const uint8_t *) nd_key, sizeof *nd_key) && - flow->tp_src != htons(0xffff)) { + (flow->tp_src != htons(0xffff) && + flow->tp_dst != htons(0xffff))) { return ODP_FIT_ERROR; } else { expected_attrs |= UINT64_C(1) << OVS_KEY_ATTR_ND; -- 1.7.9.5 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev