162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci#ifndef __NET_TC_PED_H 362306a36Sopenharmony_ci#define __NET_TC_PED_H 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci#include <net/act_api.h> 662306a36Sopenharmony_ci#include <linux/tc_act/tc_pedit.h> 762306a36Sopenharmony_ci#include <linux/types.h> 862306a36Sopenharmony_ci 962306a36Sopenharmony_cistruct tcf_pedit_key_ex { 1062306a36Sopenharmony_ci enum pedit_header_type htype; 1162306a36Sopenharmony_ci enum pedit_cmd cmd; 1262306a36Sopenharmony_ci}; 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_cistruct tcf_pedit_parms { 1562306a36Sopenharmony_ci struct tc_pedit_key *tcfp_keys; 1662306a36Sopenharmony_ci struct tcf_pedit_key_ex *tcfp_keys_ex; 1762306a36Sopenharmony_ci u32 tcfp_off_max_hint; 1862306a36Sopenharmony_ci unsigned char tcfp_nkeys; 1962306a36Sopenharmony_ci unsigned char tcfp_flags; 2062306a36Sopenharmony_ci struct rcu_head rcu; 2162306a36Sopenharmony_ci}; 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_cistruct tcf_pedit { 2462306a36Sopenharmony_ci struct tc_action common; 2562306a36Sopenharmony_ci struct tcf_pedit_parms __rcu *parms; 2662306a36Sopenharmony_ci}; 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci#define to_pedit(a) ((struct tcf_pedit *)a) 2962306a36Sopenharmony_ci#define to_pedit_parms(a) (rcu_dereference(to_pedit(a)->parms)) 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_cistatic inline bool is_tcf_pedit(const struct tc_action *a) 3262306a36Sopenharmony_ci{ 3362306a36Sopenharmony_ci#ifdef CONFIG_NET_CLS_ACT 3462306a36Sopenharmony_ci if (a->ops && a->ops->id == TCA_ID_PEDIT) 3562306a36Sopenharmony_ci return true; 3662306a36Sopenharmony_ci#endif 3762306a36Sopenharmony_ci return false; 3862306a36Sopenharmony_ci} 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_cistatic inline int tcf_pedit_nkeys(const struct tc_action *a) 4162306a36Sopenharmony_ci{ 4262306a36Sopenharmony_ci struct tcf_pedit_parms *parms; 4362306a36Sopenharmony_ci int nkeys; 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci rcu_read_lock(); 4662306a36Sopenharmony_ci parms = to_pedit_parms(a); 4762306a36Sopenharmony_ci nkeys = parms->tcfp_nkeys; 4862306a36Sopenharmony_ci rcu_read_unlock(); 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci return nkeys; 5162306a36Sopenharmony_ci} 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_cistatic inline u32 tcf_pedit_htype(const struct tc_action *a, int index) 5462306a36Sopenharmony_ci{ 5562306a36Sopenharmony_ci u32 htype = TCA_PEDIT_KEY_EX_HDR_TYPE_NETWORK; 5662306a36Sopenharmony_ci struct tcf_pedit_parms *parms; 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci rcu_read_lock(); 5962306a36Sopenharmony_ci parms = to_pedit_parms(a); 6062306a36Sopenharmony_ci if (parms->tcfp_keys_ex) 6162306a36Sopenharmony_ci htype = parms->tcfp_keys_ex[index].htype; 6262306a36Sopenharmony_ci rcu_read_unlock(); 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci return htype; 6562306a36Sopenharmony_ci} 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_cistatic inline u32 tcf_pedit_cmd(const struct tc_action *a, int index) 6862306a36Sopenharmony_ci{ 6962306a36Sopenharmony_ci struct tcf_pedit_parms *parms; 7062306a36Sopenharmony_ci u32 cmd = __PEDIT_CMD_MAX; 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci rcu_read_lock(); 7362306a36Sopenharmony_ci parms = to_pedit_parms(a); 7462306a36Sopenharmony_ci if (parms->tcfp_keys_ex) 7562306a36Sopenharmony_ci cmd = parms->tcfp_keys_ex[index].cmd; 7662306a36Sopenharmony_ci rcu_read_unlock(); 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ci return cmd; 7962306a36Sopenharmony_ci} 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_cistatic inline u32 tcf_pedit_mask(const struct tc_action *a, int index) 8262306a36Sopenharmony_ci{ 8362306a36Sopenharmony_ci struct tcf_pedit_parms *parms; 8462306a36Sopenharmony_ci u32 mask; 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_ci rcu_read_lock(); 8762306a36Sopenharmony_ci parms = to_pedit_parms(a); 8862306a36Sopenharmony_ci mask = parms->tcfp_keys[index].mask; 8962306a36Sopenharmony_ci rcu_read_unlock(); 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ci return mask; 9262306a36Sopenharmony_ci} 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_cistatic inline u32 tcf_pedit_val(const struct tc_action *a, int index) 9562306a36Sopenharmony_ci{ 9662306a36Sopenharmony_ci struct tcf_pedit_parms *parms; 9762306a36Sopenharmony_ci u32 val; 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_ci rcu_read_lock(); 10062306a36Sopenharmony_ci parms = to_pedit_parms(a); 10162306a36Sopenharmony_ci val = parms->tcfp_keys[index].val; 10262306a36Sopenharmony_ci rcu_read_unlock(); 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_ci return val; 10562306a36Sopenharmony_ci} 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_cistatic inline u32 tcf_pedit_offset(const struct tc_action *a, int index) 10862306a36Sopenharmony_ci{ 10962306a36Sopenharmony_ci struct tcf_pedit_parms *parms; 11062306a36Sopenharmony_ci u32 off; 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_ci rcu_read_lock(); 11362306a36Sopenharmony_ci parms = to_pedit_parms(a); 11462306a36Sopenharmony_ci off = parms->tcfp_keys[index].off; 11562306a36Sopenharmony_ci rcu_read_unlock(); 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_ci return off; 11862306a36Sopenharmony_ci} 11962306a36Sopenharmony_ci#endif /* __NET_TC_PED_H */ 120