Hi Ben,

I confirmed it works well!

Thanks so much!

...hiroshi miyata

(13/04/17 9:04), miyahiro.d...@gmail.com wrote:
> Hi Ben,
>
> Thanks, I will try the patch!
> I will sent you the result shortly.
>
> Best Regards,
>
> ...hiroshi miyata
>
> (13/04/16 6:02), Ben Pfaff wrote:
>> NXM puts the DSCP value in bits 2-7 of NXM_OF_IP_TOS.
>> OXM puts the DSCP value in bits 0-6 of OXM_OF_IP_DSCP.
>>
>> Before this commit, Open vSwitch incorrectly implemented OXM_OF_IP_DSCP
>> with the same format as NXM_OF_IP_TOS.  This commit fixes the problem and
>> adds a test (previously missing but I don't know why).
>>
>> Reported-by: Hiroshi Miyata <miyahiro.d...@gmail.com>
>> Signed-off-by: Ben Pfaff <b...@nicira.com>
>> ---
>>  AUTHORS            |    1 +
>>  lib/meta-flow.c    |   31 +++++++++++++++++++++++++++++++
>>  lib/meta-flow.h    |   12 +++++++++++-
>>  lib/nx-match.c     |    9 ++++++---
>>  tests/ovs-ofctl.at |   12 ++++++++++++
>>  5 files changed, 61 insertions(+), 4 deletions(-)
>>
>> diff --git a/AUTHORS b/AUTHORS
>> index f9343de..b30fd69 100644
>> --- a/AUTHORS
>> +++ b/AUTHORS
>> @@ -139,6 +139,7 @@ Hassan Khan             hassan.k...@seecs.edu.pk
>>  Hector Oron             hector.o...@gmail.com
>>  Henrik Amren            hen...@nicira.com
>>  Hiroshi Tanaka          htan...@nicira.com
>> +Hiroshi Miyata          miyahiro.d...@gmail.com
>>  Igor Ganichev           iganic...@nicira.com
>>  Jacob Cherkas           jcher...@nicira.com
>>  Jad Naous               jna...@gmail.com
>> diff --git a/lib/meta-flow.c b/lib/meta-flow.c
>> index 6f7a3aa..9296faa 100644
>> --- a/lib/meta-flow.c
>> +++ b/lib/meta-flow.c
>> @@ -359,6 +359,15 @@ static const struct mf_field mf_fields[MFF_N_IDS] = {
>>          MFP_IP_ANY,
>>          true,
>>          NXM_OF_IP_TOS, "NXM_OF_IP_TOS",
>> +        NXM_OF_IP_TOS, "NXM_OF_IP_TOS",
>> +    }, {
>> +        MFF_IP_DSCP_SHIFTED, "nw_tos_shifted", NULL,
>> +        MF_FIELD_SIZES(u8),
>> +        MFM_NONE,
>> +        MFS_DECIMAL,
>> +        MFP_IP_ANY,
>> +        true,
>> +        OXM_OF_IP_DSCP, "OXM_OF_IP_DSCP",
>>          OXM_OF_IP_DSCP, "OXM_OF_IP_DSCP",
>>      }, {
>>          MFF_IP_ECN, "nw_ecn", NULL,
>> @@ -733,6 +742,7 @@ mf_is_all_wild(const struct mf_field *mf, const struct 
>> flow_wildcards *wc)
>>      case MFF_IP_PROTO:
>>          return !wc->masks.nw_proto;
>>      case MFF_IP_DSCP:
>> +    case MFF_IP_DSCP_SHIFTED:
>>          return !(wc->masks.nw_tos & IP_DSCP_MASK);
>>      case MFF_IP_ECN:
>>          return !(wc->masks.nw_tos & IP_ECN_MASK);
>> @@ -916,6 +926,8 @@ mf_is_value_valid(const struct mf_field *mf, const union 
>> mf_value *value)
>>  
>>      case MFF_IP_DSCP:
>>          return !(value->u8 & ~IP_DSCP_MASK);
>> +    case MFF_IP_DSCP_SHIFTED:
>> +        return !(value->u8 & (~IP_DSCP_MASK >> 2));
>>      case MFF_IP_ECN:
>>          return !(value->u8 & ~IP_ECN_MASK);
>>      case MFF_IP_FRAG:
>> @@ -1065,6 +1077,10 @@ mf_get_value(const struct mf_field *mf, const struct 
>> flow *flow,
>>          value->u8 = flow->nw_tos & IP_DSCP_MASK;
>>          break;
>>  
>> +    case MFF_IP_DSCP_SHIFTED:
>> +        value->u8 = flow->nw_tos >> 2;
>> +        break;
>> +
>>      case MFF_IP_ECN:
>>          value->u8 = flow->nw_tos & IP_ECN_MASK;
>>          break;
>> @@ -1244,6 +1260,10 @@ mf_set_value(const struct mf_field *mf,
>>          match_set_nw_dscp(match, value->u8);
>>          break;
>>  
>> +    case MFF_IP_DSCP_SHIFTED:
>> +        match_set_nw_dscp(match, value->u8 << 2);
>> +        break;
>> +
>>      case MFF_IP_ECN:
>>          match_set_nw_ecn(match, value->u8);
>>          break;
>> @@ -1424,6 +1444,11 @@ mf_set_flow_value(const struct mf_field *mf,
>>          flow->nw_tos |= value->u8 & IP_DSCP_MASK;
>>          break;
>>  
>> +    case MFF_IP_DSCP_SHIFTED:
>> +        flow->nw_tos &= ~IP_DSCP_MASK;
>> +        flow->nw_tos |= value->u8 << 2;
>> +        break;
>> +
>>      case MFF_IP_ECN:
>>          flow->nw_tos &= ~IP_ECN_MASK;
>>          flow->nw_tos |= value->u8 & IP_ECN_MASK;
>> @@ -1624,6 +1649,7 @@ mf_set_wild(const struct mf_field *mf, struct match 
>> *match)
>>          break;
>>  
>>      case MFF_IP_DSCP:
>> +    case MFF_IP_DSCP_SHIFTED:
>>          match->wc.masks.nw_tos &= ~IP_DSCP_MASK;
>>          match->flow.nw_tos &= ~IP_DSCP_MASK;
>>          break;
>> @@ -1726,6 +1752,7 @@ mf_set(const struct mf_field *mf,
>>      case MFF_IP_PROTO:
>>      case MFF_IP_TTL:
>>      case MFF_IP_DSCP:
>> +    case MFF_IP_DSCP_SHIFTED:
>>      case MFF_IP_ECN:
>>      case MFF_ARP_OP:
>>      case MFF_ICMPV4_TYPE:
>> @@ -1956,6 +1983,10 @@ mf_random_value(const struct mf_field *mf, union 
>> mf_value *value)
>>          value->u8 &= IP_DSCP_MASK;
>>          break;
>>  
>> +    case MFF_IP_DSCP_SHIFTED:
>> +        value->u8 &= IP_DSCP_MASK >> 2;
>> +        break;
>> +
>>      case MFF_IP_ECN:
>>          value->u8 &= IP_ECN_MASK;
>>          break;
>> diff --git a/lib/meta-flow.h b/lib/meta-flow.h
>> index 57f6df5..9577a10 100644
>> --- a/lib/meta-flow.h
>> +++ b/lib/meta-flow.h
>> @@ -1,5 +1,5 @@
>>  /*
>> - * Copyright (c) 2011, 2012 Nicira, Inc.
>> + * Copyright (c) 2011, 2012, 2013 Nicira, Inc.
>>   *
>>   * Licensed under the Apache License, Version 2.0 (the "License");
>>   * you may not use this file except in compliance with the License.
>> @@ -91,8 +91,18 @@ enum mf_field_id {
>>      MFF_IPV6_DST,               /* ipv6 */
>>      MFF_IPV6_LABEL,             /* be32 */
>>  
>> +    /* The IPv4/IPv6 DSCP field has two different views:
>> +     *
>> +     *   - MFF_IP_DSCP has the DSCP in bits 2-7, their bit positions in the
>> +     *     IPv4 and IPv6 "traffic class" field, as used in OpenFlow 1.0 and 
>> 1.1
>> +     *     flow format and in NXM's NXM_OF_IP_TOS
>> +     *
>> +     *   - MFF_IP_DSCP has the DSCP in bits 0-5, shifted right two bits from
>> +     *     their positions in the IPv4 and IPv6 "traffic class" field, as 
>> used
>> +     *     in OpenFlow 1.2+ OXM's OXM_OF_IP_DSCP. */
>>      MFF_IP_PROTO,               /* u8 (used for IPv4 or IPv6) */
>>      MFF_IP_DSCP,                /* u8 (used for IPv4 or IPv6) */
>> +    MFF_IP_DSCP_SHIFTED,        /* u8 (used for IPv4 or IPv6) (OF1.2 
>> compat) */
>>      MFF_IP_ECN,                 /* u8 (used for IPv4 or IPv6) */
>>      MFF_IP_TTL,                 /* u8 (used for IPv4 or IPv6) */
>>      MFF_IP_FRAG,                /* u8 (used for IPv4 or IPv6) */
>> diff --git a/lib/nx-match.c b/lib/nx-match.c
>> index bfead68..b328f02 100644
>> --- a/lib/nx-match.c
>> +++ b/lib/nx-match.c
>> @@ -1,5 +1,5 @@
>>  /*
>> - * Copyright (c) 2010, 2011, 2012 Nicira, Inc.
>> + * Copyright (c) 2010, 2011, 2012, 2013 Nicira, Inc.
>>   *
>>   * Licensed under the Apache License, Version 2.0 (the "License");
>>   * you may not use this file except in compliance with the License.
>> @@ -517,8 +517,11 @@ nxm_put_ip(struct ofpbuf *b, const struct match *match,
>>      nxm_put_frag(b, match);
>>  
>>      if (match->wc.masks.nw_tos & IP_DSCP_MASK) {
>> -        nxm_put_8(b, oxm ? OXM_OF_IP_DSCP : NXM_OF_IP_TOS,
>> -                  flow->nw_tos & IP_DSCP_MASK);
>> +        if (oxm) {
>> +            nxm_put_8(b, OXM_OF_IP_DSCP, flow->nw_tos >> 2);
>> +        } else {
>> +            nxm_put_8(b, NXM_OF_IP_TOS, flow->nw_tos & IP_DSCP_MASK);
>> +        }
>>      }
>>  
>>      if (match->wc.masks.nw_tos & IP_ECN_MASK) {
>> diff --git a/tests/ovs-ofctl.at b/tests/ovs-ofctl.at
>> index 075f2e4..d62b085 100644
>> --- a/tests/ovs-ofctl.at
>> +++ b/tests/ovs-ofctl.at
>> @@ -1466,6 +1466,12 @@ OXM_OF_VLAN_VID_W(1123/1f0f), OXM_OF_VLAN_PCP(01)  # 
>> Packets with VID=123 (maske
>>  OXM_OF_VLAN_VID_W(1000/1000)    # Packets with any VID, any PCP
>>  OXM_OF_VLAN_VID_W(1000/1000), OXM_OF_VLAN_PCP(01)  # Packets with any VID, 
>> PCP=1.
>>  
>> +# IP TOS
>> +OXM_OF_ETH_TYPE(0800) OXM_OF_IP_DSCP(f0)
>> +OXM_OF_ETH_TYPE(0800) OXM_OF_IP_DSCP(41)
>> +OXM_OF_ETH_TYPE(0800) OXM_OF_IP_DSCP(3f)
>> +OXM_OF_IP_DSCP(f0)
>> +
>>  # IP ECN
>>  OXM_OF_ETH_TYPE(0800) OXM_OF_IP_ECN(03)
>>  OXM_OF_ETH_TYPE(0800) OXM_OF_IP_ECN(06)
>> @@ -1662,6 +1668,12 @@ OXM_OF_VLAN_VID_W(1103/1f0f), OXM_OF_VLAN_PCP(01)
>>  OXM_OF_VLAN_VID_W(1000/1000)
>>  OXM_OF_VLAN_VID_W(1000/1000), OXM_OF_VLAN_PCP(01)
>>  
>> +# IP TOS
>> +nx_pull_match() returned error OFPBMC_BAD_VALUE
>> +nx_pull_match() returned error OFPBMC_BAD_VALUE
>> +OXM_OF_ETH_TYPE(0800), OXM_OF_IP_DSCP(3f)
>> +nx_pull_match() returned error OFPBMC_BAD_PREREQ
>> +
>>  # IP ECN
>>  OXM_OF_ETH_TYPE(0800), OXM_OF_IP_ECN(03)
>>  nx_pull_match() returned error OFPBMC_BAD_VALUE

_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to