[ovs-dev] [metaflow-cleanup 1/3] meta-flow: Split ICMP into ICMPv4 and ICMPv6.

Ethan Jackson ethan at nicira.com
Mon Nov 14 20:43:02 UTC 2011


Looks good.

Ethan

On Mon, Nov 7, 2011 at 21:50, Ben Pfaff <blp at nicira.com> wrote:
> NXM breaks ICMP into v4 and v6.  An upcoming commit will drop all of the
> NXM specific data in favor of mf_field, and so at that point we need to
> have a separate mf_field for each NXM field.  So, this commit splits
> ICMP into v4 and v6 for meta-flow also.
> ---
>  lib/meta-flow.c  |   74 ++++++++++++++++++++++++++++++++++++++----------------
>  lib/meta-flow.h  |    9 ++++--
>  lib/nx-match.def |    8 +++---
>  3 files changed, 62 insertions(+), 29 deletions(-)
>
> diff --git a/lib/meta-flow.c b/lib/meta-flow.c
> index 0f00996..4ab212b 100644
> --- a/lib/meta-flow.c
> +++ b/lib/meta-flow.c
> @@ -269,19 +269,33 @@ static const struct mf_field mf_fields[MFF_N_IDS] = {
>     },
>
>     {
> -        MFF_ICMP_TYPE, "icmp_type", NULL,
> +        MFF_ICMPV4_TYPE, "icmp_type", NULL,
>         MF_FIELD_SIZES(u8),
>         MFM_NONE, FWW_TP_SRC,
>         MFS_DECIMAL,
> -        MFP_ICMP_ANY,
> +        MFP_ICMPV4,
>         NXM_OF_ICMP_TYPE,
>     }, {
> -        MFF_ICMP_CODE, "icmp_code", NULL,
> +        MFF_ICMPV4_CODE, "icmp_code", NULL,
>         MF_FIELD_SIZES(u8),
>         MFM_NONE, FWW_TP_DST,
>         MFS_DECIMAL,
> -        MFP_ICMP_ANY,
> +        MFP_ICMPV4,
>         NXM_OF_ICMP_CODE,
> +    }, {
> +        MFF_ICMPV6_TYPE, "icmpv6_type", NULL,
> +        MF_FIELD_SIZES(u8),
> +        MFM_NONE, FWW_TP_SRC,
> +        MFS_DECIMAL,
> +        MFP_ICMPV6,
> +        NXM_NX_ICMPV6_TYPE,
> +    }, {
> +        MFF_ICMPV6_CODE, "icmpv6_code", NULL,
> +        MF_FIELD_SIZES(u8),
> +        MFM_NONE, FWW_TP_DST,
> +        MFS_DECIMAL,
> +        MFP_ICMPV6,
> +        NXM_NX_ICMPV6_CODE,
>     },
>
>     /* ## ---- ## */
> @@ -361,8 +375,10 @@ mf_is_all_wild(const struct mf_field *mf, const struct flow_wildcards *wc)
>     case MFF_TCP_DST:
>     case MFF_UDP_SRC:
>     case MFF_UDP_DST:
> -    case MFF_ICMP_TYPE:
> -    case MFF_ICMP_CODE:
> +    case MFF_ICMPV4_TYPE:
> +    case MFF_ICMPV4_CODE:
> +    case MFF_ICMPV6_TYPE:
> +    case MFF_ICMPV6_CODE:
>     case MFF_ND_TARGET:
>     case MFF_ND_SLL:
>     case MFF_ND_TLL:
> @@ -451,8 +467,10 @@ mf_get_mask(const struct mf_field *mf, const struct flow_wildcards *wc,
>     case MFF_TCP_DST:
>     case MFF_UDP_SRC:
>     case MFF_UDP_DST:
> -    case MFF_ICMP_TYPE:
> -    case MFF_ICMP_CODE:
> +    case MFF_ICMPV4_TYPE:
> +    case MFF_ICMPV4_CODE:
> +    case MFF_ICMPV6_TYPE:
> +    case MFF_ICMPV6_CODE:
>     case MFF_ND_TARGET:
>     case MFF_ND_SLL:
>     case MFF_ND_TLL:
> @@ -601,10 +619,10 @@ mf_are_prereqs_ok(const struct mf_field *mf, const struct flow *flow)
>         return is_ip_any(flow) && flow->nw_proto == IPPROTO_TCP;
>     case MFP_UDP:
>         return is_ip_any(flow) && flow->nw_proto == IPPROTO_UDP;
> +    case MFP_ICMPV4:
> +        return is_icmpv4(flow);
>     case MFP_ICMPV6:
>         return is_icmpv6(flow);
> -    case MFP_ICMP_ANY:
> -        return is_icmpv4(flow) || is_icmpv6(flow);
>
>     case MFP_ND:
>         return (is_icmpv6(flow)
> @@ -675,8 +693,10 @@ mf_is_value_valid(const struct mf_field *mf, const union mf_value *value)
>     case MFF_TCP_DST:
>     case MFF_UDP_SRC:
>     case MFF_UDP_DST:
> -    case MFF_ICMP_TYPE:
> -    case MFF_ICMP_CODE:
> +    case MFF_ICMPV4_TYPE:
> +    case MFF_ICMPV4_CODE:
> +    case MFF_ICMPV6_TYPE:
> +    case MFF_ICMPV6_CODE:
>     case MFF_ND_TARGET:
>     case MFF_ND_SLL:
>     case MFF_ND_TLL:
> @@ -828,11 +848,13 @@ mf_get_value(const struct mf_field *mf, const struct flow *flow,
>         value->be16 = flow->tp_dst;
>         break;
>
> -    case MFF_ICMP_TYPE:
> +    case MFF_ICMPV4_TYPE:
> +    case MFF_ICMPV6_TYPE:
>         value->u8 = ntohs(flow->tp_src);
>         break;
>
> -    case MFF_ICMP_CODE:
> +    case MFF_ICMPV4_CODE:
> +    case MFF_ICMPV6_CODE:
>         value->u8 = ntohs(flow->tp_dst);
>         break;
>
> @@ -975,11 +997,13 @@ mf_set_value(const struct mf_field *mf,
>         cls_rule_set_tp_dst(rule, value->be16);
>         break;
>
> -    case MFF_ICMP_TYPE:
> +    case MFF_ICMPV4_TYPE:
> +    case MFF_ICMPV6_TYPE:
>         cls_rule_set_icmp_type(rule, value->u8);
>         break;
>
> -    case MFF_ICMP_CODE:
> +    case MFF_ICMPV4_CODE:
> +    case MFF_ICMPV6_CODE:
>         cls_rule_set_icmp_code(rule, value->u8);
>         break;
>
> @@ -1120,14 +1144,16 @@ mf_set_wild(const struct mf_field *mf, struct cls_rule *rule)
>
>     case MFF_TCP_SRC:
>     case MFF_UDP_SRC:
> -    case MFF_ICMP_TYPE:
> +    case MFF_ICMPV4_TYPE:
> +    case MFF_ICMPV6_TYPE:
>         rule->wc.wildcards |= FWW_TP_SRC;
>         rule->flow.tp_src = htons(0);
>         break;
>
>     case MFF_TCP_DST:
>     case MFF_UDP_DST:
> -    case MFF_ICMP_CODE:
> +    case MFF_ICMPV4_CODE:
> +    case MFF_ICMPV6_CODE:
>         rule->wc.wildcards |= FWW_TP_DST;
>         rule->flow.tp_dst = htons(0);
>         break;
> @@ -1182,8 +1208,10 @@ mf_set(const struct mf_field *mf,
>     case MFF_TCP_DST:
>     case MFF_UDP_SRC:
>     case MFF_UDP_DST:
> -    case MFF_ICMP_TYPE:
> -    case MFF_ICMP_CODE:
> +    case MFF_ICMPV4_TYPE:
> +    case MFF_ICMPV4_CODE:
> +    case MFF_ICMPV6_TYPE:
> +    case MFF_ICMPV6_CODE:
>     case MFF_ND_TARGET:
>     case MFF_ND_SLL:
>     case MFF_ND_TLL:
> @@ -1386,8 +1414,10 @@ mf_random_value(const struct mf_field *mf, union mf_value *value)
>     case MFF_TCP_DST:
>     case MFF_UDP_SRC:
>     case MFF_UDP_DST:
> -    case MFF_ICMP_TYPE:
> -    case MFF_ICMP_CODE:
> +    case MFF_ICMPV4_TYPE:
> +    case MFF_ICMPV4_CODE:
> +    case MFF_ICMPV6_TYPE:
> +    case MFF_ICMPV6_CODE:
>     case MFF_ND_TARGET:
>     case MFF_ND_SLL:
>     case MFF_ND_TLL:
> diff --git a/lib/meta-flow.h b/lib/meta-flow.h
> index 9f3b2ee..ccab1b7 100644
> --- a/lib/meta-flow.h
> +++ b/lib/meta-flow.h
> @@ -85,8 +85,11 @@ enum mf_field_id {
>     MFF_UDP_SRC,                /* be16 (used for IPv4 or IPv6) */
>     MFF_UDP_DST,                /* be16 (used for IPv4 or IPv6) */
>
> -    MFF_ICMP_TYPE,              /* u8 (used for IPv4 or IPv6) */
> -    MFF_ICMP_CODE,              /* u8 (used for IPv4 or IPv6) */
> +    MFF_ICMPV4_TYPE,            /* u8 */
> +    MFF_ICMPV4_CODE,            /* u8 */
> +
> +    MFF_ICMPV6_TYPE,            /* u8 */
> +    MFF_ICMPV6_CODE,            /* u8 */
>
>     /* ICMPv6 Neighbor Discovery. */
>     MFF_ND_TARGET,              /* ipv6 */
> @@ -113,8 +116,8 @@ enum mf_prereqs {
>     /* L2+L3 requirements. */
>     MFP_TCP,                    /* On IPv4 or IPv6. */
>     MFP_UDP,                    /* On IPv4 or IPv6. */
> +    MFP_ICMPV4,
>     MFP_ICMPV6,
> -    MFP_ICMP_ANY,
>
>     /* L2+L3+L4 requirements. */
>     MFP_ND,
> diff --git a/lib/nx-match.def b/lib/nx-match.def
> index 5c0a238..6b941cb 100644
> --- a/lib/nx-match.def
> +++ b/lib/nx-match.def
> @@ -35,8 +35,8 @@ DEFINE_FIELD  (OF_TCP_SRC,    MFF_TCP_SRC,    true)
>  DEFINE_FIELD  (OF_TCP_DST,    MFF_TCP_DST,    true)
>  DEFINE_FIELD  (OF_UDP_SRC,    MFF_UDP_SRC,    true)
>  DEFINE_FIELD  (OF_UDP_DST,    MFF_UDP_DST,    true)
> -DEFINE_FIELD  (OF_ICMP_TYPE,  MFF_ICMP_TYPE, false)
> -DEFINE_FIELD  (OF_ICMP_CODE,  MFF_ICMP_CODE, false)
> +DEFINE_FIELD  (OF_ICMP_TYPE,  MFF_ICMPV4_TYPE, false)
> +DEFINE_FIELD  (OF_ICMP_CODE,  MFF_ICMPV4_CODE, false)
>  DEFINE_FIELD  (OF_ARP_OP,     MFF_ARP_OP,    false)
>  DEFINE_FIELD_M(OF_ARP_SPA,    MFF_ARP_SPA,   false)
>  DEFINE_FIELD_M(OF_ARP_TPA,    MFF_ARP_TPA,   false)
> @@ -45,8 +45,8 @@ DEFINE_FIELD  (NX_ARP_THA,    MFF_ARP_THA,   false)
>  DEFINE_FIELD_M(NX_IPV6_SRC,   MFF_IPV6_SRC,  false)
>  DEFINE_FIELD_M(NX_IPV6_DST,   MFF_IPV6_DST,  false)
>  /* XXX should we have MFF_ICMPV4_TYPE and MFF_ICMPV6_TYPE? */
> -DEFINE_FIELD  (NX_ICMPV6_TYPE,MFF_ICMP_TYPE, false)
> -DEFINE_FIELD  (NX_ICMPV6_CODE,MFF_ICMP_CODE, false)
> +DEFINE_FIELD  (NX_ICMPV6_TYPE,MFF_ICMPV6_TYPE, false)
> +DEFINE_FIELD  (NX_ICMPV6_CODE,MFF_ICMPV6_CODE, false)
>  DEFINE_FIELD  (NX_ND_TARGET,  MFF_ND_TARGET, false)
>  DEFINE_FIELD  (NX_ND_SLL,     MFF_ND_SLL,    false)
>  DEFINE_FIELD  (NX_ND_TLL,     MFF_ND_TLL,    false)
> --
> 1.7.2.5
>
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev
>



More information about the dev mailing list