Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
SOCKET(9)		   Kernel Developer's Manual		     SOCKET(9)

NAME
       socket -- kernel	socket interface

SYNOPSIS
       #include	<sys/socket.h>
       #include	<sys/socketvar.h>

       void
       soabort(struct socket *so);

       int
       soaccept(struct socket *so, struct sockaddr **nam);

       int
       socheckuid(struct socket	*so, uid_t uid);

       int
       sobind(struct socket *so, struct	sockaddr *nam, struct thread *td);

       void
       soclose(struct socket *so);

       int
       soconnect(struct	socket *so, struct sockaddr *nam, struct thread	*td);

       int
       socreate(int dom,     struct socket **aso,     int type,	    int	proto,
	   struct ucred	*cred, struct thread *td);

       int
       sodisconnect(struct socket *so);

       void
       sodtor_set(struct socket	*so, void (*func)(struct socket	*));

       struct sockaddr *
       sodupsockaddr(const struct sockaddr *sa,	int mflags);

       void
       sofree(struct socket *so);

       void
       sohasoutofband(struct socket *so);

       int
       solisten(struct socket *so, int backlog,	struct thread *td);

       void
       solisten_proto(struct socket *so, int backlog);

       int
       solisten_proto_check(struct socket *so);

       struct socket *
       sonewconn(struct	socket *head, int connstatus);

       int
       sopoll(struct socket *so,    int	events,	    struct ucred *active_cred,
	   struct thread *td);

       int
       sopoll_generic(struct socket *so,			   int events,
	   struct ucred	*active_cred, struct thread *td);

       int
       soreceive(struct	socket *so,  struct sockaddr **psa,   struct uio *uio,
	   struct mbuf **mp0, struct mbuf **controlp, int *flagsp);

       int
       soreceive_stream(struct socket *so,	      struct sockaddr **paddr,
	   struct uio *uio,	struct mbuf **mp0,     struct mbuf **controlp,
	   int *flagsp);

       int
       soreceive_dgram(struct socket *so,	      struct sockaddr **paddr,
	   struct uio *uio,	struct mbuf **mp0,     struct mbuf **controlp,
	   int *flagsp);

       int
       soreceive_generic(struct	socket *so,	      struct sockaddr **paddr,
	   struct uio *uio,	struct mbuf **mp0,     struct mbuf **controlp,
	   int *flagsp);

       int
       soreserve(struct	socket *so, u_long sndcc, u_long rcvcc);

       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
       sosend_dgram(struct socket *so, struct sockaddr *addr, struct uio *uio,
	   struct mbuf *top,	      struct mbuf *control,	    int	flags,
	   struct thread *td);

       int
       sosend_generic(struct socket *so,		struct sockaddr	*addr,
	   struct uio *uio, struct mbuf	*top, struct mbuf *control, int	flags,
	   struct thread *td);

       int
       soshutdown(struct socket	*so, int how);

       void
       sotoxsocket(struct socket *so, struct xsocket *xso);

       void
       soupcall_clear(struct socket *so, int which);

       void
       soupcall_set(struct socket *so,				    int	which,
	   int (*func)(struct socket *,	void *,	int), void *arg);

       void
       sowakeup(struct socket *so, struct sockbuf *sb);

       #include	<sys/sockopt.h>

       int
       sosetopt(struct socket *so, struct sockopt *sopt);

       int
       sogetopt(struct socket *so, struct sockopt *sopt);

       int
       sooptcopyin(struct   sockopt   *sopt,   void    *buf,	size_t	  len,
	   size_t minlen);

       int
       sooptcopyout(struct sockopt *sopt, const	void *buf, size_t len);

