flow->nw_proto = 0;
}
flow->ipv6_label &= wildcards->ipv6_label_mask;
- if (wc & FWW_NW_DSCP) {
- flow->nw_tos &= ~IP_DSCP_MASK;
- }
- if (wc & FWW_NW_ECN) {
- flow->nw_tos &= ~IP_ECN_MASK;
- }
+ flow->nw_tos &= wildcards->nw_tos_mask;
if (wc & FWW_NW_TTL) {
flow->nw_ttl = 0;
}
memset(wc->dl_dst_mask, 0, ETH_ADDR_LEN);
memset(wc->arp_sha_mask, 0, ETH_ADDR_LEN);
memset(wc->arp_tha_mask, 0, ETH_ADDR_LEN);
- memset(wc->zeros, 0, sizeof wc->zeros);
+ wc->nw_tos_mask = 0;
}
/* Initializes 'wc' as an exact-match set of wildcards; that is, 'wc' does not
memset(wc->dl_dst_mask, 0xff, ETH_ADDR_LEN);
memset(wc->arp_sha_mask, 0xff, ETH_ADDR_LEN);
memset(wc->arp_tha_mask, 0xff, ETH_ADDR_LEN);
- memset(wc->zeros, 0, sizeof wc->zeros);
+ wc->nw_tos_mask = UINT8_MAX;
}
/* Returns true if 'wc' is exact-match, false if 'wc' wildcards any bits or
|| !ipv6_mask_is_exact(&wc->ipv6_dst_mask)
|| wc->ipv6_label_mask != htonl(UINT32_MAX)
|| !ipv6_mask_is_exact(&wc->nd_target_mask)
- || wc->nw_frag_mask != UINT8_MAX) {
+ || wc->nw_frag_mask != UINT8_MAX
+ || wc->nw_tos_mask != UINT8_MAX) {
return false;
}
|| !ipv6_mask_is_any(&wc->ipv6_dst_mask)
|| wc->ipv6_label_mask != htonl(0)
|| !ipv6_mask_is_any(&wc->nd_target_mask)
- || wc->nw_frag_mask != 0) {
+ || wc->nw_frag_mask != 0
+ || wc->nw_tos_mask != 0) {
return false;
}
eth_addr_bitand(src1->dl_dst_mask, src2->dl_dst_mask, dst->dl_dst_mask);
eth_addr_bitand(src1->arp_sha_mask, src2->arp_sha_mask, dst->arp_sha_mask);
eth_addr_bitand(src1->arp_tha_mask, src2->arp_tha_mask, dst->arp_tha_mask);
+ dst->nw_tos_mask = src1->nw_tos_mask & src2->nw_tos_mask;
}
/* Returns a hash of the wildcards in 'wc'. */
|| !eth_addr_equals(a->dl_src_mask, b->dl_src_mask)
|| !eth_addr_equals(a->dl_dst_mask, b->dl_dst_mask)
|| !eth_addr_equals(a->arp_sha_mask, b->arp_sha_mask)
- || !eth_addr_equals(a->arp_tha_mask, b->arp_tha_mask)) {
+ || !eth_addr_equals(a->arp_tha_mask, b->arp_tha_mask)
+ || a->nw_tos_mask != b->nw_tos_mask) {
return false;
}
|| (a->metadata_mask & b->metadata_mask) != b->metadata_mask
|| (a->tp_src_mask & b->tp_src_mask) != b->tp_src_mask
|| (a->tp_dst_mask & b->tp_dst_mask) != b->tp_dst_mask
- || (a->nw_frag_mask & b->nw_frag_mask) != b->nw_frag_mask);
+ || (a->nw_frag_mask & b->nw_frag_mask) != b->nw_frag_mask
+ || (a->nw_tos_mask & b->nw_tos_mask) != b->nw_tos_mask);
}
/* Sets the wildcard mask for register 'idx' in 'wc' to 'mask'.