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

Reply via email to