X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;f=lib%2Fmeta-flow.c;h=2ac2ec9cb28154a401fefa88ffb5a570d17fa662;hb=07659514c3c1e8998a4935a998b627d716c559f9;hp=9778bff8ed0bf98dde25fedc5eab317688990a8e;hpb=f3cd3ac7d1209f445fab07d5cf52ef46661b91bd;p=cascardo%2Fovs.git diff --git a/lib/meta-flow.c b/lib/meta-flow.c index 9778bff8e..2ac2ec9cb 100644 --- a/lib/meta-flow.c +++ b/lib/meta-flow.c @@ -214,6 +214,10 @@ mf_is_all_wild(const struct mf_field *mf, const struct flow_wildcards *wc) return !wc->masks.skb_priority; case MFF_PKT_MARK: return !wc->masks.pkt_mark; + case MFF_CT_STATE: + return !wc->masks.ct_state; + case MFF_CT_ZONE: + return !wc->masks.ct_zone; CASE_MFF_REGS: return !wc->masks.regs[mf->id - MFF_REG0]; CASE_MFF_XREGS: @@ -497,6 +501,7 @@ mf_is_value_valid(const struct mf_field *mf, const union mf_value *value) case MFF_IN_PORT: case MFF_SKB_PRIORITY: case MFF_PKT_MARK: + case MFF_CT_ZONE: CASE_MFF_REGS: CASE_MFF_XREGS: case MFF_ETH_SRC: @@ -572,6 +577,9 @@ mf_is_value_valid(const struct mf_field *mf, const union mf_value *value) case MFF_TUN_FLAGS: return !(value->be16 & ~htons(FLOW_TNL_PUB_F_MASK)); + case MFF_CT_STATE: + return !(value->be32 & ~htonl(CS_SUPPORTED_MASK)); + case MFF_N_IDS: default: OVS_NOT_REACHED(); @@ -644,6 +652,14 @@ mf_get_value(const struct mf_field *mf, const struct flow *flow, value->be32 = htonl(flow->pkt_mark); break; + case MFF_CT_STATE: + value->be32 = htonl(flow->ct_state); + break; + + case MFF_CT_ZONE: + value->be16 = htons(flow->ct_zone); + break; + CASE_MFF_REGS: value->be32 = htonl(flow->regs[mf->id - MFF_REG0]); break; @@ -876,6 +892,14 @@ mf_set_value(const struct mf_field *mf, match_set_pkt_mark(match, ntohl(value->be32)); break; + case MFF_CT_STATE: + match_set_ct_state(match, ntohl(value->be32)); + break; + + case MFF_CT_ZONE: + match_set_ct_zone(match, ntohs(value->be16)); + break; + CASE_MFF_REGS: match_set_reg(match, mf->id - MFF_REG0, ntohl(value->be32)); break; @@ -1160,6 +1184,14 @@ mf_set_flow_value(const struct mf_field *mf, flow->pkt_mark = ntohl(value->be32); break; + case MFF_CT_STATE: + flow->ct_state = ntohl(value->be32); + break; + + case MFF_CT_ZONE: + flow->ct_zone = ntohs(value->be16); + break; + CASE_MFF_REGS: flow->regs[mf->id - MFF_REG0] = ntohl(value->be32); break; @@ -1449,6 +1481,16 @@ mf_set_wild(const struct mf_field *mf, struct match *match, char **err_str) match->wc.masks.pkt_mark = 0; break; + case MFF_CT_STATE: + match->flow.ct_state = 0; + match->wc.masks.ct_state = 0; + break; + + case MFF_CT_ZONE: + match->flow.ct_zone = 0; + match->wc.masks.ct_zone = 0; + break; + CASE_MFF_REGS: match_set_reg_masked(match, mf->id - MFF_REG0, 0, 0); break; @@ -1640,6 +1682,7 @@ mf_set(const struct mf_field *mf, } switch (mf->id) { + case MFF_CT_ZONE: case MFF_RECIRC_ID: case MFF_CONJ_ID: case MFF_IN_PORT: @@ -1715,6 +1758,10 @@ mf_set(const struct mf_field *mf, ntohl(mask->be32)); break; + case MFF_CT_STATE: + match_set_ct_state_masked(match, ntohl(value->be32), ntohl(mask->be32)); + break; + case MFF_ETH_DST: match_set_dl_dst_masked(match, value->mac, mask->mac); break; @@ -2107,6 +2154,27 @@ mf_from_tun_flags_string(const char *s, ovs_be16 *flagsp, ovs_be16 *maskp) htons(FLOW_TNL_PUB_F_MASK), maskp); } +static char * +mf_from_ct_state_string(const char *s, ovs_be32 *flagsp, ovs_be32 *maskp) +{ + int err; + char *err_str; + uint32_t flags, mask; + + err = parse_flags(s, ct_state_to_string, '\0', "ct_state", &err_str, + &flags, CS_SUPPORTED_MASK, maskp ? &mask : NULL); + if (err < 0) { + return err_str; + } + + *flagsp = htonl(flags); + if (maskp) { + *maskp = htonl(mask); + } + + return NULL; +} + /* Parses 's', a string value for field 'mf', into 'value' and 'mask'. Returns * NULL if successful, otherwise a malloc()'d string describing the error. */ char * @@ -2128,6 +2196,11 @@ mf_parse(const struct mf_field *mf, const char *s, (uint8_t *) value, (uint8_t *) mask); break; + case MFS_CT_STATE: + ovs_assert(mf->n_bytes == sizeof(ovs_be32)); + error = mf_from_ct_state_string(s, &value->be32, &mask->be32); + break; + case MFS_ETHERNET: error = mf_from_ethernet_string(mf, s, &value->mac, &mask->mac); break; @@ -2248,6 +2321,13 @@ mf_format_tcp_flags_string(ovs_be16 value, ovs_be16 mask, struct ds *s) TCP_FLAGS(mask), TCP_FLAGS(OVS_BE16_MAX)); } +static void +mf_format_ct_state_string(ovs_be32 value, ovs_be32 mask, struct ds *s) +{ + format_flags_masked(s, NULL, ct_state_to_string, ntohl(value), + ntohl(mask), UINT16_MAX); +} + /* Appends to 's' a string representation of field 'mf' whose value is in * 'value' and 'mask'. 'mask' may be NULL to indicate an exact match. */ void @@ -2284,6 +2364,11 @@ mf_format(const struct mf_field *mf, mf_format_integer_string(mf, (uint8_t *) value, (uint8_t *) mask, s); break; + case MFS_CT_STATE: + mf_format_ct_state_string(value->be32, + mask ? mask->be32 : OVS_BE32_MAX, s); + break; + case MFS_ETHERNET: eth_format_masked(value->mac, mask ? &mask->mac : NULL, s); break;