19952f691SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */ 2ca9b0e27SAlexander Duyck /* 3ca9b0e27SAlexander Duyck * Copyright (c) 2008, Intel Corporation. 4ca9b0e27SAlexander Duyck * 5ca9b0e27SAlexander Duyck * Author: Alexander Duyck <alexander.h.duyck@intel.com> 6ca9b0e27SAlexander Duyck */ 7ca9b0e27SAlexander Duyck 8ca9b0e27SAlexander Duyck #ifndef __NET_TC_SKBEDIT_H 9ca9b0e27SAlexander Duyck #define __NET_TC_SKBEDIT_H 10ca9b0e27SAlexander Duyck 11ca9b0e27SAlexander Duyck #include <net/act_api.h> 12519afb18SAmir Vadai #include <linux/tc_act/tc_skbedit.h> 13ca9b0e27SAlexander Duyck 14c749cddaSDavide Caratti struct tcf_skbedit_params { 15ca9b0e27SAlexander Duyck u32 flags; 16ca9b0e27SAlexander Duyck u32 priority; 171c55d62eSjamal u32 mark; 184fe77d82SAntonio Quartulli u32 mask; 19ca9b0e27SAlexander Duyck u16 queue_mapping; 20ff202ee1SJamal Hadi Salim u16 ptype; 21c749cddaSDavide Caratti struct rcu_head rcu; 22c749cddaSDavide Caratti }; 23c749cddaSDavide Caratti 24c749cddaSDavide Caratti struct tcf_skbedit { 25c749cddaSDavide Caratti struct tc_action common; 26c749cddaSDavide Caratti struct tcf_skbedit_params __rcu *params; 27ca9b0e27SAlexander Duyck }; 28a85a970aSWANG Cong #define to_skbedit(a) ((struct tcf_skbedit *)a) 29ca9b0e27SAlexander Duyck 30fe93f0b2SPetr Machata /* Return true iff action is the one identified by FLAG. */ 31fe93f0b2SPetr Machata static inline bool is_tcf_skbedit_with_flag(const struct tc_action *a, u32 flag) 32519afb18SAmir Vadai { 33519afb18SAmir Vadai #ifdef CONFIG_NET_CLS_ACT 34c749cddaSDavide Caratti u32 flags; 35c749cddaSDavide Caratti 36eddd2cf1SEli Cohen if (a->ops && a->ops->id == TCA_ID_SKBEDIT) { 37c749cddaSDavide Caratti rcu_read_lock(); 38c749cddaSDavide Caratti flags = rcu_dereference(to_skbedit(a)->params)->flags; 39c749cddaSDavide Caratti rcu_read_unlock(); 40fe93f0b2SPetr Machata return flags == flag; 41c749cddaSDavide Caratti } 42519afb18SAmir Vadai #endif 43519afb18SAmir Vadai return false; 44519afb18SAmir Vadai } 45519afb18SAmir Vadai 46fe93f0b2SPetr Machata /* Return true iff action is mark */ 47fe93f0b2SPetr Machata static inline bool is_tcf_skbedit_mark(const struct tc_action *a) 48fe93f0b2SPetr Machata { 49fe93f0b2SPetr Machata return is_tcf_skbedit_with_flag(a, SKBEDIT_F_MARK); 50fe93f0b2SPetr Machata } 51fe93f0b2SPetr Machata 52519afb18SAmir Vadai static inline u32 tcf_skbedit_mark(const struct tc_action *a) 53519afb18SAmir Vadai { 54c749cddaSDavide Caratti u32 mark; 55c749cddaSDavide Caratti 56c749cddaSDavide Caratti rcu_read_lock(); 57c749cddaSDavide Caratti mark = rcu_dereference(to_skbedit(a)->params)->mark; 58c749cddaSDavide Caratti rcu_read_unlock(); 59c749cddaSDavide Caratti 60c749cddaSDavide Caratti return mark; 61519afb18SAmir Vadai } 62519afb18SAmir Vadai 6377feb4eeSJohn Hurley /* Return true iff action is ptype */ 6477feb4eeSJohn Hurley static inline bool is_tcf_skbedit_ptype(const struct tc_action *a) 6577feb4eeSJohn Hurley { 66fe93f0b2SPetr Machata return is_tcf_skbedit_with_flag(a, SKBEDIT_F_PTYPE); 6777feb4eeSJohn Hurley } 6877feb4eeSJohn Hurley 6977feb4eeSJohn Hurley static inline u32 tcf_skbedit_ptype(const struct tc_action *a) 7077feb4eeSJohn Hurley { 7177feb4eeSJohn Hurley u16 ptype; 7277feb4eeSJohn Hurley 7377feb4eeSJohn Hurley rcu_read_lock(); 7477feb4eeSJohn Hurley ptype = rcu_dereference(to_skbedit(a)->params)->ptype; 7577feb4eeSJohn Hurley rcu_read_unlock(); 7677feb4eeSJohn Hurley 7777feb4eeSJohn Hurley return ptype; 7877feb4eeSJohn Hurley } 7977feb4eeSJohn Hurley 802ce12410SPetr Machata /* Return true iff action is priority */ 812ce12410SPetr Machata static inline bool is_tcf_skbedit_priority(const struct tc_action *a) 822ce12410SPetr Machata { 832ce12410SPetr Machata return is_tcf_skbedit_with_flag(a, SKBEDIT_F_PRIORITY); 842ce12410SPetr Machata } 852ce12410SPetr Machata 862ce12410SPetr Machata static inline u32 tcf_skbedit_priority(const struct tc_action *a) 872ce12410SPetr Machata { 882ce12410SPetr Machata u32 priority; 892ce12410SPetr Machata 902ce12410SPetr Machata rcu_read_lock(); 912ce12410SPetr Machata priority = rcu_dereference(to_skbedit(a)->params)->priority; 922ce12410SPetr Machata rcu_read_unlock(); 932ce12410SPetr Machata 942ce12410SPetr Machata return priority; 952ce12410SPetr Machata } 962ce12410SPetr Machata 97*a9c64939SIdo Schimmel /* Return true iff action is queue_mapping */ 98*a9c64939SIdo Schimmel static inline bool is_tcf_skbedit_queue_mapping(const struct tc_action *a) 99*a9c64939SIdo Schimmel { 100*a9c64939SIdo Schimmel return is_tcf_skbedit_with_flag(a, SKBEDIT_F_QUEUE_MAPPING); 101*a9c64939SIdo Schimmel } 102*a9c64939SIdo Schimmel 103*a9c64939SIdo Schimmel /* Return true iff action is inheritdsfield */ 104*a9c64939SIdo Schimmel static inline bool is_tcf_skbedit_inheritdsfield(const struct tc_action *a) 105*a9c64939SIdo Schimmel { 106*a9c64939SIdo Schimmel return is_tcf_skbedit_with_flag(a, SKBEDIT_F_INHERITDSFIELD); 107*a9c64939SIdo Schimmel } 108*a9c64939SIdo Schimmel 109ca9b0e27SAlexander Duyck #endif /* __NET_TC_SKBEDIT_H */ 110