100c94ca2SJakub Kicinski /* SPDX-License-Identifier: GPL-2.0-only */ 200c94ca2SJakub Kicinski 300c94ca2SJakub Kicinski #ifndef __PSP_PSP_H 400c94ca2SJakub Kicinski #define __PSP_PSP_H 500c94ca2SJakub Kicinski 600c94ca2SJakub Kicinski #include <linux/list.h> 76b46ca26SJakub Kicinski #include <linux/lockdep.h> 800c94ca2SJakub Kicinski #include <linux/mutex.h> 900c94ca2SJakub Kicinski #include <net/netns/generic.h> 1000c94ca2SJakub Kicinski #include <net/psp.h> 1100c94ca2SJakub Kicinski #include <net/sock.h> 1200c94ca2SJakub Kicinski 1300c94ca2SJakub Kicinski extern struct xarray psp_devs; 1400c94ca2SJakub Kicinski extern struct mutex psp_devs_lock; 1500c94ca2SJakub Kicinski 16*672beab0SEric Dumazet void psp_dev_free(struct psp_dev *psd); 1700c94ca2SJakub Kicinski int psp_dev_check_access(struct psp_dev *psd, struct net *net); 1800c94ca2SJakub Kicinski 1900c94ca2SJakub Kicinski void psp_nl_notify_dev(struct psp_dev *psd, u32 cmd); 2000c94ca2SJakub Kicinski 216b46ca26SJakub Kicinski struct psp_assoc *psp_assoc_create(struct psp_dev *psd); 226b46ca26SJakub Kicinski struct psp_dev *psp_dev_get_for_sock(struct sock *sk); 236b46ca26SJakub Kicinski void psp_dev_tx_key_del(struct psp_dev *psd, struct psp_assoc *pas); 246b46ca26SJakub Kicinski int psp_sock_assoc_set_rx(struct sock *sk, struct psp_assoc *pas, 256b46ca26SJakub Kicinski struct psp_key_parsed *key, 266b46ca26SJakub Kicinski struct netlink_ext_ack *extack); 276b46ca26SJakub Kicinski int psp_sock_assoc_set_tx(struct sock *sk, struct psp_dev *psd, 286b46ca26SJakub Kicinski u32 version, struct psp_key_parsed *key, 296b46ca26SJakub Kicinski struct netlink_ext_ack *extack); 30e7885105SJakub Kicinski void psp_assocs_key_rotated(struct psp_dev *psd); 316b46ca26SJakub Kicinski 3200c94ca2SJakub Kicinski static inline void psp_dev_get(struct psp_dev *psd) 3300c94ca2SJakub Kicinski { 3400c94ca2SJakub Kicinski refcount_inc(&psd->refcnt); 3500c94ca2SJakub Kicinski } 3600c94ca2SJakub Kicinski 376b46ca26SJakub Kicinski static inline bool psp_dev_tryget(struct psp_dev *psd) 386b46ca26SJakub Kicinski { 396b46ca26SJakub Kicinski return refcount_inc_not_zero(&psd->refcnt); 406b46ca26SJakub Kicinski } 416b46ca26SJakub Kicinski 4200c94ca2SJakub Kicinski static inline void psp_dev_put(struct psp_dev *psd) 4300c94ca2SJakub Kicinski { 4400c94ca2SJakub Kicinski if (refcount_dec_and_test(&psd->refcnt)) 45*672beab0SEric Dumazet psp_dev_free(psd); 4600c94ca2SJakub Kicinski } 4700c94ca2SJakub Kicinski 486b46ca26SJakub Kicinski static inline bool psp_dev_is_registered(struct psp_dev *psd) 496b46ca26SJakub Kicinski { 506b46ca26SJakub Kicinski lockdep_assert_held(&psd->lock); 516b46ca26SJakub Kicinski return !!psd->ops; 526b46ca26SJakub Kicinski } 536b46ca26SJakub Kicinski 5400c94ca2SJakub Kicinski #endif /* __PSP_PSP_H */ 55