DESCRIPTION
       The  kernel socket programming interface	permits	in-kernel consumers to
       interact	with local and network socket objects in a manner  similar  to
       that  permitted using the socket(2) user	API.  These interfaces are ap-
       propriate for use by distributed	file systems and  other	 network-aware
       kernel  services.  While	the user API operates on file descriptors, the
       kernel interfaces operate directly on  struct  socket  pointers.	  Some
       portions	 of  the  kernel API exist only	to implement the user API, and
       are not expected	to be used by kernel code.  The	portions of the	socket
       API used	by socket consumers and	implementations	of  network  protocols
       will differ; some routines are only useful for protocol implementors.

       Except  where  otherwise	indicated, socket functions may	sleep, and are
       not appropriate for use in an interrupt thread context or while holding
       non-sleepable kernel locks.

   Creating and	Destroying Sockets
       A new socket may	be created using socreate().  As with socket(2), argu-
       ments specify the requested domain, type, and protocol via  dom,	 type,
       and  proto.   The  socket is returned via aso on	success.  In addition,
       the credential used to authorize	operations associated with the	socket
       will  be	 passed	 via  cred (and	will be	cached for the lifetime	of the
       socket),	and the	thread performing the operation	via td.	 Warning:  au-
       thorization  of	the  socket creation operation will be performed using
       the thread credential for some protocols	(such as raw sockets).

       Sockets may be closed and freed using soclose(),	which has similar  se-
       mantics to close(2).

       In certain circumstances, it is appropriate to destroy a	socket without
       waiting	for  it	 to  disconnect, for which soabort() is	used.  This is
       only appropriate	for incoming connections which are in a	partially con-
       nected state.  It must be called	on  an	unreferenced  socket,  by  the
       thread  which  removed  the  socket  from  its listen queue, to prevent
       races.  It will call into protocol code,	so no socket locks may be held
       over the	call.  The caller of soabort() is responsible for setting  the
       VNET  context.	The normal path	to freeing a socket is sofree(), which
       handles reference counting on the socket.  It should be called whenever
       a reference is released,	and also whenever reference flags are  cleared
       in  socket or protocol code.  Calls to sofree() should not be made from
       outside the socket layer; outside callers should	use soclose() instead.

   Connections and Addresses
       The sobind() function is	equivalent to the  bind(2)  system  call,  and
       binds  the socket so to the address nam.	 The operation would be	autho-
       rized using the credential on thread td.

       The soconnect() function	is equivalent to the connect(2)	 system	 call,
       and  initiates  a  connection on	the socket so to the address nam.  The
       operation will be authorized using the credential on thread td.	Unlike
       the user	system call, soconnect() returns immediately; the  caller  may
       msleep(9)  on  so->so_timeo  while holding the socket mutex and waiting
       for the SS_ISCONNECTING flag to clear or	so->so_error  to  become  non-
       zero.   If  soconnect()	fails,	the  caller  must  manually  clear the
       SS_ISCONNECTING flag.

       A call to sodisconnect()	disconnects the	socket without closing it.

       The soshutdown()	function is equivalent to the shutdown(2) system call,
       and causes part or all of a connection on a socket to be	closed down.

       Sockets are transitioned	from non-listening status  to  listening  with
       solisten().

   Socket Options
       The sogetopt() function is equivalent to	the getsockopt(2) system call,
       and retrieves a socket option on	socket so.  The	sosetopt() function is
       equivalent  to  the setsockopt(2) system	call, and sets a socket	option
       on socket so.

       The second argument in both  sogetopt()	and  sosetopt()	 is  the  sopt
       pointer	to  a struct sopt describing the socket	option operation.  The
       caller-allocated	structure must be zeroed, and  then  have  its	fields
       initialized to specify socket option operation arguments:

       sopt_dir	     Set  to SOPT_SET or SOPT_GET depending on whether this is
		     a get or set operation.

       sopt_level    Specify the level in the network stack the	 operation  is
		     targeted at; for example, SOL_SOCKET.

       sopt_name     Specify the name of the socket option to set.

       sopt_val	     Kernel space pointer to the argument value	for the	socket
		     option.

       sopt_valsize  Size of the argument value	in bytes.

   Socket Upcalls
       In  order  for  the owner of a socket to	be notified when the socket is
       ready to	send or	receive	data, an  upcall  may  be  registered  on  the
       socket.	 The  upcall  is  a function that will be called by the	socket
       framework when a	socket buffer associated  with	the  given  socket  is
       ready  for  reading  or	writing.  soupcall_set() is used to register a
       socket upcall.  The function func is registered,	and  the  pointer  arg
       will  be	 passed	as its second argument when it is called by the	frame-
       work.  The possible values for which are	SO_RCV and SO_SND, which  reg-
       ister  upcalls  for  receive and	send events, respectively.  The	upcall
       function	func() must return either SU_OK	or  SU_ISCONNECTED,  depending
       on  whether or not a call to soisconnected should be made by the	socket
       framework after the  upcall  returns.   The  upcall  func  cannot  call
       soisconnected  itself due to lock ordering with the socket buffer lock.
       Only SO_RCV upcalls should return SU_ISCONNECTED.  When a SO_RCV	upcall
       returns SU_ISCONNECTED, the upcall will be removed from the socket.

       Upcalls are removed from	their socket by	soupcall_clear().   The	 which
       argument	 again specifies whether the sending or	receiving upcall is to
       be cleared, with	SO_RCV or SO_SND.

   Socket Destructor Callback
       A kernel	system can use the sodtor_set()	function to set	 a  destructor
       for  a socket.  The destructor is called	when the socket	is about to be
       freed.  The destructor is called	before the  protocol  detach  routine.
       The  destructor	can serve as a callback	to initiate additional cleanup
       actions.

   Socket I/O
       The soreceive() function	is equivalent to the recvmsg(2)	 system	 call,
       and  attempts  to  receive bytes	of data	from the socket	so, optionally
       blocking	awaiting for data if none is ready to read.  Data may  be  re-
       trieved	directly  to kernel or user memory via the uio argument, or as
       an mbuf chain returned to the caller via	mp0,  avoiding	a  data	 copy.
       The  uio	 must  always  be  non-NULL.   If  mp0	is  non-NULL, only the
       uio_resid of uio	is used.  The caller may optionally retrieve a	socket
       address	on a protocol with the PR_ADDR capability by providing storage
       via non-NULL psa	argument.  The caller may optionally retrieve  control
       data  mbufs  via	 a  non-NULL controlp argument.	 Optional flags	may be
       passed to soreceive() via a non-NULL flagsp argument, and use the  same
       flag name space as the recvmsg(2) system	call.

       The  sosend() function is equivalent to the sendmsg(2) system call, and
       attempts	to send	bytes of data via the socket so,  optionally  blocking
       if  data	 cannot	 be  immediately sent.	Data may be sent directly from
       kernel or user memory via the uio argument, or as  an  mbuf  chain  via
       top,  avoiding a	data copy.  Only one of	the uio	or top pointers	may be
       non-NULL.  An optional destination  address  may	 be  specified	via  a
       non-NULL	addr argument, which may result	in an implicit connect if sup-
       ported  by  the	protocol.  The caller may optionally send control data
       mbufs via a non-NULL control argument.  Flags may be passed to sosend()
       using the flags argument, and use the  same  flag  name	space  as  the
       sendmsg(2) system call.

       Kernel  callers running in an interrupt thread context, or with a mutex
       held, will wish to use non-blocking sockets and pass  the  MSG_DONTWAIT
       flag in order to	prevent	these functions	from sleeping.

       A socket	can be queried for readability,	writability, out-of-band data,
       or  end-of-file	using sopoll().	 The possible values for events	are as
       for poll(2), with symbolic values POLLIN, POLLPRI, POLLOUT, POLLRDNORM,
       POLLWRNORM, POLLRDBAND, and POLLINGEOF taken from <sys/poll.h>.

       Calls to	soaccept() pass	through	to the protocol's  accept  routine  to
       accept an incoming connection.

   Socket Utility Functions
       The  uid	 of  a	socket's credential may	be compared against a uid with
       socheckuid().

       A  copy	of  an	existing   struct   sockaddr   may   be	  made	 using
       sodupsockaddr().

       Protocol	implementations	notify the socket layer	of the arrival of out-
       of-band	data  using sohasoutofband(), so that the socket layer can no-
       tify socket consumers of	the available data.

       An "external-format" version of a struct	socket can  be	created	 using
       sotoxsocket(),  suitable	 for  isolating	 user code from	changes	in the
       kernel structure.

   Protocol Implementations
       Protocols must supply an	implementation for solisten();	such  protocol
       implementations	 can   call   back   into   the	  socket  layer	 using
       solisten_proto_check()  and  solisten_proto()  to  check	 and  set  the
       socket-layer  listen  state.   These callbacks are provided so that the
       protocol	implementation can order the socket layer and  protocol	 locks
       as  necessary.  Protocols must supply an	implementation of soreceive();
       the    functions	    soreceive_stream(),	    soreceive_dgram(),	   and
       soreceive_generic() are supplied	for use	by such	implementations.

       Protocol	implementations	can use	sonewconn() to create a	socket and at-
       tach  protocol  state  to  that socket.	This can be used to create new
       sockets available for soaccept()	on  a  listen  socket.	 The  returned
       socket has a reference count of zero.

       Protocols  must supply an implementation	for sopoll(); sopoll_generic()
       is provided for the use by protocol implementations.

       The functions sosend_dgram() and	sosend_generic() are supplied  to  as-
       sist in protocol	implementations	of sosend().

       When  a protocol	creates	a new socket structure,	it is necessary	to re-
       serve socket buffer space for that socket, by calling soreserve().  The
       rough inverse of	this reservation is performed by sorflush(), which  is
       called automatically by the socket framework.

       When  a protocol	needs to wake up threads waiting for the socket	to be-
       come ready to read or write, variants  of  sowakeup()  are  used.   The
       sowakeup() function should not be called	directly by protocol code, in-
       stead  use  the	wrappers sorwakeup(), sorwakeup_locked(), sowwakeup(),
       and sowwakeup_locked() for readers and writers, with the	 corresponding
       socket buffer lock not already locked, or already held, respectively.

       The functions sooptcopyin() and sooptcopyout() are useful for transfer-
       ring struct sockopt data	between	user and kernel	code.

