This patch adds logging support for skb_mark and skb_priority. Signed-off-by: Ansis Atteka --- lib/match.c | 30 +++++++++++++++++++++++ lib/match.h | 2 ++ lib/meta-flow.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++ lib/meta-flow.h | 2 ++ lib/ofp-util.c | 5 ++++ tests/ovs-ofctl.at | 12 ++++++++++ 6 files changed, 119 insertions(+)
diff --git a/lib/match.c b/lib/match.c index 9eb121d..f2d451c 100644 --- a/lib/match.c +++ b/lib/match.c @@ -56,6 +56,14 @@ match_wc_init(struct match *match, const struct flow *flow) memset(&wc->masks.nw_proto, 0xff, sizeof wc->masks.nw_proto); } + if (flow->skb_priority) { + memset(&wc->masks.skb_priority, 0xff, sizeof wc->masks.skb_priority); + } + + if (flow->skb_mark) { + memset(&wc->masks.skb_mark, 0xff, sizeof wc->masks.skb_mark); + } + for (i = 0; i < FLOW_N_REGS; i++) { if (flow->regs[i]) { memset(&wc->masks.regs[i], 0xff, sizeof wc->masks.regs[i]); @@ -273,6 +281,20 @@ match_set_in_port(struct match *match, uint16_t ofp_port) } void +match_set_skb_priority(struct match *match, uint32_t skb_priority) +{ + match->wc.masks.skb_priority = UINT32_MAX; + match->flow.skb_priority = skb_priority; +} + +void +match_set_skb_mark(struct match *match, uint32_t skb_mark) +{ + match->wc.masks.skb_mark = UINT32_MAX; + match->flow.skb_mark = skb_mark; +} + +void match_set_dl_type(struct match *match, ovs_be16 dl_type) { match->wc.masks.dl_type = htons(UINT16_MAX); @@ -765,6 +787,14 @@ match_format(const struct match *match, struct ds *s, unsigned int priority) ds_put_format(s, "priority=%u,", priority); } + if (wc->masks.skb_mark) { + ds_put_format(s, "skb_mark=%"PRIu32",", f->skb_mark); + } + + if (wc->masks.skb_priority) { + ds_put_format(s, "skb_priority=%"PRIu32",", f->skb_priority); + } + if (wc->masks.dl_type) { skip_type = true; if (f->dl_type == htons(ETH_TYPE_IP)) { diff --git a/lib/match.h b/lib/match.h index fa3196a..ff0b5f2 100644 --- a/lib/match.h +++ b/lib/match.h @@ -61,6 +61,8 @@ void match_set_tun_tos_masked(struct match *match, uint8_t tos, uint8_t mask); void match_set_tun_flags(struct match *match, uint16_t flags); void match_set_tun_flags_masked(struct match *match, uint16_t flags, uint16_t mask); void match_set_in_port(struct match *, uint16_t ofp_port); +void match_set_skb_mark(struct match *, uint32_t skb_mark); +void match_set_skb_priority(struct match *, uint32_t skb_priority); void match_set_dl_type(struct match *, ovs_be16); void match_set_dl_src(struct match *, const uint8_t[6]); void match_set_dl_src_masked(struct match *, const uint8_t dl_src[6], diff --git a/lib/meta-flow.c b/lib/meta-flow.c index 749898f..a06c840 100644 --- a/lib/meta-flow.c +++ b/lib/meta-flow.c @@ -118,6 +118,24 @@ static const struct mf_field mf_fields[MFF_N_IDS] = { false, NXM_OF_IN_PORT, "NXM_OF_IN_PORT", OXM_OF_IN_PORT, "OXM_OF_IN_PORT", + }, { + MFF_SKB_PRIORITY, "skb_priority", NULL, + MF_FIELD_SIZES(be32), + MFM_NONE, + MFS_DECIMAL, + MFP_NONE, + false, + 0, NULL, + 0, NULL, + }, { + MFF_SKB_MARK, "skb_mark", NULL, + MF_FIELD_SIZES(be32), + MFM_NONE, + MFS_DECIMAL, + MFP_NONE, + false, + 0, NULL, + 0, NULL, }, #define REGISTER(IDX) \ @@ -629,6 +647,10 @@ mf_is_all_wild(const struct mf_field *mf, const struct flow_wildcards *wc) return !wc->masks.metadata; case MFF_IN_PORT: return !wc->masks.in_port; + case MFF_SKB_PRIORITY: + return !wc->masks.skb_priority; + case MFF_SKB_MARK: + return !wc->masks.skb_mark; CASE_MFF_REGS: return !wc->masks.regs[mf->id - MFF_REG0]; @@ -734,6 +756,12 @@ mf_get_mask(const struct mf_field *mf, const struct flow_wildcards *wc, case MFF_IN_PORT: mask->be16 = htons(wc->masks.in_port); break; + case MFF_SKB_PRIORITY: + mask->be32 = htonl(wc->masks.skb_priority); + break; + case MFF_SKB_MARK: + mask->be32 = htonl(wc->masks.skb_mark); + break; CASE_MFF_REGS: mask->be32 = htonl(wc->masks.regs[mf->id - MFF_REG0]); break; @@ -949,6 +977,8 @@ mf_is_value_valid(const struct mf_field *mf, const union mf_value *value) case MFF_TUN_FLAGS: case MFF_METADATA: case MFF_IN_PORT: + case MFF_SKB_PRIORITY: + case MFF_SKB_MARK: CASE_MFF_REGS: case MFF_ETH_SRC: case MFF_ETH_DST: @@ -1039,6 +1069,14 @@ mf_get_value(const struct mf_field *mf, const struct flow *flow, value->be16 = htons(flow->in_port); break; + case MFF_SKB_PRIORITY: + value->be32 = flow->skb_priority; + break; + + case MFF_SKB_MARK: + value->be32 = flow->skb_mark; + break; + CASE_MFF_REGS: value->be32 = htonl(flow->regs[mf->id - MFF_REG0]); break; @@ -1198,6 +1236,14 @@ mf_set_value(const struct mf_field *mf, match_set_in_port(match, ntohs(value->be16)); break; + case MFF_SKB_PRIORITY: + match_set_skb_priority(match, ntohl(value->be32)); + break; + + case MFF_SKB_MARK: + match_set_skb_mark(match, ntohl(value->be32)); + break; + CASE_MFF_REGS: match_set_reg(match, mf->id - MFF_REG0, ntohl(value->be32)); break; @@ -1357,6 +1403,14 @@ mf_set_flow_value(const struct mf_field *mf, flow->in_port = ntohs(value->be16); break; + case MFF_SKB_PRIORITY: + flow->skb_priority = ntohl(value->be32); + break; + + case MFF_SKB_MARK: + flow->skb_mark = ntohl(value->be32); + break; + CASE_MFF_REGS: flow->regs[mf->id - MFF_REG0] = ntohl(value->be32); break; @@ -1531,6 +1585,16 @@ mf_set_wild(const struct mf_field *mf, struct match *match) match->wc.masks.in_port = 0; break; + case MFF_SKB_PRIORITY: + match->flow.skb_priority = 0; + match->wc.masks.skb_priority = 0; + break; + + case MFF_SKB_MARK: + match->flow.skb_mark = 0; + match->wc.masks.skb_mark = 0; + break; + CASE_MFF_REGS: match_set_reg_masked(match, mf->id - MFF_REG0, 0, 0); break; @@ -1685,6 +1749,8 @@ mf_set(const struct mf_field *mf, switch (mf->id) { case MFF_IN_PORT: + case MFF_SKB_MARK: + case MFF_SKB_PRIORITY: case MFF_ETH_TYPE: case MFF_DL_VLAN: case MFF_DL_VLAN_PCP: @@ -1884,6 +1950,8 @@ mf_random_value(const struct mf_field *mf, union mf_value *value) case MFF_TUN_FLAGS: case MFF_METADATA: case MFF_IN_PORT: + case MFF_SKB_MARK: + case MFF_SKB_PRIORITY: CASE_MFF_REGS: case MFF_ETH_SRC: case MFF_ETH_DST: diff --git a/lib/meta-flow.h b/lib/meta-flow.h index 1c49306..3675883 100644 --- a/lib/meta-flow.h +++ b/lib/meta-flow.h @@ -39,6 +39,8 @@ enum mf_field_id { MFF_TUN_TOS, /* u8 */ MFF_METADATA, /* be64 */ MFF_IN_PORT, /* be16 */ + MFF_SKB_PRIORITY, /* be32 */ + MFF_SKB_MARK, /* be32 */ #if FLOW_N_REGS > 0 MFF_REG0, /* be32 */ diff --git a/lib/ofp-util.c b/lib/ofp-util.c index 49cbe2d..47e09d4 100644 --- a/lib/ofp-util.c +++ b/lib/ofp-util.c @@ -1067,6 +1067,11 @@ ofputil_usable_protocols(const struct match *match) return OFPUTIL_P_NONE; } + /* skb_mark and skb_priority can't be sent in a flow_mod */ + if (wc->masks.skb_mark || wc->masks.skb_priority) { + return OFPUTIL_P_NONE; + } + /* NXM, OXM, and OF1.1 support bitwise matching on ethernet addresses. */ if (!eth_mask_is_exact(wc->masks.dl_src) && !eth_addr_is_zero(wc->masks.dl_src)) { diff --git a/tests/ovs-ofctl.at b/tests/ovs-ofctl.at index 2ad165c..ba453a5 100644 --- a/tests/ovs-ofctl.at +++ b/tests/ovs-ofctl.at @@ -43,6 +43,18 @@ AT_CHECK([ovs-ofctl parse-flows flows.txt AT_CLEANUP +AT_SETUP([ovs-ofctl parse-flows (skb_mark and skb_priority)]) +AT_DATA([flows.txt], [[ +skb_mark=1234,skb_priority=4321,tcp,tp_src=123,actions=flood +]]) + +AT_CHECK([ovs-ofctl parse-flows flows.txt +], [1], [usable protocols: none +], [stderr]) + +AT_CLEANUP + + AT_SETUP([ovs-ofctl parse-flows (NXM)]) AT_DATA([flows.txt], [[ # comment -- 1.7.9.5 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev