Thanks, I applied this to master.
On Thu, Apr 18, 2013 at 07:26:35PM +0900, Hiroshi Miyata wrote: > 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