SEE ALSO
       bind(2),	  close(2),   connect(2),   getsockopt(2),  recv(2),  send(2),
       setsockopt(2), shutdown(2),  socket(2),	ng_ksocket(4),	intr_event(9),
       msleep(9), ucred(9)

HISTORY
       The socket(2) system call appeared in 4.2BSD.  This manual page was in-
       troduced	in FreeBSD 7.0.

AUTHORS
       This manual page	was written by Robert Watson and
       Benjamin	Kaduk.

BUGS
       The use of explicitly passed credentials, credentials hung from explic-
       itly  passed  threads, the credential on	curthread, and the cached cre-
       dential from socket creation time is inconsistent, and may lead to  un-
       expected	 behaviour.   It  is possible that several of the td arguments
       should be cred arguments, or simply not be present at all.

       The caller may need to manually clear  SS_ISCONNECTING  if  soconnect()
       returns an error.

       The  MSG_DONTWAIT flag is not implemented for sosend(), and may not al-
       ways work with soreceive() when zero copy sockets are enabled.

       This manual page	does not describe how to register  socket  upcalls  or
       monitor	a  socket  for	readability/writability	without	using blocking
       I/O.

       The soref() and sorele()	functions are not described, and in most cases
       should not be used, due to confusing and	potentially incorrect interac-
       tions when sorele() is last called after	soclose().

FreeBSD	14.3		       September 6, 2022		     SOCKET(9)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=solisten&sektion=9&manpath=FreeBSD+14.3-RELEASE+and+Ports>

home | help