mirror of
https://github.com/openvswitch/ovs
synced 2025-10-07 13:40:45 +00:00
Add OXM_OF_METADATA field as a step toward OpenFlow 1.1 support.
Signed-off-by: Joe Stringer <joe@wand.net.nz> Signed-off-by: Ben Pfaff <blp@nicira.com>
This commit is contained in:
@@ -118,6 +118,20 @@ cls_rule_set_reg_masked(struct cls_rule *rule, unsigned int reg_idx,
|
||||
rule->flow.regs[reg_idx] = value & mask;
|
||||
}
|
||||
|
||||
void
|
||||
cls_rule_set_metadata(struct cls_rule *rule, ovs_be64 metadata)
|
||||
{
|
||||
cls_rule_set_metadata_masked(rule, metadata, htonll(UINT64_MAX));
|
||||
}
|
||||
|
||||
void
|
||||
cls_rule_set_metadata_masked(struct cls_rule *rule, ovs_be64 metadata,
|
||||
ovs_be64 mask)
|
||||
{
|
||||
rule->wc.metadata_mask = mask;
|
||||
rule->flow.metadata = metadata & mask;
|
||||
}
|
||||
|
||||
void
|
||||
cls_rule_set_tun_id(struct cls_rule *rule, ovs_be64 tun_id)
|
||||
{
|
||||
@@ -525,7 +539,7 @@ cls_rule_format(const struct cls_rule *rule, struct ds *s)
|
||||
|
||||
int i;
|
||||
|
||||
BUILD_ASSERT_DECL(FLOW_WC_SEQ == 11);
|
||||
BUILD_ASSERT_DECL(FLOW_WC_SEQ == 12);
|
||||
|
||||
if (rule->priority != OFP_DEFAULT_PRIORITY) {
|
||||
ds_put_format(s, "priority=%d,", rule->priority);
|
||||
@@ -595,6 +609,17 @@ cls_rule_format(const struct cls_rule *rule, struct ds *s)
|
||||
ntohll(f->tun_id), ntohll(wc->tun_id_mask));
|
||||
break;
|
||||
}
|
||||
switch (wc->metadata_mask) {
|
||||
case 0:
|
||||
break;
|
||||
case CONSTANT_HTONLL(UINT64_MAX):
|
||||
ds_put_format(s, "metadata=%#"PRIx64",", ntohll(f->metadata));
|
||||
break;
|
||||
default:
|
||||
ds_put_format(s, "metadata=%#"PRIx64"/%#"PRIx64",",
|
||||
ntohll(f->metadata), ntohll(wc->metadata_mask));
|
||||
break;
|
||||
}
|
||||
if (!(w & FWW_IN_PORT)) {
|
||||
ds_put_format(s, "in_port=%"PRIu16",", f->in_port);
|
||||
}
|
||||
@@ -1188,7 +1213,7 @@ flow_equal_except(const struct flow *a, const struct flow *b,
|
||||
const flow_wildcards_t wc = wildcards->wildcards;
|
||||
int i;
|
||||
|
||||
BUILD_ASSERT_DECL(FLOW_WC_SEQ == 11);
|
||||
BUILD_ASSERT_DECL(FLOW_WC_SEQ == 12);
|
||||
|
||||
for (i = 0; i < FLOW_N_REGS; i++) {
|
||||
if ((a->regs[i] ^ b->regs[i]) & wildcards->reg_masks[i]) {
|
||||
@@ -1197,6 +1222,7 @@ flow_equal_except(const struct flow *a, const struct flow *b,
|
||||
}
|
||||
|
||||
return (!((a->tun_id ^ b->tun_id) & wildcards->tun_id_mask)
|
||||
&& !((a->metadata ^ b->metadata) & wildcards->metadata_mask)
|
||||
&& !((a->nw_src ^ b->nw_src) & wildcards->nw_src_mask)
|
||||
&& !((a->nw_dst ^ b->nw_dst) & wildcards->nw_dst_mask)
|
||||
&& (wc & FWW_IN_PORT || a->in_port == b->in_port)
|
||||
|
Reference in New Issue
Block a user