Changeset View
Changeset View
Standalone View
Standalone View
sys/sys/socketvar.h
Show First 20 Lines • Show All 71 Lines • ▼ Show 20 Lines | enum socket_qstate { | ||||
SQ_INCOMP = 0x0800, /* on sol_incomp */ | SQ_INCOMP = 0x0800, /* on sol_incomp */ | ||||
SQ_COMP = 0x1000, /* on sol_comp */ | SQ_COMP = 0x1000, /* on sol_comp */ | ||||
}; | }; | ||||
/*- | /*- | ||||
* Locking key to struct socket: | * Locking key to struct socket: | ||||
* (a) constant after allocation, no locking required. | * (a) constant after allocation, no locking required. | ||||
* (b) locked by SOCK_LOCK(so). | * (b) locked by SOCK_LOCK(so). | ||||
* (cr) locked by SOCK_RECVBUF_LOCK(so)/SOCKBUF_LOCK(&so->so_rcv). | * (cr) locked by SOCK_RECVBUF_LOCK(so) | ||||
* (cs) locked by SOCK_SENDBUF_LOCK(so)/SOCKBUF_LOCK(&so->so_snd). | * (cs) locked by SOCK_SENDBUF_LOCK(so) | ||||
* (e) locked by SOLISTEN_LOCK() of corresponding listening socket. | * (e) locked by SOLISTEN_LOCK() of corresponding listening socket. | ||||
* (f) not locked since integer reads/writes are atomic. | * (f) not locked since integer reads/writes are atomic. | ||||
* (g) used only as a sleep/wakeup address, no value. | * (g) used only as a sleep/wakeup address, no value. | ||||
* (h) locked by global mutex so_global_mtx. | * (h) locked by global mutex so_global_mtx. | ||||
* (k) locked by KTLS workqueue mutex | * (k) locked by KTLS workqueue mutex | ||||
*/ | */ | ||||
TAILQ_HEAD(accept_queue, socket); | TAILQ_HEAD(accept_queue, socket); | ||||
struct socket { | struct socket { | ||||
▲ Show 20 Lines • Show All 161 Lines • ▼ Show 20 Lines | |||||
} while (0) | } while (0) | ||||
#define SOLISTEN_LOCK_ASSERT(sol) do { \ | #define SOLISTEN_LOCK_ASSERT(sol) do { \ | ||||
mtx_assert(&(sol)->so_lock, MA_OWNED); \ | mtx_assert(&(sol)->so_lock, MA_OWNED); \ | ||||
KASSERT(SOLISTENING(sol), \ | KASSERT(SOLISTENING(sol), \ | ||||
("%s: %p not listening", __func__, (sol))); \ | ("%s: %p not listening", __func__, (sol))); \ | ||||
} while (0) | } while (0) | ||||
/* | /* | ||||
* Socket buffer locks. These manipulate the same mutexes as SOCKBUF_LOCK() | * Socket buffer locks. These are strongly preferred over SOCKBUF_LOCK(sb) | ||||
* and related macros. | * macros, as we are moving towards protocol specific socket buffers. | ||||
*/ | */ | ||||
#define SOCK_RECVBUF_MTX(so) \ | #define SOCK_RECVBUF_MTX(so) \ | ||||
(&(so)->so_rcv_mtx) | (&(so)->so_rcv_mtx) | ||||
#define SOCK_RECVBUF_LOCK(so) \ | #define SOCK_RECVBUF_LOCK(so) \ | ||||
mtx_lock(SOCK_RECVBUF_MTX(so)) | mtx_lock(SOCK_RECVBUF_MTX(so)) | ||||
#define SOCK_RECVBUF_UNLOCK(so) \ | #define SOCK_RECVBUF_UNLOCK(so) \ | ||||
mtx_unlock(SOCK_RECVBUF_MTX(so)) | mtx_unlock(SOCK_RECVBUF_MTX(so)) | ||||
#define SOCK_RECVBUF_LOCK_ASSERT(so) \ | #define SOCK_RECVBUF_LOCK_ASSERT(so) \ | ||||
mtx_assert(SOCK_RECVBUF_MTX(so), MA_OWNED) | mtx_assert(SOCK_RECVBUF_MTX(so), MA_OWNED) | ||||
#define SOCK_RECVBUF_UNLOCK_ASSERT(so) \ | #define SOCK_RECVBUF_UNLOCK_ASSERT(so) \ | ||||
mtx_assert(SOCK_RECVBUF_MTX(so), MA_NOTOWNED) | mtx_assert(SOCK_RECVBUF_MTX(so), MA_NOTOWNED) | ||||
#define SOCK_SENDBUF_MTX(so) \ | #define SOCK_SENDBUF_MTX(so) \ | ||||
(&(so)->so_snd_mtx) | (&(so)->so_snd_mtx) | ||||
#define SOCK_SENDBUF_LOCK(so) \ | #define SOCK_SENDBUF_LOCK(so) \ | ||||
mtx_lock(SOCK_SENDBUF_MTX(so)) | mtx_lock(SOCK_SENDBUF_MTX(so)) | ||||
#define SOCK_SENDBUF_UNLOCK(so) \ | #define SOCK_SENDBUF_UNLOCK(so) \ | ||||
mtx_unlock(SOCK_SENDBUF_MTX(so)) | mtx_unlock(SOCK_SENDBUF_MTX(so)) | ||||
#define SOCK_SENDBUF_LOCK_ASSERT(so) \ | #define SOCK_SENDBUF_LOCK_ASSERT(so) \ | ||||
mtx_assert(SOCK_SENDBUF_MTX(so), MA_OWNED) | mtx_assert(SOCK_SENDBUF_MTX(so), MA_OWNED) | ||||
#define SOCK_SENDBUF_UNLOCK_ASSERT(so) \ | #define SOCK_SENDBUF_UNLOCK_ASSERT(so) \ | ||||
mtx_assert(SOCK_SENDBUF_MTX(so), MA_NOTOWNED) | mtx_assert(SOCK_SENDBUF_MTX(so), MA_NOTOWNED) | ||||
/* 'which' values for socket buffer events and upcalls. */ | #define SOCK_BUF_LOCK(so, which) \ | ||||
typedef enum { SO_RCV, SO_SND } sb_which; | mtx_lock(soeventmtx(so, which)) | ||||
#define SOCK_BUF_UNLOCK(so, which) \ | |||||
mtx_unlock(soeventmtx(so, which)) | |||||
#define SOCK_BUF_LOCK_ASSERT(so, which) \ | |||||
mtx_assert(soeventmtx(so, which), MA_OWNED) | |||||
#define SOCK_BUF_UNLOCK_ASSERT(so, which) \ | |||||
mtx_assert(soeventmtx(so, which), MA_NOTOWNED) | |||||
static inline struct sockbuf * | |||||
sobuf(struct socket *so, const sb_which which) | |||||
{ | |||||
return (which == SO_RCV ? &so->so_rcv : &so->so_snd); | |||||
markj: style(9) does not require these blank lines anymore, BTW. | |||||
} | |||||
static inline struct mtx * | |||||
soeventmtx(struct socket *so, const sb_which which) | |||||
{ | |||||
return (which == SO_RCV ? SOCK_RECVBUF_MTX(so) : SOCK_SENDBUF_MTX(so)); | |||||
} | |||||
/* | /* | ||||
* Macros for sockets and socket buffering. | * Macros for sockets and socket buffering. | ||||
*/ | */ | ||||
/* | /* | ||||
* Flags to soiolock(). | * Flags to soiolock(). | ||||
*/ | */ | ||||
#define SBL_WAIT 0x00000001 /* Wait if not immediately available. */ | #define SBL_WAIT 0x00000001 /* Wait if not immediately available. */ | ||||
▲ Show 20 Lines • Show All 57 Lines • ▼ Show 20 Lines | |||||
/* | /* | ||||
* In sorwakeup() and sowwakeup(), acquire the socket buffer lock to | * In sorwakeup() and sowwakeup(), acquire the socket buffer lock to | ||||
* avoid a non-atomic test-and-wakeup. However, sowakeup is | * avoid a non-atomic test-and-wakeup. However, sowakeup is | ||||
* responsible for releasing the lock if it is called. We unlock only | * responsible for releasing the lock if it is called. We unlock only | ||||
* if we don't call into sowakeup. If any code is introduced that | * if we don't call into sowakeup. If any code is introduced that | ||||
* directly invokes the underlying sowakeup() primitives, it must | * directly invokes the underlying sowakeup() primitives, it must | ||||
* maintain the same semantics. | * maintain the same semantics. | ||||
*/ | */ | ||||
#define sorwakeup_locked(so) do { \ | |||||
SOCKBUF_LOCK_ASSERT(&(so)->so_rcv); \ | |||||
if (sb_notify(&(so)->so_rcv)) \ | |||||
sowakeup((so), &(so)->so_rcv); \ | |||||
else \ | |||||
SOCKBUF_UNLOCK(&(so)->so_rcv); \ | |||||
} while (0) | |||||
#define sorwakeup(so) do { \ | #define sorwakeup(so) do { \ | ||||
SOCKBUF_LOCK(&(so)->so_rcv); \ | SOCK_RECVBUF_LOCK(so); \ | ||||
sorwakeup_locked(so); \ | sorwakeup_locked(so); \ | ||||
} while (0) | } while (0) | ||||
#define sowwakeup_locked(so) do { \ | |||||
SOCKBUF_LOCK_ASSERT(&(so)->so_snd); \ | |||||
if (sb_notify(&(so)->so_snd)) \ | |||||
sowakeup((so), &(so)->so_snd); \ | |||||
else \ | |||||
SOCKBUF_UNLOCK(&(so)->so_snd); \ | |||||
} while (0) | |||||
#define sowwakeup(so) do { \ | #define sowwakeup(so) do { \ | ||||
SOCKBUF_LOCK(&(so)->so_snd); \ | SOCK_SENDBUF_LOCK(so); \ | ||||
sowwakeup_locked(so); \ | sowwakeup_locked(so); \ | ||||
} while (0) | } while (0) | ||||
struct accept_filter { | struct accept_filter { | ||||
char accf_name[16]; | char accf_name[16]; | ||||
int (*accf_callback) | int (*accf_callback) | ||||
(struct socket *so, void *arg, int waitflag); | (struct socket *so, void *arg, int waitflag); | ||||
void * (*accf_create) | void * (*accf_create) | ||||
▲ Show 20 Lines • Show All 124 Lines • ▼ Show 20 Lines | int sosend_dgram(struct socket *so, struct sockaddr *addr, | ||||
int flags, struct thread *td); | int flags, struct thread *td); | ||||
int sosend_generic(struct socket *so, struct sockaddr *addr, | int sosend_generic(struct socket *so, struct sockaddr *addr, | ||||
struct uio *uio, struct mbuf *top, struct mbuf *control, | struct uio *uio, struct mbuf *top, struct mbuf *control, | ||||
int flags, struct thread *td); | int flags, struct thread *td); | ||||
int soshutdown(struct socket *so, int how); | int soshutdown(struct socket *so, int how); | ||||
void soupcall_clear(struct socket *, sb_which); | void soupcall_clear(struct socket *, sb_which); | ||||
void soupcall_set(struct socket *, sb_which, so_upcall_t, void *); | void soupcall_set(struct socket *, sb_which, so_upcall_t, void *); | ||||
void solisten_upcall_set(struct socket *, so_upcall_t, void *); | void solisten_upcall_set(struct socket *, so_upcall_t, void *); | ||||
void sowakeup(struct socket *so, struct sockbuf *sb); | void sorwakeup_locked(struct socket *); | ||||
void sowakeup_aio(struct socket *so, struct sockbuf *sb); | void sowwakeup_locked(struct socket *); | ||||
void sowakeup_aio(struct socket *, sb_which); | |||||
void solisten_wakeup(struct socket *); | void solisten_wakeup(struct socket *); | ||||
int selsocket(struct socket *so, int events, struct timeval *tv, | int selsocket(struct socket *so, int events, struct timeval *tv, | ||||
struct thread *td); | struct thread *td); | ||||
void soisconnected(struct socket *so); | void soisconnected(struct socket *so); | ||||
void soisconnecting(struct socket *so); | void soisconnecting(struct socket *so); | ||||
void soisdisconnected(struct socket *so); | void soisdisconnected(struct socket *so); | ||||
void soisdisconnecting(struct socket *so); | void soisdisconnecting(struct socket *so); | ||||
void socantrcvmore(struct socket *so); | void socantrcvmore(struct socket *so); | ||||
▲ Show 20 Lines • Show All 72 Lines • Show Last 20 Lines |
style(9) does not require these blank lines anymore, BTW.