The tc_act header file contains an inline function that checks if an
action is changing the skb mark of a packet and a further function to
extract the mark.

Add similar functions to check for and get skbedit actions that modify
the packet type of the skb.

Signed-off-by: John Hurley <john.hur...@netronome.com>
Reviewed-by: Simon Horman <simon.hor...@netronome.com>
Reviewed-by: Jakub Kicinski <jakub.kicin...@netronome.com>
---
 include/net/tc_act/tc_skbedit.h | 27 +++++++++++++++++++++++++++
 1 file changed, 27 insertions(+)

diff --git a/include/net/tc_act/tc_skbedit.h b/include/net/tc_act/tc_skbedit.h
index 4c04e29..b22a1f6 100644
--- a/include/net/tc_act/tc_skbedit.h
+++ b/include/net/tc_act/tc_skbedit.h
@@ -54,4 +54,31 @@ static inline u32 tcf_skbedit_mark(const struct tc_action *a)
        return mark;
 }
 
+/* Return true iff action is ptype */
+static inline bool is_tcf_skbedit_ptype(const struct tc_action *a)
+{
+#ifdef CONFIG_NET_CLS_ACT
+       u32 flags;
+
+       if (a->ops && a->ops->id == TCA_ID_SKBEDIT) {
+               rcu_read_lock();
+               flags = rcu_dereference(to_skbedit(a)->params)->flags;
+               rcu_read_unlock();
+               return flags == SKBEDIT_F_PTYPE;
+       }
+#endif
+       return false;
+}
+
+static inline u32 tcf_skbedit_ptype(const struct tc_action *a)
+{
+       u16 ptype;
+
+       rcu_read_lock();
+       ptype = rcu_dereference(to_skbedit(a)->params)->ptype;
+       rcu_read_unlock();
+
+       return ptype;
+}
+
 #endif /* __NET_TC_SKBEDIT_H */
-- 
2.7.4

Reply via email to