#ifndef _SYS_SOCKETVAR_H_
#define _SYS_SOCKETVAR_H_
#ifndef _SYS_TYPES_H_
#include <sys/types.h>
#endif
#ifndef _SYS_QUEUE_H_
#include <sys/queue.h>
#endif
#ifndef _SYS_EVENT_H_
#include <sys/event.h>
#endif
#ifndef _SYS_THREAD_H_
#include <sys/thread.h>
#endif
#ifndef _SYS_SOCKBUF_H_
#include <sys/sockbuf.h>
#endif
#if defined(_KERNEL) || defined(_KERNEL_STRUCTURES)
#ifndef _NET_NETMSG_H_
#include <net/netmsg.h>
#endif
#ifndef _SYS_SPINLOCK_H_
#include <sys/spinlock.h>
#endif
struct accept_filter;
struct signalsockbuf {
struct sockbuf sb;
struct kqinfo ssb_kq;
struct notifymsglist ssb_mlist;
uint32_t ssb_flags;
u_int ssb_timeo;
long ssb_lowat;
u_long ssb_hiwat;
u_long ssb_mbmax;
struct lwkt_token ssb_token;
};
#define ssb_cc sb.sb_cc
#define ssb_mb sb.sb_mb
#define ssb_mbcnt sb.sb_mbcnt
#define ssb_cc_prealloc sb.sb_cc_prealloc
#define ssb_mbcnt_prealloc sb.sb_mbcnt_prealloc
#define SSB_LOCK 0x0001
#define SSB_WANT 0x0002
#define SSB_WAIT 0x0004
#define SSB_ASYNC 0x0010
#define SSB_UPCALL 0x0020
#define SSB_NOINTR 0x0040
#define SSB_KNOTE 0x0100
#define SSB_MEVENT 0x0200
#define SSB_STOP 0x0400
#define SSB_AUTOSIZE 0x0800
#define SSB_AUTOLOWAT 0x1000
#define SSB_WAKEUP 0x2000
#define SSB_PREALLOC 0x4000
#define SSB_STOPSUPP 0x8000
#define SSB_CLEAR_MASK (SSB_ASYNC | SSB_UPCALL | SSB_STOP | \
SSB_AUTOSIZE | SSB_AUTOLOWAT)
#define SSB_NOTIFY_MASK (SSB_WAIT | SSB_ASYNC | SSB_UPCALL | \
SSB_KNOTE | SSB_MEVENT)
struct socket {
short so_type;
short so_options;
short so_linger;
short so_state;
void *so_pcb;
struct protosw *so_proto;
struct socket *so_head;
lwkt_port_t so_port;
TAILQ_HEAD(, socket) so_incomp;
TAILQ_HEAD(, socket) so_comp;
TAILQ_ENTRY(socket) so_list;
short so_qlen;
short so_incqlen;
short so_qlimit;
short so_timeo;
u_short so_error;
u_short so_rerror;
struct sigio *so_sigio;
u_long so_oobmark;
TAILQ_HEAD(, aiocblist) so_aiojobq;
struct signalsockbuf so_rcv;
struct signalsockbuf so_snd;
void (*so_upcall) (struct socket *, void *, int);
void *so_upcallarg;
struct ucred *so_cred;
void *so_emuldata;
int so_refs;
int so_reserved01;
struct so_accf {
struct accept_filter *so_accept_filter;
void *so_accept_filter_arg;
char *so_accept_filter_str;
} *so_accf;
struct netmsg_base so_clomsg;
struct sockaddr *so_faddr;
struct spinlock so_rcvd_spin;
struct netmsg_pru_rcvd so_rcvd_msg;
lwkt_port_t so_orig_port;
long so_inum;
uint32_t so_user_cookie;
};
#endif
#define SS_NOFDREF 0x0001
#define SS_ISCONNECTED 0x0002
#define SS_ISCONNECTING 0x0004
#define SS_ISDISCONNECTING 0x0008
#define SS_CANTSENDMORE 0x0010
#define SS_CANTRCVMORE 0x0020
#define SS_RCVATMARK 0x0040
#define SS_ISCLOSING 0x0080
#define SS_ASSERTINPROG 0x0100
#define SS_ASYNC 0x0200
#define SS_ISCONFIRMING 0x0400
#define SS_INCOMP 0x0800
#define SS_COMP 0x1000
#define SS_ISDISCONNECTED 0x2000
#define SS_ACCEPTMECH 0x4000
struct xsocket {
size_t xso_len;
struct socket *xso_so;
short so_type;
short so_options;
short so_linger;
short so_state;
void *so_pcb;
int xso_protocol;
int xso_family;
short so_qlen;
short so_incqlen;
short so_qlimit;
short so_timeo;
u_short so_error;
pid_t so_pgid;
u_long so_oobmark;
struct xsockbuf {
u_long sb_cc;
u_long sb_hiwat;
u_long sb_mbcnt;
u_long sb_mbmax;
long sb_lowat;
u_int sb_timeo;
short sb_flags;
} so_rcv, so_snd;
uid_t so_uid;
};
#define sosendallatonce(so) \
((so)->so_proto->pr_flags & PR_ATOMIC)
#define soreadable(so) \
((so)->so_rcv.ssb_cc >= (so)->so_rcv.ssb_lowat || \
((so)->so_state & SS_CANTRCVMORE) || \
!TAILQ_EMPTY(&(so)->so_comp) || (so)->so_error || (so)->so_rerror)
#define sowriteable(so) \
((ssb_space(&(so)->so_snd) >= (so)->so_snd.ssb_lowat && \
(((so)->so_state&SS_ISCONNECTED) || \
((so)->so_proto->pr_flags&PR_CONNREQUIRED)==0)) || \
((so)->so_state & SS_CANTSENDMORE) || \
(so)->so_error)
#ifdef _KERNEL
static __inline
long
ssb_space(struct signalsockbuf *ssb)
{
long bleft;
long mleft;
if (ssb->ssb_flags & SSB_STOP)
return(0);
bleft = ssb->ssb_hiwat - ssb->ssb_cc;
mleft = ssb->ssb_mbmax - ssb->ssb_mbcnt;
return((bleft < mleft) ? bleft : mleft);
}
static __inline long
ssb_space_prealloc(struct signalsockbuf *ssb)
{
long bleft, bleft_prealloc;
long mleft, mleft_prealloc;
if (ssb->ssb_flags & SSB_STOP)
return(0);
bleft = ssb->ssb_hiwat - ssb->ssb_cc;
bleft_prealloc = ssb->ssb_hiwat - ssb->ssb_cc_prealloc;
if (bleft_prealloc < bleft)
bleft = bleft_prealloc;
mleft = ssb->ssb_mbmax - ssb->ssb_mbcnt;
mleft_prealloc = ssb->ssb_mbmax - ssb->ssb_mbcnt_prealloc;
if (mleft_prealloc < mleft)
mleft = mleft_prealloc;
return((bleft < mleft) ? bleft : mleft);
}
static __inline void
ssb_preallocstream(struct signalsockbuf *ssb, struct mbuf *m)
{
if (m->m_len == 0)
return;
sbprealloc(&ssb->sb, m);
}
#endif
#define ssb_append(ssb, m) \
sbappend(&(ssb)->sb, m)
#define ssb_appendstream(ssb, m) \
sbappendstream(&(ssb)->sb, m)
#define ssb_appendrecord(ssb, m) \
sbappendrecord(&(ssb)->sb, m)
#define ssb_appendaddr(ssb, src, m, control) \
((ssb_space(ssb) <= 0) ? 0 : sbappendaddr(&(ssb)->sb, src, m, control))
#define ssb_appendcontrol(ssb, m, control) \
((ssb_space(ssb) <= 0) ? 0 : sbappendcontrol(&(ssb)->sb, m, control))
#define ssb_insert_knote(ssb, kn) do { \
knote_insert(&(ssb)->ssb_kq.ki_note, kn); \
atomic_set_int(&(ssb)->ssb_flags, SSB_KNOTE); \
} while(0)
#define ssb_remove_knote(ssb, kn) do { \
knote_remove(&(ssb)->ssb_kq.ki_note, kn); \
if (SLIST_EMPTY(&(ssb)->ssb_kq.ki_note)) \
atomic_clear_int(&(ssb)->ssb_flags, SSB_KNOTE); \
} while(0)
#define sorwakeup(so) sowakeup((so), &(so)->so_rcv)
#define sowwakeup(so) sowakeup((so), &(so)->so_snd)
#ifdef _KERNEL
enum sopt_dir { SOPT_GET, SOPT_SET };
struct sockopt {
enum sopt_dir sopt_dir;
int sopt_level;
int sopt_name;
void *sopt_val;
size_t sopt_valsize;
struct thread *sopt_td;
};
struct accept_filter {
char accf_name[16];
void (*accf_callback)
(struct socket *so, void *arg, int waitflag);
void * (*accf_create)
(struct socket *so, char *arg);
void (*accf_destroy)
(struct socket *so);
SLIST_ENTRY(accept_filter) accf_next;
};
#ifdef MALLOC_DECLARE
MALLOC_DECLARE(M_PCB);
MALLOC_DECLARE(M_SONAME);
MALLOC_DECLARE(M_ACCF);
#endif
extern int maxsockets;
extern u_long sb_max;
extern u_long sb_max_adj;
struct file;
struct filedesc;
struct mbuf;
struct rlimit;
struct sockaddr;
struct stat;
struct ucred;
struct uio;
struct knote;
struct sysmsg;
int soo_read (struct file *fp, struct uio *uio, struct ucred *cred,
int flags);
int soo_write (struct file *fp, struct uio *uio, struct ucred *cred,
int flags);
int soo_close (struct file *fp);
int soo_shutdown (struct file *fp, int how);
int soo_ioctl (struct file *fp, u_long cmd, caddr_t data,
struct ucred *cred, struct sysmsg *msg);
int soo_stat (struct file *fp, struct stat *ub, struct ucred *cred);
int sokqfilter (struct file *fp, struct knote *kn);
struct sockaddr *dup_sockaddr (const struct sockaddr *sa);
int getsockaddr (struct sockaddr **namp, caddr_t uaddr, size_t len);
void ssb_release (struct signalsockbuf *ssb, struct socket *so);
int ssb_reserve (struct signalsockbuf *ssb, u_long cc, struct socket *so,
struct rlimit *rl);
void ssbtoxsockbuf (struct signalsockbuf *sb, struct xsockbuf *xsb);
int ssb_wait (struct signalsockbuf *sb);
int _ssb_lock (struct signalsockbuf *sb);
void soabort_async (struct socket *so, boolean_t clr_head);
void soabort_direct (struct socket *so);
int soaccept (struct socket *so, struct sockaddr **nam);
void soaccept_generic (struct socket *so);
struct socket *soalloc (int waitok, struct protosw *);
int sobind (struct socket *so, struct sockaddr *nam, struct thread *td);
void socantrcvmore (struct socket *so);
void socantsendmore (struct socket *so);
void soroverflow(struct socket *so);
int socket_wait (struct socket *so, struct timespec *ts, int *res);
int soclose (struct socket *so, int fflags);
int soconnect (struct socket *so, struct sockaddr *nam, struct thread *td,
boolean_t sync);
int soconnect2 (struct socket *so1, struct socket *so2, struct ucred *cred);
int socreate (int dom, struct socket **aso, int type, int proto,
struct thread *td);
int sodisconnect (struct socket *so);
void sodiscard (struct socket *so);
void sofree (struct socket *so);
int sogetopt (struct socket *so, struct sockopt *sopt);
void sohasoutofband (struct socket *so);
void soisconnected (struct socket *so);
void soisconnecting (struct socket *so);
void soisdisconnected (struct socket *so);
void soisdisconnecting (struct socket *so);
void soisreconnected (struct socket *so);
void soisreconnecting (struct socket *so);
void sosetport (struct socket *so, struct lwkt_port *port);
int solisten (struct socket *so, int backlog, struct thread *td);
struct socket *sonewconn (struct socket *head, int connstatus);
struct socket *sonewconn_faddr (struct socket *head, int connstatus,
const struct sockaddr *faddr, boolean_t keep_ref);
void soinherit(struct socket *so, struct socket *so_inh);
int sooptcopyin (struct sockopt *sopt, void *buf, size_t len,
size_t minlen);
int soopt_to_kbuf (struct sockopt *sopt, void *buf, size_t len,
size_t minlen);
int sooptcopyout (struct sockopt *sopt, const void *buf, size_t len);
void soopt_from_kbuf (struct sockopt *sopt, const void *buf, size_t len);
int soopt_getm (struct sockopt *sopt, struct mbuf **mp);
int soopt_mcopyin (struct sockopt *sopt, struct mbuf *m);
void soopt_to_mbuf (struct sockopt *sopt, struct mbuf *m);
int soopt_mcopyout (struct sockopt *sopt, struct mbuf *m);
int soopt_from_mbuf (struct sockopt *sopt, struct mbuf *m);
int soreceive (struct socket *so, struct sockaddr **paddr,
struct uio *uio, struct sockbuf *sio,
struct mbuf **controlp, int *flagsp);
int sorecvtcp (struct socket *so, struct sockaddr **paddr,
struct uio *uio, struct sockbuf *sio,
struct mbuf **controlp, int *flagsp);
int soreserve (struct socket *so, u_long sndcc, u_long rcvcc,
struct rlimit *rl);
void sorflush (struct socket *so);
int sosend (struct socket *so, struct sockaddr *addr, struct uio *uio,
struct mbuf *top, struct mbuf *control, int flags,
struct thread *td);
int sosendudp (struct socket *so, struct sockaddr *addr, struct uio *uio,
struct mbuf *top, struct mbuf *control, int flags,
struct thread *td);
int sosendtcp (struct socket *so, struct sockaddr *addr, struct uio *uio,
struct mbuf *top, struct mbuf *control, int flags,
struct thread *td);
int sosetopt (struct socket *so, struct sockopt *sopt);
int soshutdown (struct socket *so, int how);
void sotoxsocket (struct socket *so, struct xsocket *xso);
void sowakeup (struct socket *so, struct signalsockbuf *sb);
int accept_filt_add (struct accept_filter *filt);
int accept_filt_del (char *name);
struct accept_filter * accept_filt_get (char *name);
#ifdef ACCEPT_FILTER_MOD
int accept_filt_generic_mod_event (module_t mod, int event, void *data);
SYSCTL_DECL(_net_inet_accf);
#endif
#endif
#endif