X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;f=lib%2Fmeta-flow.c;h=05878ac15b7810feb45a97f5f77ab7877671a378;hb=9daf23484fb1f0d8fe8bf807a82c3d5b571a3dea;hp=ebc76ee7a7617a10d3d80e59b8d5a4334957bff5;hpb=8e53fe8cf7a178cf9702fb1bb916f4645058e5e7;p=cascardo%2Fovs.git diff --git a/lib/meta-flow.c b/lib/meta-flow.c index ebc76ee7a..05878ac15 100644 --- a/lib/meta-flow.c +++ b/lib/meta-flow.c @@ -220,6 +220,8 @@ mf_is_all_wild(const struct mf_field *mf, const struct flow_wildcards *wc) return !wc->masks.ct_zone; case MFF_CT_MARK: return !wc->masks.ct_mark; + case MFF_CT_LABEL: + return ovs_u128_is_zero(&wc->masks.ct_label); CASE_MFF_REGS: return !wc->masks.regs[mf->id - MFF_REG0]; CASE_MFF_XREGS: @@ -505,6 +507,7 @@ mf_is_value_valid(const struct mf_field *mf, const union mf_value *value) case MFF_PKT_MARK: case MFF_CT_ZONE: case MFF_CT_MARK: + case MFF_CT_LABEL: CASE_MFF_REGS: CASE_MFF_XREGS: case MFF_ETH_SRC: @@ -667,6 +670,10 @@ mf_get_value(const struct mf_field *mf, const struct flow *flow, value->be32 = htonl(flow->ct_mark); break; + case MFF_CT_LABEL: + hton128(&flow->ct_label, &value->be128); + break; + CASE_MFF_REGS: value->be32 = htonl(flow->regs[mf->id - MFF_REG0]); break; @@ -911,6 +918,14 @@ mf_set_value(const struct mf_field *mf, match_set_ct_mark(match, ntohl(value->be32)); break; + case MFF_CT_LABEL: { + ovs_u128 label; + + ntoh128(&value->be128, &label); + match_set_ct_label(match, label); + break; + } + CASE_MFF_REGS: match_set_reg(match, mf->id - MFF_REG0, ntohl(value->be32)); break; @@ -1207,6 +1222,10 @@ mf_set_flow_value(const struct mf_field *mf, flow->ct_mark = ntohl(value->be32); break; + case MFF_CT_LABEL: + ntoh128(&value->be128, &flow->ct_label); + break; + CASE_MFF_REGS: flow->regs[mf->id - MFF_REG0] = ntohl(value->be32); break; @@ -1511,6 +1530,11 @@ mf_set_wild(const struct mf_field *mf, struct match *match, char **err_str) match->wc.masks.ct_mark = 0; break; + case MFF_CT_LABEL: + memset(&match->flow.ct_label, 0, sizeof(match->flow.ct_label)); + memset(&match->wc.masks.ct_label, 0, sizeof(match->wc.masks.ct_label)); + break; + CASE_MFF_REGS: match_set_reg_masked(match, mf->id - MFF_REG0, 0, 0); break; @@ -1786,6 +1810,19 @@ mf_set(const struct mf_field *mf, match_set_ct_mark_masked(match, ntohl(value->be32), ntohl(mask->be32)); break; + case MFF_CT_LABEL: { + ovs_u128 hlabel, hmask; + + ntoh128(&value->be128, &hlabel); + if (mask) { + ntoh128(&mask->be128, &hmask); + } else { + hmask.u64.lo = hmask.u64.hi = UINT64_MAX; + } + match_set_ct_label_masked(match, hlabel, hmask); + break; + } + case MFF_ETH_DST: match_set_dl_dst_masked(match, value->mac, mask->mac); break;