void
match_set_tun_flags_masked(struct match *match, uint16_t flags, uint16_t mask)
{
+ mask &= FLOW_TNL_PUB_F_MASK;
+
match->wc.masks.tunnel.flags = mask;
match->flow.tunnel.flags = flags & mask;
}
/* Modifies 'value_src' so that the Ethernet address must match 'value_dst'
* exactly. 'mask_dst' is set to all 1s. */
static void
-set_eth(const uint8_t value_src[ETH_ADDR_LEN],
- uint8_t value_dst[ETH_ADDR_LEN],
- uint8_t mask_dst[ETH_ADDR_LEN])
+set_eth(const struct eth_addr value_src,
+ struct eth_addr *value_dst,
+ struct eth_addr *mask_dst)
{
- memcpy(value_dst, value_src, ETH_ADDR_LEN);
- memset(mask_dst, 0xff, ETH_ADDR_LEN);
+ *value_dst = value_src;
+ *mask_dst = eth_addr_exact;
}
/* Modifies 'value_src' so that the Ethernet address must match 'value_src'
* after each byte is ANDed with the appropriate byte in 'mask_src'.
* 'mask_dst' is set to 'mask_src' */
static void
-set_eth_masked(const uint8_t value_src[ETH_ADDR_LEN],
- const uint8_t mask_src[ETH_ADDR_LEN],
- uint8_t value_dst[ETH_ADDR_LEN],
- uint8_t mask_dst[ETH_ADDR_LEN])
+set_eth_masked(const struct eth_addr value_src,
+ const struct eth_addr mask_src,
+ struct eth_addr *value_dst, struct eth_addr *mask_dst)
{
size_t i;
- for (i = 0; i < ETH_ADDR_LEN; i++) {
- value_dst[i] = value_src[i] & mask_src[i];
- mask_dst[i] = mask_src[i];
+ for (i = 0; i < ARRAY_SIZE(value_dst->be16); i++) {
+ value_dst->be16[i] = value_src.be16[i] & mask_src.be16[i];
}
+ *mask_dst = mask_src;
}
/* Modifies 'rule' so that the source Ethernet address must match 'dl_src'
* exactly. */
void
-match_set_dl_src(struct match *match, const uint8_t dl_src[ETH_ADDR_LEN])
+match_set_dl_src(struct match *match, const struct eth_addr dl_src)
{
- set_eth(dl_src, match->flow.dl_src, match->wc.masks.dl_src);
+ set_eth(dl_src, &match->flow.dl_src, &match->wc.masks.dl_src);
}
/* Modifies 'rule' so that the source Ethernet address must match 'dl_src'
* after each byte is ANDed with the appropriate byte in 'mask'. */
void
match_set_dl_src_masked(struct match *match,
- const uint8_t dl_src[ETH_ADDR_LEN],
- const uint8_t mask[ETH_ADDR_LEN])
+ const struct eth_addr dl_src,
+ const struct eth_addr mask)
{
- set_eth_masked(dl_src, mask, match->flow.dl_src, match->wc.masks.dl_src);
+ set_eth_masked(dl_src, mask, &match->flow.dl_src, &match->wc.masks.dl_src);
}
/* Modifies 'match' so that the Ethernet address must match 'dl_dst'
* exactly. */
void
-match_set_dl_dst(struct match *match, const uint8_t dl_dst[ETH_ADDR_LEN])
+match_set_dl_dst(struct match *match, const struct eth_addr dl_dst)
{
- set_eth(dl_dst, match->flow.dl_dst, match->wc.masks.dl_dst);
+ set_eth(dl_dst, &match->flow.dl_dst, &match->wc.masks.dl_dst);
}
/* Modifies 'match' so that the Ethernet address must match 'dl_dst' after each
* accepted by flow_wildcards_is_dl_dst_mask_valid() are allowed. */
void
match_set_dl_dst_masked(struct match *match,
- const uint8_t dl_dst[ETH_ADDR_LEN],
- const uint8_t mask[ETH_ADDR_LEN])
+ const struct eth_addr dl_dst,
+ const struct eth_addr mask)
{
- set_eth_masked(dl_dst, mask, match->flow.dl_dst, match->wc.masks.dl_dst);
+ set_eth_masked(dl_dst, mask, &match->flow.dl_dst, &match->wc.masks.dl_dst);
}
void
}
void
-match_set_arp_sha(struct match *match, const uint8_t sha[ETH_ADDR_LEN])
+match_set_arp_sha(struct match *match, const struct eth_addr sha)
{
- memcpy(match->flow.arp_sha, sha, ETH_ADDR_LEN);
- memset(match->wc.masks.arp_sha, UINT8_MAX, ETH_ADDR_LEN);
+ match->flow.arp_sha = sha;
+ match->wc.masks.arp_sha = eth_addr_exact;
}
void
match_set_arp_sha_masked(struct match *match,
- const uint8_t arp_sha[ETH_ADDR_LEN],
- const uint8_t mask[ETH_ADDR_LEN])
+ const struct eth_addr arp_sha,
+ const struct eth_addr mask)
{
set_eth_masked(arp_sha, mask,
- match->flow.arp_sha, match->wc.masks.arp_sha);
+ &match->flow.arp_sha, &match->wc.masks.arp_sha);
}
void
-match_set_arp_tha(struct match *match, const uint8_t tha[ETH_ADDR_LEN])
+match_set_arp_tha(struct match *match, const struct eth_addr tha)
{
- memcpy(match->flow.arp_tha, tha, ETH_ADDR_LEN);
- memset(match->wc.masks.arp_tha, UINT8_MAX, ETH_ADDR_LEN);
+ match->flow.arp_tha = tha;
+ match->wc.masks.arp_tha = eth_addr_exact;
}
void
match_set_arp_tha_masked(struct match *match,
- const uint8_t arp_tha[ETH_ADDR_LEN],
- const uint8_t mask[ETH_ADDR_LEN])
+ const struct eth_addr arp_tha,
+ const struct eth_addr mask)
{
set_eth_masked(arp_tha, mask,
- match->flow.arp_tha, match->wc.masks.arp_tha);
+ &match->flow.arp_tha, &match->wc.masks.arp_tha);
}
void
static void
format_eth_masked(struct ds *s, const char *name,
- const uint8_t eth[ETH_ADDR_LEN],
- const uint8_t mask[ETH_ADDR_LEN])
+ const struct eth_addr eth, const struct eth_addr mask)
{
if (!eth_addr_is_zero(mask)) {
ds_put_format(s, "%s=", name);
- eth_format_masked(eth, mask, s);
+ eth_format_masked(eth, &mask, s);
ds_put_char(s, ',');
}
}
ds_put_format(s, "tun_ttl=%"PRIu8",", tnl->ip_ttl);
}
if (wc->masks.tunnel.flags) {
- format_flags(s, flow_tun_flag_to_string, tnl->flags, '|');
+ format_flags_masked(s, "tun_flags", flow_tun_flag_to_string,
+ tnl->flags,
+ wc->masks.tunnel.flags & FLOW_TNL_F_MASK,
+ FLOW_TNL_F_MASK);
ds_put_char(s, ',');
}
tun_metadata_match_format(s, match);
int i;
- BUILD_ASSERT_DECL(FLOW_WC_SEQ == 32);
+ BUILD_ASSERT_DECL(FLOW_WC_SEQ == 33);
if (priority != OFP_DEFAULT_PRIORITY) {
ds_put_format(s, "priority=%d,", priority);
format_be16_masked(s, "tp_dst", f->tp_dst, wc->masks.tp_dst);
}
if (is_ip_any(f) && f->nw_proto == IPPROTO_TCP && wc->masks.tcp_flags) {
- uint16_t mask = TCP_FLAGS(wc->masks.tcp_flags);
-
- if (mask == TCP_FLAGS(OVS_BE16_MAX)) {
- ds_put_cstr(s, "tcp_flags=");
- if (f->tcp_flags) {
- format_flags(s, packet_tcp_flag_to_string, ntohs(f->tcp_flags),
- '|');
- } else {
- ds_put_cstr(s, "0"); /* Zero flags. */
- }
- } else if (mask) {
- format_flags_masked(s, "tcp_flags", packet_tcp_flag_to_string,
- ntohs(f->tcp_flags), mask);
- }
+ format_flags_masked(s, "tcp_flags", packet_tcp_flag_to_string,
+ ntohs(f->tcp_flags), TCP_FLAGS(wc->masks.tcp_flags),
+ TCP_FLAGS(OVS_BE16_MAX));
}
if (s->length > start_len) {
/* Allocate two consecutive miniflows. */
size_t data_size = miniflow_alloc(dst->flows, 2, &src->mask->masks);
- memcpy(dst->flow->values, src->flow->values, data_size);
- memcpy(dst->mask->masks.values, src->mask->masks.values, data_size);
+ memcpy(miniflow_values(dst->flow),
+ miniflow_get_values(src->flow), data_size);
+ memcpy(miniflow_values(&dst->mask->masks),
+ miniflow_get_values(&src->mask->masks), data_size);
}
/* Initializes 'dst' with the data in 'src', destroying 'src'. The caller must
minimatch_matches_flow(const struct minimatch *match,
const struct flow *target)
{
- const uint64_t *target_u64 = (const uint64_t *) target;
- const uint64_t *flowp = match->flow->values;
- const uint64_t *maskp = match->mask->masks.values;
- int idx;
+ const uint64_t *flowp = miniflow_get_values(match->flow);
+ const uint64_t *maskp = miniflow_get_values(&match->mask->masks);
+ size_t idx;
- MAP_FOR_EACH_INDEX(idx, match->flow->map) {
- if ((*flowp++ ^ target_u64[idx]) & *maskp++) {
+ FLOWMAP_FOR_EACH_INDEX(idx, match->flow->map) {
+ if ((*flowp++ ^ flow_u64_value(target, idx)) & *maskp++) {
return false;
}
}