[ovs-dev] [warnings2 2/4] nx-match: Check prerequisites for ICMPv6 before outputting subfields.

Ethan Jackson ethan at nicira.com
Wed May 18 01:39:40 UTC 2011


Looks Good.

Ethan

On Tue, May 10, 2011 at 09:07, Ben Pfaff <blp at nicira.com> wrote:
> nicira-ext.h documents that NXM_NX_ND_TARGET requires ND_NEIGHBOR_SOLICIT
> or ND_NEIGHBOR_ADVERT, that NXM_NX_ND_SLL requires ND_NEIGHBOR_SOLICIT,
> and that NXM_NX_ND_TLL requires ND_NEIGHBOR_ADVERT, but nx_put_match()
> would add them to the match regardless of whether these prerequisites were
> satisfied.  On the other side, nx_pull_match() did check the prerequisites,
> so this was a case where OVS could output flows that it would refused to
> parse.  This fixes the problem.
>
> Found by inspection.
> ---
>  lib/nx-match.c |   26 ++++++++++++++++----------
>  1 files changed, 16 insertions(+), 10 deletions(-)
>
> diff --git a/lib/nx-match.c b/lib/nx-match.c
> index 4d2e590..86713ab 100644
> --- a/lib/nx-match.c
> +++ b/lib/nx-match.c
> @@ -839,20 +839,26 @@ nx_put_match(struct ofpbuf *b, const struct cls_rule *cr)
>             case IPPROTO_ICMPV6:
>                 if (!(wc & FWW_TP_SRC)) {
>                     nxm_put_8(b, NXM_NX_ICMPV6_TYPE, ntohs(flow->tp_src));
> +
> +                    if (flow->tp_src == htons(ND_NEIGHBOR_SOLICIT) ||
> +                        flow->tp_src == htons(ND_NEIGHBOR_ADVERT)) {
> +                        if (!(wc & FWW_ND_TARGET)) {
> +                            nxm_put_ipv6(b, NXM_NX_ND_TARGET, &flow->nd_target,
> +                                         &in6addr_exact);
> +                        }
> +                        if (!(wc & FWW_ARP_SHA)
> +                            && flow->tp_src == htons(ND_NEIGHBOR_SOLICIT)) {
> +                            nxm_put_eth(b, NXM_NX_ND_SLL, flow->arp_sha);
> +                        }
> +                        if (!(wc & FWW_ARP_THA)
> +                            && flow->tp_src == htons(ND_NEIGHBOR_ADVERT)) {
> +                            nxm_put_eth(b, NXM_NX_ND_TLL, flow->arp_tha);
> +                        }
> +                    }
>                 }
>                 if (!(wc & FWW_TP_DST)) {
>                     nxm_put_8(b, NXM_NX_ICMPV6_CODE, ntohs(flow->tp_dst));
>                 }
> -                if (!(wc & FWW_ND_TARGET)) {
> -                    nxm_put_ipv6(b, NXM_NX_ND_TARGET, &flow->nd_target,
> -                            &in6addr_exact);
> -                }
> -                if (!(wc & FWW_ARP_SHA)) {
> -                    nxm_put_eth(b, NXM_NX_ND_SLL, flow->arp_sha);
> -                }
> -                if (!(wc & FWW_ARP_THA)) {
> -                    nxm_put_eth(b, NXM_NX_ND_TLL, flow->arp_tha);
> -                }
>                 break;
>             }
>         }
> --
> 1.7.4.4
>
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev
>



More information about the dev mailing list