void
ofputil_wildcard_from_openflow(uint32_t ofpfw, struct flow_wildcards *wc)
{
- BUILD_ASSERT_DECL(FLOW_WC_SEQ == 6);
+ BUILD_ASSERT_DECL(FLOW_WC_SEQ == 7);
/* Initialize most of rule->wc. */
flow_wildcards_init_catchall(wc);
wc->wildcards = (OVS_FORCE flow_wildcards_t) ofpfw & WC_INVARIANTS;
/* Wildcard fields that aren't defined by ofp_match or tun_id. */
- wc->wildcards |= (FWW_ARP_SHA | FWW_ARP_THA | FWW_NW_TTL
+ wc->wildcards |= (FWW_ARP_SHA | FWW_ARP_THA | FWW_NW_ECN | FWW_NW_TTL
| FWW_ND_TARGET | FWW_IPV6_LABEL);
- if (!(ofpfw & OFPFW_NW_TOS)) {
- wc->nw_tos_mask |= IP_DSCP_MASK;
+ if (ofpfw & OFPFW_NW_TOS) {
+ /* OpenFlow 1.0 defines a TOS wildcard, but it's much later in
+ * the enum than we can use. */
+ wc->wildcards |= FWW_NW_DSCP;
}
wc->nw_src_mask = ofputil_wcbits_to_netmask(ofpfw >> OFPFW_NW_SRC_SHIFT);
ofpfw = (OVS_FORCE uint32_t) (wc->wildcards & WC_INVARIANTS);
ofpfw |= ofputil_netmask_to_wcbits(wc->nw_src_mask) << OFPFW_NW_SRC_SHIFT;
ofpfw |= ofputil_netmask_to_wcbits(wc->nw_dst_mask) << OFPFW_NW_DST_SHIFT;
- if (!(wc->nw_tos_mask & IP_DSCP_MASK)) {
+ if (wc->wildcards & FWW_NW_DSCP) {
ofpfw |= OFPFW_NW_TOS;
}
{
const struct flow_wildcards *wc = &rule->wc;
- BUILD_ASSERT_DECL(FLOW_WC_SEQ == 6);
+ BUILD_ASSERT_DECL(FLOW_WC_SEQ == 7);
/* Only NXM supports separately wildcards the Ethernet multicast bit. */
if (!(wc->wildcards & FWW_DL_DST) != !(wc->wildcards & FWW_ETH_MCAST)) {
}
/* Only NXM supports matching IP ECN bits. */
- if (wc->nw_tos_mask & IP_ECN_MASK) {
+ if (!(wc->wildcards & FWW_NW_ECN)) {
return NXFF_NXM;
}
MAY_IPVx = 1 << 3, /* tos, frag, ttl */
MAY_ARP_SHA = 1 << 4, /* arp_sha */
MAY_ARP_THA = 1 << 5, /* arp_tha */
- MAY_IPV6_ADDR = 1 << 6, /* ipv6_src, ipv6_dst */
+ MAY_IPV6 = 1 << 6, /* ipv6_src, ipv6_dst, ipv6_label */
MAY_ND_TARGET = 1 << 7 /* nd_target */
} may_match;
}
} else if (rule->flow.dl_type == htons(ETH_TYPE_IPV6)
&& flow_format == NXFF_NXM) {
- may_match = MAY_NW_PROTO | MAY_IPVx | MAY_IPV6_ADDR;
+ may_match = MAY_NW_PROTO | MAY_IPVx | MAY_IPV6;
if (rule->flow.nw_proto == IPPROTO_TCP ||
rule->flow.nw_proto == IPPROTO_UDP) {
may_match |= MAY_TP_ADDR;
wc.wildcards |= FWW_NW_PROTO;
}
if (!(may_match & MAY_IPVx)) {
- wc.nw_tos_mask = 0;
- wc.nw_frag_mask = 0;
+ wc.wildcards |= FWW_NW_DSCP;
+ wc.wildcards |= FWW_NW_ECN;
wc.wildcards |= FWW_NW_TTL;
}
if (!(may_match & MAY_ARP_SHA)) {
if (!(may_match & MAY_ARP_THA)) {
wc.wildcards |= FWW_ARP_THA;
}
- if (!(may_match & MAY_IPV6_ADDR)) {
+ if (!(may_match & MAY_IPV6)) {
wc.ipv6_src_mask = wc.ipv6_dst_mask = in6addr_any;
wc.wildcards |= FWW_IPV6_LABEL;
}