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