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