diff options
author | Jarno Rajahalme <jarno@ovn.org> | 2017-03-08 17:18:23 -0800 |
---|---|---|
committer | Jarno Rajahalme <jarno@ovn.org> | 2017-03-08 17:23:15 -0800 |
commit | daf4d3c18da4356ea7469ea0b467278651c91baa (patch) | |
tree | c9e4e60ef890ce46a208aeacee98d35e919ef03c /lib/meta-flow.c | |
parent | 7befb20d0f70b1e695d3b14def9fef803ec3ae8d (diff) | |
download | openvswitch-daf4d3c18da4356ea7469ea0b467278651c91baa.tar.gz |
odp: Support conntrack orig tuple key.
Userspace support for datapath original direction conntrack tuple.
Signed-off-by: Jarno Rajahalme <jarno@ovn.org>
Acked-by: Joe Stringer <joe@ovn.org>
Diffstat (limited to 'lib/meta-flow.c')
-rw-r--r-- | lib/meta-flow.c | 157 |
1 files changed, 156 insertions, 1 deletions
diff --git a/lib/meta-flow.c b/lib/meta-flow.c index 9d635a368..38d051eb0 100644 --- a/lib/meta-flow.c +++ b/lib/meta-flow.c @@ -246,6 +246,20 @@ mf_is_all_wild(const struct mf_field *mf, const struct flow_wildcards *wc) return !wc->masks.ct_mark; case MFF_CT_LABEL: return ovs_u128_is_zero(wc->masks.ct_label); + case MFF_CT_NW_PROTO: + return !wc->masks.ct_nw_proto; + case MFF_CT_NW_SRC: + return !wc->masks.ct_nw_src; + case MFF_CT_NW_DST: + return !wc->masks.ct_nw_dst; + case MFF_CT_TP_SRC: + return !wc->masks.ct_tp_src; + case MFF_CT_TP_DST: + return !wc->masks.ct_tp_dst; + case MFF_CT_IPV6_SRC: + return ipv6_mask_is_any(&wc->masks.ct_ipv6_src); + case MFF_CT_IPV6_DST: + return ipv6_mask_is_any(&wc->masks.ct_ipv6_dst); CASE_MFF_REGS: return !wc->masks.regs[mf->id - MFF_REG0]; CASE_MFF_XREGS: @@ -383,7 +397,7 @@ mf_is_mask_valid(const struct mf_field *mf, const union mf_value *mask) * Sets inspected bits in 'wc', if non-NULL. */ static bool mf_are_prereqs_ok__(const struct mf_field *mf, const struct flow *flow, - const struct flow_wildcards *mask OVS_UNUSED, + const struct flow_wildcards *mask, struct flow_wildcards *wc) { switch (mf->prereqs) { @@ -402,6 +416,14 @@ mf_are_prereqs_ok__(const struct mf_field *mf, const struct flow *flow, return eth_type_mpls(flow->dl_type); case MFP_IP_ANY: return is_ip_any(flow); + case MFP_CT_VALID: + return is_ct_valid(flow, mask, wc); + case MFP_CTV4_VALID: + return flow->dl_type == htons(ETH_TYPE_IP) + && is_ct_valid(flow, mask, wc); + case MFP_CTV6_VALID: + return flow->dl_type == htons(ETH_TYPE_IPV6) + && is_ct_valid(flow, mask, wc); case MFP_TCP: /* Matching !FRAG_LATER is not enforced (mask is not checked). */ return is_tcp(flow, wc) && !(flow->nw_frag & FLOW_NW_FRAG_LATER); @@ -475,6 +497,13 @@ mf_is_value_valid(const struct mf_field *mf, const union mf_value *value) case MFF_CT_ZONE: case MFF_CT_MARK: case MFF_CT_LABEL: + case MFF_CT_NW_PROTO: + case MFF_CT_NW_SRC: + case MFF_CT_NW_DST: + case MFF_CT_IPV6_SRC: + case MFF_CT_IPV6_DST: + case MFF_CT_TP_SRC: + case MFF_CT_TP_DST: CASE_MFF_REGS: CASE_MFF_XREGS: CASE_MFF_XXREGS: @@ -649,6 +678,34 @@ mf_get_value(const struct mf_field *mf, const struct flow *flow, value->be128 = hton128(flow->ct_label); break; + case MFF_CT_NW_PROTO: + value->u8 = flow->ct_nw_proto; + break; + + case MFF_CT_NW_SRC: + value->be32 = flow->ct_nw_src; + break; + + case MFF_CT_NW_DST: + value->be32 = flow->ct_nw_dst; + break; + + case MFF_CT_IPV6_SRC: + value->ipv6 = flow->ct_ipv6_src; + break; + + case MFF_CT_IPV6_DST: + value->ipv6 = flow->ct_ipv6_dst; + break; + + case MFF_CT_TP_SRC: + value->be16 = flow->ct_tp_src; + break; + + case MFF_CT_TP_DST: + value->be16 = flow->ct_tp_dst; + break; + CASE_MFF_REGS: value->be32 = htonl(flow->regs[mf->id - MFF_REG0]); break; @@ -911,6 +968,34 @@ mf_set_value(const struct mf_field *mf, match_set_ct_label(match, ntoh128(value->be128)); break; + case MFF_CT_NW_PROTO: + match_set_ct_nw_proto(match, value->u8); + break; + + case MFF_CT_NW_SRC: + match_set_ct_nw_src(match, value->be32); + break; + + case MFF_CT_NW_DST: + match_set_ct_nw_dst(match, value->be32); + break; + + case MFF_CT_IPV6_SRC: + match_set_ct_ipv6_src(match, &value->ipv6); + break; + + case MFF_CT_IPV6_DST: + match_set_ct_ipv6_dst(match, &value->ipv6); + break; + + case MFF_CT_TP_SRC: + match_set_ct_tp_src(match, value->be16); + break; + + case MFF_CT_TP_DST: + match_set_ct_tp_dst(match, value->be16); + break; + CASE_MFF_REGS: match_set_reg(match, mf->id - MFF_REG0, ntohl(value->be32)); break; @@ -1242,6 +1327,34 @@ mf_set_flow_value(const struct mf_field *mf, flow->ct_label = ntoh128(value->be128); break; + case MFF_CT_NW_PROTO: + flow->ct_nw_proto = value->u8; + break; + + case MFF_CT_NW_SRC: + flow->ct_nw_src = value->be32; + break; + + case MFF_CT_NW_DST: + flow->ct_nw_dst = value->be32; + break; + + case MFF_CT_IPV6_SRC: + flow->ct_ipv6_src = value->ipv6; + break; + + case MFF_CT_IPV6_DST: + flow->ct_ipv6_dst = value->ipv6; + break; + + case MFF_CT_TP_SRC: + flow->ct_tp_src = value->be16; + break; + + case MFF_CT_TP_DST: + flow->ct_tp_dst = value->be16; + break; + CASE_MFF_REGS: flow->regs[mf->id - MFF_REG0] = ntohl(value->be32); break; @@ -1571,6 +1684,41 @@ mf_set_wild(const struct mf_field *mf, struct match *match, char **err_str) memset(&match->wc.masks.ct_label, 0, sizeof(match->wc.masks.ct_label)); break; + case MFF_CT_NW_PROTO: + match->flow.ct_nw_proto = 0; + match->wc.masks.ct_nw_proto = 0; + break; + + case MFF_CT_NW_SRC: + match->flow.ct_nw_src = 0; + match->wc.masks.ct_nw_src = 0; + break; + + case MFF_CT_NW_DST: + match->flow.ct_nw_dst = 0; + match->wc.masks.ct_nw_dst = 0; + break; + + case MFF_CT_IPV6_SRC: + memset(&match->flow.ct_ipv6_src, 0, sizeof(match->flow.ct_ipv6_src)); + WC_UNMASK_FIELD(&match->wc, ct_ipv6_src); + break; + + case MFF_CT_IPV6_DST: + memset(&match->flow.ct_ipv6_dst, 0, sizeof(match->flow.ct_ipv6_dst)); + WC_UNMASK_FIELD(&match->wc, ct_ipv6_dst); + break; + + case MFF_CT_TP_SRC: + match->flow.ct_tp_src = 0; + match->wc.masks.ct_tp_src = 0; + break; + + case MFF_CT_TP_DST: + match->flow.ct_tp_dst = 0; + match->wc.masks.ct_tp_dst = 0; + break; + CASE_MFF_REGS: match_set_reg_masked(match, mf->id - MFF_REG0, 0, 0); break; @@ -1773,6 +1921,13 @@ mf_set(const struct mf_field *mf, switch (mf->id) { case MFF_CT_ZONE: + case MFF_CT_NW_PROTO: + case MFF_CT_NW_SRC: + case MFF_CT_NW_DST: + case MFF_CT_IPV6_SRC: + case MFF_CT_IPV6_DST: + case MFF_CT_TP_SRC: + case MFF_CT_TP_DST: case MFF_RECIRC_ID: case MFF_CONJ_ID: case MFF_IN_PORT: |