xref: /openbmc/linux/include/net/af_unix.h (revision 57b47a53ec4a67691ba32cff5768e8d78fa6c67f)
11da177e4SLinus Torvalds #ifndef __LINUX_NET_AFUNIX_H
21da177e4SLinus Torvalds #define __LINUX_NET_AFUNIX_H
320380731SArnaldo Carvalho de Melo 
420380731SArnaldo Carvalho de Melo #include <linux/config.h>
520380731SArnaldo Carvalho de Melo #include <linux/socket.h>
620380731SArnaldo Carvalho de Melo #include <linux/un.h>
7*57b47a53SIngo Molnar #include <linux/mutex.h>
820380731SArnaldo Carvalho de Melo #include <net/sock.h>
920380731SArnaldo Carvalho de Melo 
101da177e4SLinus Torvalds extern void unix_inflight(struct file *fp);
111da177e4SLinus Torvalds extern void unix_notinflight(struct file *fp);
121da177e4SLinus Torvalds extern void unix_gc(void);
131da177e4SLinus Torvalds 
141da177e4SLinus Torvalds #define UNIX_HASH_SIZE	256
151da177e4SLinus Torvalds 
161da177e4SLinus Torvalds extern struct hlist_head unix_socket_table[UNIX_HASH_SIZE + 1];
17fbe9cc4aSDavid S. Miller extern spinlock_t unix_table_lock;
181da177e4SLinus Torvalds 
191da177e4SLinus Torvalds extern atomic_t unix_tot_inflight;
201da177e4SLinus Torvalds 
211da177e4SLinus Torvalds static inline struct sock *first_unix_socket(int *i)
221da177e4SLinus Torvalds {
231da177e4SLinus Torvalds 	for (*i = 0; *i <= UNIX_HASH_SIZE; (*i)++) {
241da177e4SLinus Torvalds 		if (!hlist_empty(&unix_socket_table[*i]))
251da177e4SLinus Torvalds 			return __sk_head(&unix_socket_table[*i]);
261da177e4SLinus Torvalds 	}
271da177e4SLinus Torvalds 	return NULL;
281da177e4SLinus Torvalds }
291da177e4SLinus Torvalds 
301da177e4SLinus Torvalds static inline struct sock *next_unix_socket(int *i, struct sock *s)
311da177e4SLinus Torvalds {
321da177e4SLinus Torvalds 	struct sock *next = sk_next(s);
331da177e4SLinus Torvalds 	/* More in this chain? */
341da177e4SLinus Torvalds 	if (next)
351da177e4SLinus Torvalds 		return next;
361da177e4SLinus Torvalds 	/* Look for next non-empty chain. */
371da177e4SLinus Torvalds 	for ((*i)++; *i <= UNIX_HASH_SIZE; (*i)++) {
381da177e4SLinus Torvalds 		if (!hlist_empty(&unix_socket_table[*i]))
391da177e4SLinus Torvalds 			return __sk_head(&unix_socket_table[*i]);
401da177e4SLinus Torvalds 	}
411da177e4SLinus Torvalds 	return NULL;
421da177e4SLinus Torvalds }
431da177e4SLinus Torvalds 
441da177e4SLinus Torvalds #define forall_unix_sockets(i, s) \
451da177e4SLinus Torvalds 	for (s = first_unix_socket(&(i)); s; s = next_unix_socket(&(i),(s)))
461da177e4SLinus Torvalds 
471da177e4SLinus Torvalds struct unix_address {
481da177e4SLinus Torvalds 	atomic_t	refcnt;
491da177e4SLinus Torvalds 	int		len;
501da177e4SLinus Torvalds 	unsigned	hash;
511da177e4SLinus Torvalds 	struct sockaddr_un name[0];
521da177e4SLinus Torvalds };
531da177e4SLinus Torvalds 
541da177e4SLinus Torvalds struct unix_skb_parms {
551da177e4SLinus Torvalds 	struct ucred		creds;		/* Skb credentials	*/
561da177e4SLinus Torvalds 	struct scm_fp_list	*fp;		/* Passed files		*/
571da177e4SLinus Torvalds };
581da177e4SLinus Torvalds 
591da177e4SLinus Torvalds #define UNIXCB(skb) 	(*(struct unix_skb_parms*)&((skb)->cb))
601da177e4SLinus Torvalds #define UNIXCREDS(skb)	(&UNIXCB((skb)).creds)
611da177e4SLinus Torvalds 
62fd19f329SBenjamin LaHaise #define unix_state_rlock(s)	spin_lock(&unix_sk(s)->lock)
63fd19f329SBenjamin LaHaise #define unix_state_runlock(s)	spin_unlock(&unix_sk(s)->lock)
64fd19f329SBenjamin LaHaise #define unix_state_wlock(s)	spin_lock(&unix_sk(s)->lock)
65fd19f329SBenjamin LaHaise #define unix_state_wunlock(s)	spin_unlock(&unix_sk(s)->lock)
661da177e4SLinus Torvalds 
671da177e4SLinus Torvalds #ifdef __KERNEL__
681da177e4SLinus Torvalds /* The AF_UNIX socket */
691da177e4SLinus Torvalds struct unix_sock {
701da177e4SLinus Torvalds 	/* WARNING: sk has to be the first member */
711da177e4SLinus Torvalds 	struct sock		sk;
721da177e4SLinus Torvalds         struct unix_address     *addr;
731da177e4SLinus Torvalds         struct dentry		*dentry;
741da177e4SLinus Torvalds         struct vfsmount		*mnt;
75*57b47a53SIngo Molnar 	struct mutex		readlock;
761da177e4SLinus Torvalds         struct sock		*peer;
771da177e4SLinus Torvalds         struct sock		*other;
781da177e4SLinus Torvalds         struct sock		*gc_tree;
791da177e4SLinus Torvalds         atomic_t                inflight;
80fd19f329SBenjamin LaHaise         spinlock_t		lock;
811da177e4SLinus Torvalds         wait_queue_head_t       peer_wait;
821da177e4SLinus Torvalds };
831da177e4SLinus Torvalds #define unix_sk(__sk) ((struct unix_sock *)__sk)
8420380731SArnaldo Carvalho de Melo 
8520380731SArnaldo Carvalho de Melo #ifdef CONFIG_SYSCTL
8620380731SArnaldo Carvalho de Melo extern int sysctl_unix_max_dgram_qlen;
8720380731SArnaldo Carvalho de Melo extern void unix_sysctl_register(void);
8820380731SArnaldo Carvalho de Melo extern void unix_sysctl_unregister(void);
8920380731SArnaldo Carvalho de Melo #else
9020380731SArnaldo Carvalho de Melo static inline void unix_sysctl_register(void) {}
9120380731SArnaldo Carvalho de Melo static inline void unix_sysctl_unregister(void) {}
9220380731SArnaldo Carvalho de Melo #endif
931da177e4SLinus Torvalds #endif
941da177e4SLinus Torvalds #endif
95