[ovs-dev] [warnings 4/8] ofp-util: Simplify OpenFlow 1.0 ofp_match normalization.

Ethan Jackson ethan at nicira.com
Fri May 13 01:41:38 UTC 2011


Looks Good.

Ethan

On Mon, May 2, 2011 at 12:58, Ben Pfaff <blp at nicira.com> wrote:
> The normalize_match() function does more work than really needed.  It goes
> to some trouble to zero out fields that are wildcarded.  This is not
> necessary, because cls_rule_from_match() will take care of it later.
>
> Also make normalize_match() private to ofp-util.c, since it has no other
> users now and I don't expect more later.
> ---
>  lib/ofp-util.c |   58 +++++++------------------------------------------------
>  lib/ofp-util.h |    1 -
>  2 files changed, 8 insertions(+), 51 deletions(-)
>
> diff --git a/lib/ofp-util.c b/lib/ofp-util.c
> index ade0756..7772c47 100644
> --- a/lib/ofp-util.c
> +++ b/lib/ofp-util.c
> @@ -36,6 +36,8 @@
>
>  VLOG_DEFINE_THIS_MODULE(ofp_util);
>
> +static void normalize_match(struct ofp_match *);
> +
>  /* Rate limit for OpenFlow message parse errors.  These always indicate a bug
>  * in the peer and so there's not much point in showing a lot of them. */
>  static struct vlog_rate_limit bad_ofmsg_rl = VLOG_RATE_LIMIT_INIT(1, 5);
> @@ -2028,7 +2030,7 @@ actions_next(struct actions_iterator *iter)
>     }
>  }
>
> -void
> +static void
>  normalize_match(struct ofp_match *m)
>  {
>     enum { OFPFW_NW = (OFPFW_NW_SRC_ALL | OFPFW_NW_DST_ALL | OFPFW_NW_PROTO
> @@ -2038,74 +2040,30 @@ normalize_match(struct ofp_match *m)
>
>     wc = ntohl(m->wildcards) & OFPFW_ALL;
>     if (wc & OFPFW_DL_TYPE) {
> -        m->dl_type = 0;
> -
>         /* Can't sensibly match on network or transport headers if the
>          * data link type is unknown. */
>         wc |= OFPFW_NW | OFPFW_TP;
> -        m->nw_src = m->nw_dst = m->nw_proto = m->nw_tos = 0;
> -        m->tp_src = m->tp_dst = 0;
>     } else if (m->dl_type == htons(ETH_TYPE_IP)) {
>         if (wc & OFPFW_NW_PROTO) {
> -            m->nw_proto = 0;
> -
>             /* Can't sensibly match on transport headers if the network
>              * protocol is unknown. */
>             wc |= OFPFW_TP;
> -            m->tp_src = m->tp_dst = 0;
> -        } else if (m->nw_proto == IPPROTO_TCP ||
> -                   m->nw_proto == IPPROTO_UDP ||
> -                   m->nw_proto == IPPROTO_ICMP) {
> -            if (wc & OFPFW_TP_SRC) {
> -                m->tp_src = 0;
> -            }
> -            if (wc & OFPFW_TP_DST) {
> -                m->tp_dst = 0;
> -            }
> -        } else {
> +        } else if (m->nw_proto != IPPROTO_TCP &&
> +                   m->nw_proto != IPPROTO_UDP &&
> +                   m->nw_proto != IPPROTO_ICMP) {
>             /* Transport layer fields will always be extracted as zeros, so we
>              * can do an exact-match on those values.  */
>             wc &= ~OFPFW_TP;
>             m->tp_src = m->tp_dst = 0;
>         }
> -        if (wc & OFPFW_NW_SRC_MASK) {
> -            m->nw_src &= ofputil_wcbits_to_netmask(wc >> OFPFW_NW_SRC_SHIFT);
> -        }
> -        if (wc & OFPFW_NW_DST_MASK) {
> -            m->nw_dst &= ofputil_wcbits_to_netmask(wc >> OFPFW_NW_DST_SHIFT);
> -        }
> -        if (wc & OFPFW_NW_TOS) {
> -            m->nw_tos = 0;
> -        } else {
> -            m->nw_tos &= IP_DSCP_MASK;
> -        }
> -    } else if (m->dl_type == htons(ETH_TYPE_ARP)) {
> -        if (wc & OFPFW_NW_PROTO) {
> -            m->nw_proto = 0;
> -        }
> -        if (wc & OFPFW_NW_SRC_MASK) {
> -            m->nw_src &= ofputil_wcbits_to_netmask(wc >> OFPFW_NW_SRC_SHIFT);
> -        }
> -        if (wc & OFPFW_NW_DST_MASK) {
> -            m->nw_dst &= ofputil_wcbits_to_netmask(wc >> OFPFW_NW_DST_SHIFT);
> -        }
> -        m->tp_src = m->tp_dst = m->nw_tos = 0;
> -    } else if (m->dl_type == htons(ETH_TYPE_IPV6)) {
> -        /* Don't normalize IPv6 traffic, since OpenFlow doesn't have a
> -         * way to express it. */
> -    } else {
> +    } else if (m->dl_type != htons(ETH_TYPE_ARP) &&
> +               m->dl_type != htons(ETH_TYPE_IPV6)) {
>         /* Network and transport layer fields will always be extracted as
>          * zeros, so we can do an exact-match on those values. */
>         wc &= ~(OFPFW_NW | OFPFW_TP);
>         m->nw_proto = m->nw_src = m->nw_dst = m->nw_tos = 0;
>         m->tp_src = m->tp_dst = 0;
>     }
> -    if (wc & OFPFW_DL_SRC) {
> -        memset(m->dl_src, 0, sizeof m->dl_src);
> -    }
> -    if (wc & OFPFW_DL_DST) {
> -        memset(m->dl_dst, 0, sizeof m->dl_dst);
> -    }
>     m->wildcards = htonl(wc);
>  }
>
> diff --git a/lib/ofp-util.h b/lib/ofp-util.h
> index 6e69bae..8904404 100644
> --- a/lib/ofp-util.h
> +++ b/lib/ofp-util.h
> @@ -101,7 +101,6 @@ int ofputil_netmask_to_wcbits(ovs_be32 netmask);
>  void ofputil_cls_rule_from_match(const struct ofp_match *,
>                                  unsigned int priority, struct cls_rule *);
>  void ofputil_cls_rule_to_match(const struct cls_rule *, struct ofp_match *);
> -void normalize_match(struct ofp_match *);
>  char *ofp_match_to_literal_string(const struct ofp_match *match);
>
>  /* dl_type translation between OpenFlow and 'struct flow' format. */
> --
> 1.7.4.4
>
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev
>



More information about the dev mailing list