|  | /* SPDX-License-Identifier: GPL-2.0 */ | 
|  | #ifndef __NET_PSAMPLE_H | 
|  | #define __NET_PSAMPLE_H | 
|  |  | 
|  | #include <uapi/linux/psample.h> | 
|  | #include <linux/list.h> | 
|  |  | 
|  | struct psample_group { | 
|  | struct list_head list; | 
|  | struct net *net; | 
|  | u32 group_num; | 
|  | u32 refcount; | 
|  | u32 seq; | 
|  | struct rcu_head rcu; | 
|  | }; | 
|  |  | 
|  | struct psample_metadata { | 
|  | u32 trunc_size; | 
|  | int in_ifindex; | 
|  | int out_ifindex; | 
|  | u16 out_tc; | 
|  | u64 out_tc_occ;	/* bytes */ | 
|  | u64 latency;	/* nanoseconds */ | 
|  | u8 out_tc_valid:1, | 
|  | out_tc_occ_valid:1, | 
|  | latency_valid:1, | 
|  | rate_as_probability:1, | 
|  | unused:4; | 
|  | const u8 *user_cookie; | 
|  | u32 user_cookie_len; | 
|  | }; | 
|  |  | 
|  | struct psample_group *psample_group_get(struct net *net, u32 group_num); | 
|  | void psample_group_take(struct psample_group *group); | 
|  | void psample_group_put(struct psample_group *group); | 
|  |  | 
|  | struct sk_buff; | 
|  |  | 
|  | #if IS_ENABLED(CONFIG_PSAMPLE) | 
|  |  | 
|  | void psample_sample_packet(struct psample_group *group, | 
|  | const struct sk_buff *skb, u32 sample_rate, | 
|  | const struct psample_metadata *md); | 
|  |  | 
|  | #else | 
|  |  | 
|  | static inline void psample_sample_packet(struct psample_group *group, | 
|  | const struct sk_buff *skb, | 
|  | u32 sample_rate, | 
|  | const struct psample_metadata *md) | 
|  | { | 
|  | } | 
|  |  | 
|  | #endif | 
|  |  | 
|  | #endif /* __NET_PSAMPLE_H */ |