net: add documentation to socket.c
Adds missing sphinx documentation to the socket.c's functions. Also fixes some whitespaces. I also changed the style of older documentation as an effort to have an uniform documentation style. Signed-off-by: Pedro Tammela <pctammela@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
228cd2dba2
commit
8a3c245c03
|
@ -83,6 +83,12 @@ enum sock_type {
|
||||||
|
|
||||||
#endif /* ARCH_HAS_SOCKET_TYPES */
|
#endif /* ARCH_HAS_SOCKET_TYPES */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* enum sock_shutdown_cmd - Shutdown types
|
||||||
|
* @SHUT_RD: shutdown receptions
|
||||||
|
* @SHUT_WR: shutdown transmissions
|
||||||
|
* @SHUT_RDWR: shutdown receptions/transmissions
|
||||||
|
*/
|
||||||
enum sock_shutdown_cmd {
|
enum sock_shutdown_cmd {
|
||||||
SHUT_RD,
|
SHUT_RD,
|
||||||
SHUT_WR,
|
SHUT_WR,
|
||||||
|
|
|
@ -26,7 +26,7 @@ typedef __kernel_sa_family_t sa_family_t;
|
||||||
/*
|
/*
|
||||||
* 1003.1g requires sa_family_t and that sa_data is char.
|
* 1003.1g requires sa_family_t and that sa_data is char.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
struct sockaddr {
|
struct sockaddr {
|
||||||
sa_family_t sa_family; /* address family, AF_xxx */
|
sa_family_t sa_family; /* address family, AF_xxx */
|
||||||
char sa_data[14]; /* 14 bytes of protocol address */
|
char sa_data[14]; /* 14 bytes of protocol address */
|
||||||
|
@ -44,7 +44,7 @@ struct linger {
|
||||||
* system, not 4.3. Thus msg_accrights(len) are now missing. They
|
* system, not 4.3. Thus msg_accrights(len) are now missing. They
|
||||||
* belong in an obscure libc emulation or the bin.
|
* belong in an obscure libc emulation or the bin.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
struct msghdr {
|
struct msghdr {
|
||||||
void *msg_name; /* ptr to socket address structure */
|
void *msg_name; /* ptr to socket address structure */
|
||||||
int msg_namelen; /* size of socket address structure */
|
int msg_namelen; /* size of socket address structure */
|
||||||
|
@ -54,7 +54,7 @@ struct msghdr {
|
||||||
unsigned int msg_flags; /* flags on received message */
|
unsigned int msg_flags; /* flags on received message */
|
||||||
struct kiocb *msg_iocb; /* ptr to iocb for async requests */
|
struct kiocb *msg_iocb; /* ptr to iocb for async requests */
|
||||||
};
|
};
|
||||||
|
|
||||||
struct user_msghdr {
|
struct user_msghdr {
|
||||||
void __user *msg_name; /* ptr to socket address structure */
|
void __user *msg_name; /* ptr to socket address structure */
|
||||||
int msg_namelen; /* size of socket address structure */
|
int msg_namelen; /* size of socket address structure */
|
||||||
|
@ -122,7 +122,7 @@ struct cmsghdr {
|
||||||
* inside range, given by msg->msg_controllen before using
|
* inside range, given by msg->msg_controllen before using
|
||||||
* ancillary object DATA. --ANK (980731)
|
* ancillary object DATA. --ANK (980731)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static inline struct cmsghdr * __cmsg_nxthdr(void *__ctl, __kernel_size_t __size,
|
static inline struct cmsghdr * __cmsg_nxthdr(void *__ctl, __kernel_size_t __size,
|
||||||
struct cmsghdr *__cmsg)
|
struct cmsghdr *__cmsg)
|
||||||
{
|
{
|
||||||
|
@ -264,10 +264,10 @@ struct ucred {
|
||||||
/* Maximum queue length specifiable by listen. */
|
/* Maximum queue length specifiable by listen. */
|
||||||
#define SOMAXCONN 128
|
#define SOMAXCONN 128
|
||||||
|
|
||||||
/* Flags we can use with send/ and recv.
|
/* Flags we can use with send/ and recv.
|
||||||
Added those for 1003.1g not all are supported yet
|
Added those for 1003.1g not all are supported yet
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define MSG_OOB 1
|
#define MSG_OOB 1
|
||||||
#define MSG_PEEK 2
|
#define MSG_PEEK 2
|
||||||
#define MSG_DONTROUTE 4
|
#define MSG_DONTROUTE 4
|
||||||
|
|
277
net/socket.c
277
net/socket.c
|
@ -384,6 +384,18 @@ static struct file_system_type sock_fs_type = {
|
||||||
* but we take care of internal coherence yet.
|
* but we take care of internal coherence yet.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sock_alloc_file - Bind a &socket to a &file
|
||||||
|
* @sock: socket
|
||||||
|
* @flags: file status flags
|
||||||
|
* @dname: protocol name
|
||||||
|
*
|
||||||
|
* Returns the &file bound with @sock, implicitly storing it
|
||||||
|
* in sock->file. If dname is %NULL, sets to "".
|
||||||
|
* On failure the return is a ERR pointer (see linux/err.h).
|
||||||
|
* This function uses GFP_KERNEL internally.
|
||||||
|
*/
|
||||||
|
|
||||||
struct file *sock_alloc_file(struct socket *sock, int flags, const char *dname)
|
struct file *sock_alloc_file(struct socket *sock, int flags, const char *dname)
|
||||||
{
|
{
|
||||||
struct file *file;
|
struct file *file;
|
||||||
|
@ -424,6 +436,14 @@ static int sock_map_fd(struct socket *sock, int flags)
|
||||||
return PTR_ERR(newfile);
|
return PTR_ERR(newfile);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sock_from_file - Return the &socket bounded to @file.
|
||||||
|
* @file: file
|
||||||
|
* @err: pointer to an error code return
|
||||||
|
*
|
||||||
|
* On failure returns %NULL and assigns -ENOTSOCK to @err.
|
||||||
|
*/
|
||||||
|
|
||||||
struct socket *sock_from_file(struct file *file, int *err)
|
struct socket *sock_from_file(struct file *file, int *err)
|
||||||
{
|
{
|
||||||
if (file->f_op == &socket_file_ops)
|
if (file->f_op == &socket_file_ops)
|
||||||
|
@ -532,11 +552,11 @@ static const struct inode_operations sockfs_inode_ops = {
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* sock_alloc - allocate a socket
|
* sock_alloc - allocate a socket
|
||||||
*
|
*
|
||||||
* Allocate a new inode and socket object. The two are bound together
|
* Allocate a new inode and socket object. The two are bound together
|
||||||
* and initialised. The socket is then returned. If we are out of inodes
|
* and initialised. The socket is then returned. If we are out of inodes
|
||||||
* NULL is returned.
|
* NULL is returned. This functions uses GFP_KERNEL internally.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
struct socket *sock_alloc(void)
|
struct socket *sock_alloc(void)
|
||||||
|
@ -561,7 +581,7 @@ struct socket *sock_alloc(void)
|
||||||
EXPORT_SYMBOL(sock_alloc);
|
EXPORT_SYMBOL(sock_alloc);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* sock_release - close a socket
|
* sock_release - close a socket
|
||||||
* @sock: socket to close
|
* @sock: socket to close
|
||||||
*
|
*
|
||||||
* The socket is released from the protocol stack if it has a release
|
* The socket is released from the protocol stack if it has a release
|
||||||
|
@ -617,6 +637,15 @@ void __sock_tx_timestamp(__u16 tsflags, __u8 *tx_flags)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(__sock_tx_timestamp);
|
EXPORT_SYMBOL(__sock_tx_timestamp);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sock_sendmsg - send a message through @sock
|
||||||
|
* @sock: socket
|
||||||
|
* @msg: message to send
|
||||||
|
*
|
||||||
|
* Sends @msg through @sock, passing through LSM.
|
||||||
|
* Returns the number of bytes sent, or an error code.
|
||||||
|
*/
|
||||||
|
|
||||||
static inline int sock_sendmsg_nosec(struct socket *sock, struct msghdr *msg)
|
static inline int sock_sendmsg_nosec(struct socket *sock, struct msghdr *msg)
|
||||||
{
|
{
|
||||||
int ret = sock->ops->sendmsg(sock, msg, msg_data_left(msg));
|
int ret = sock->ops->sendmsg(sock, msg, msg_data_left(msg));
|
||||||
|
@ -633,6 +662,18 @@ int sock_sendmsg(struct socket *sock, struct msghdr *msg)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(sock_sendmsg);
|
EXPORT_SYMBOL(sock_sendmsg);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* kernel_sendmsg - send a message through @sock (kernel-space)
|
||||||
|
* @sock: socket
|
||||||
|
* @msg: message header
|
||||||
|
* @vec: kernel vec
|
||||||
|
* @num: vec array length
|
||||||
|
* @size: total message data size
|
||||||
|
*
|
||||||
|
* Builds the message data with @vec and sends it through @sock.
|
||||||
|
* Returns the number of bytes sent, or an error code.
|
||||||
|
*/
|
||||||
|
|
||||||
int kernel_sendmsg(struct socket *sock, struct msghdr *msg,
|
int kernel_sendmsg(struct socket *sock, struct msghdr *msg,
|
||||||
struct kvec *vec, size_t num, size_t size)
|
struct kvec *vec, size_t num, size_t size)
|
||||||
{
|
{
|
||||||
|
@ -641,6 +682,19 @@ int kernel_sendmsg(struct socket *sock, struct msghdr *msg,
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(kernel_sendmsg);
|
EXPORT_SYMBOL(kernel_sendmsg);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* kernel_sendmsg_locked - send a message through @sock (kernel-space)
|
||||||
|
* @sk: sock
|
||||||
|
* @msg: message header
|
||||||
|
* @vec: output s/g array
|
||||||
|
* @num: output s/g array length
|
||||||
|
* @size: total message data size
|
||||||
|
*
|
||||||
|
* Builds the message data with @vec and sends it through @sock.
|
||||||
|
* Returns the number of bytes sent, or an error code.
|
||||||
|
* Caller must hold @sk.
|
||||||
|
*/
|
||||||
|
|
||||||
int kernel_sendmsg_locked(struct sock *sk, struct msghdr *msg,
|
int kernel_sendmsg_locked(struct sock *sk, struct msghdr *msg,
|
||||||
struct kvec *vec, size_t num, size_t size)
|
struct kvec *vec, size_t num, size_t size)
|
||||||
{
|
{
|
||||||
|
@ -811,6 +865,16 @@ void __sock_recv_ts_and_drops(struct msghdr *msg, struct sock *sk,
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(__sock_recv_ts_and_drops);
|
EXPORT_SYMBOL_GPL(__sock_recv_ts_and_drops);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sock_recvmsg - receive a message from @sock
|
||||||
|
* @sock: socket
|
||||||
|
* @msg: message to receive
|
||||||
|
* @flags: message flags
|
||||||
|
*
|
||||||
|
* Receives @msg from @sock, passing through LSM. Returns the total number
|
||||||
|
* of bytes received, or an error.
|
||||||
|
*/
|
||||||
|
|
||||||
static inline int sock_recvmsg_nosec(struct socket *sock, struct msghdr *msg,
|
static inline int sock_recvmsg_nosec(struct socket *sock, struct msghdr *msg,
|
||||||
int flags)
|
int flags)
|
||||||
{
|
{
|
||||||
|
@ -826,20 +890,21 @@ int sock_recvmsg(struct socket *sock, struct msghdr *msg, int flags)
|
||||||
EXPORT_SYMBOL(sock_recvmsg);
|
EXPORT_SYMBOL(sock_recvmsg);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* kernel_recvmsg - Receive a message from a socket (kernel space)
|
* kernel_recvmsg - Receive a message from a socket (kernel space)
|
||||||
* @sock: The socket to receive the message from
|
* @sock: The socket to receive the message from
|
||||||
* @msg: Received message
|
* @msg: Received message
|
||||||
* @vec: Input s/g array for message data
|
* @vec: Input s/g array for message data
|
||||||
* @num: Size of input s/g array
|
* @num: Size of input s/g array
|
||||||
* @size: Number of bytes to read
|
* @size: Number of bytes to read
|
||||||
* @flags: Message flags (MSG_DONTWAIT, etc...)
|
* @flags: Message flags (MSG_DONTWAIT, etc...)
|
||||||
*
|
*
|
||||||
* On return the msg structure contains the scatter/gather array passed in the
|
* On return the msg structure contains the scatter/gather array passed in the
|
||||||
* vec argument. The array is modified so that it consists of the unfilled
|
* vec argument. The array is modified so that it consists of the unfilled
|
||||||
* portion of the original array.
|
* portion of the original array.
|
||||||
*
|
*
|
||||||
* The returned value is the total number of bytes received, or an error.
|
* The returned value is the total number of bytes received, or an error.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int kernel_recvmsg(struct socket *sock, struct msghdr *msg,
|
int kernel_recvmsg(struct socket *sock, struct msghdr *msg,
|
||||||
struct kvec *vec, size_t num, size_t size, int flags)
|
struct kvec *vec, size_t num, size_t size, int flags)
|
||||||
{
|
{
|
||||||
|
@ -1005,6 +1070,13 @@ static long sock_do_ioctl(struct net *net, struct socket *sock,
|
||||||
* what to do with it - that's up to the protocol still.
|
* what to do with it - that's up to the protocol still.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get_net_ns - increment the refcount of the network namespace
|
||||||
|
* @ns: common namespace (net)
|
||||||
|
*
|
||||||
|
* Returns the net's common namespace.
|
||||||
|
*/
|
||||||
|
|
||||||
struct ns_common *get_net_ns(struct ns_common *ns)
|
struct ns_common *get_net_ns(struct ns_common *ns)
|
||||||
{
|
{
|
||||||
return &get_net(container_of(ns, struct net, ns))->ns;
|
return &get_net(container_of(ns, struct net, ns))->ns;
|
||||||
|
@ -1099,6 +1171,19 @@ static long sock_ioctl(struct file *file, unsigned cmd, unsigned long arg)
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sock_create_lite - creates a socket
|
||||||
|
* @family: protocol family (AF_INET, ...)
|
||||||
|
* @type: communication type (SOCK_STREAM, ...)
|
||||||
|
* @protocol: protocol (0, ...)
|
||||||
|
* @res: new socket
|
||||||
|
*
|
||||||
|
* Creates a new socket and assigns it to @res, passing through LSM.
|
||||||
|
* The new socket initialization is not complete, see kernel_accept().
|
||||||
|
* Returns 0 or an error. On failure @res is set to %NULL.
|
||||||
|
* This function internally uses GFP_KERNEL.
|
||||||
|
*/
|
||||||
|
|
||||||
int sock_create_lite(int family, int type, int protocol, struct socket **res)
|
int sock_create_lite(int family, int type, int protocol, struct socket **res)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
|
@ -1224,6 +1309,21 @@ call_kill:
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(sock_wake_async);
|
EXPORT_SYMBOL(sock_wake_async);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* __sock_create - creates a socket
|
||||||
|
* @net: net namespace
|
||||||
|
* @family: protocol family (AF_INET, ...)
|
||||||
|
* @type: communication type (SOCK_STREAM, ...)
|
||||||
|
* @protocol: protocol (0, ...)
|
||||||
|
* @res: new socket
|
||||||
|
* @kern: boolean for kernel space sockets
|
||||||
|
*
|
||||||
|
* Creates a new socket and assigns it to @res, passing through LSM.
|
||||||
|
* Returns 0 or an error. On failure @res is set to %NULL. @kern must
|
||||||
|
* be set to true if the socket resides in kernel space.
|
||||||
|
* This function internally uses GFP_KERNEL.
|
||||||
|
*/
|
||||||
|
|
||||||
int __sock_create(struct net *net, int family, int type, int protocol,
|
int __sock_create(struct net *net, int family, int type, int protocol,
|
||||||
struct socket **res, int kern)
|
struct socket **res, int kern)
|
||||||
{
|
{
|
||||||
|
@ -1333,12 +1433,35 @@ out_release:
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(__sock_create);
|
EXPORT_SYMBOL(__sock_create);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sock_create - creates a socket
|
||||||
|
* @family: protocol family (AF_INET, ...)
|
||||||
|
* @type: communication type (SOCK_STREAM, ...)
|
||||||
|
* @protocol: protocol (0, ...)
|
||||||
|
* @res: new socket
|
||||||
|
*
|
||||||
|
* A wrapper around __sock_create().
|
||||||
|
* Returns 0 or an error. This function internally uses GFP_KERNEL.
|
||||||
|
*/
|
||||||
|
|
||||||
int sock_create(int family, int type, int protocol, struct socket **res)
|
int sock_create(int family, int type, int protocol, struct socket **res)
|
||||||
{
|
{
|
||||||
return __sock_create(current->nsproxy->net_ns, family, type, protocol, res, 0);
|
return __sock_create(current->nsproxy->net_ns, family, type, protocol, res, 0);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(sock_create);
|
EXPORT_SYMBOL(sock_create);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sock_create_kern - creates a socket (kernel space)
|
||||||
|
* @net: net namespace
|
||||||
|
* @family: protocol family (AF_INET, ...)
|
||||||
|
* @type: communication type (SOCK_STREAM, ...)
|
||||||
|
* @protocol: protocol (0, ...)
|
||||||
|
* @res: new socket
|
||||||
|
*
|
||||||
|
* A wrapper around __sock_create().
|
||||||
|
* Returns 0 or an error. This function internally uses GFP_KERNEL.
|
||||||
|
*/
|
||||||
|
|
||||||
int sock_create_kern(struct net *net, int family, int type, int protocol, struct socket **res)
|
int sock_create_kern(struct net *net, int family, int type, int protocol, struct socket **res)
|
||||||
{
|
{
|
||||||
return __sock_create(net, family, type, protocol, res, 1);
|
return __sock_create(net, family, type, protocol, res, 1);
|
||||||
|
@ -3322,18 +3445,46 @@ static long compat_sock_ioctl(struct file *file, unsigned int cmd,
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* kernel_bind - bind an address to a socket (kernel space)
|
||||||
|
* @sock: socket
|
||||||
|
* @addr: address
|
||||||
|
* @addrlen: length of address
|
||||||
|
*
|
||||||
|
* Returns 0 or an error.
|
||||||
|
*/
|
||||||
|
|
||||||
int kernel_bind(struct socket *sock, struct sockaddr *addr, int addrlen)
|
int kernel_bind(struct socket *sock, struct sockaddr *addr, int addrlen)
|
||||||
{
|
{
|
||||||
return sock->ops->bind(sock, addr, addrlen);
|
return sock->ops->bind(sock, addr, addrlen);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(kernel_bind);
|
EXPORT_SYMBOL(kernel_bind);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* kernel_listen - move socket to listening state (kernel space)
|
||||||
|
* @sock: socket
|
||||||
|
* @backlog: pending connections queue size
|
||||||
|
*
|
||||||
|
* Returns 0 or an error.
|
||||||
|
*/
|
||||||
|
|
||||||
int kernel_listen(struct socket *sock, int backlog)
|
int kernel_listen(struct socket *sock, int backlog)
|
||||||
{
|
{
|
||||||
return sock->ops->listen(sock, backlog);
|
return sock->ops->listen(sock, backlog);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(kernel_listen);
|
EXPORT_SYMBOL(kernel_listen);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* kernel_accept - accept a connection (kernel space)
|
||||||
|
* @sock: listening socket
|
||||||
|
* @newsock: new connected socket
|
||||||
|
* @flags: flags
|
||||||
|
*
|
||||||
|
* @flags must be SOCK_CLOEXEC, SOCK_NONBLOCK or 0.
|
||||||
|
* If it fails, @newsock is guaranteed to be %NULL.
|
||||||
|
* Returns 0 or an error.
|
||||||
|
*/
|
||||||
|
|
||||||
int kernel_accept(struct socket *sock, struct socket **newsock, int flags)
|
int kernel_accept(struct socket *sock, struct socket **newsock, int flags)
|
||||||
{
|
{
|
||||||
struct sock *sk = sock->sk;
|
struct sock *sk = sock->sk;
|
||||||
|
@ -3359,6 +3510,19 @@ done:
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(kernel_accept);
|
EXPORT_SYMBOL(kernel_accept);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* kernel_connect - connect a socket (kernel space)
|
||||||
|
* @sock: socket
|
||||||
|
* @addr: address
|
||||||
|
* @addrlen: address length
|
||||||
|
* @flags: flags (O_NONBLOCK, ...)
|
||||||
|
*
|
||||||
|
* For datagram sockets, @addr is the addres to which datagrams are sent
|
||||||
|
* by default, and the only address from which datagrams are received.
|
||||||
|
* For stream sockets, attempts to connect to @addr.
|
||||||
|
* Returns 0 or an error code.
|
||||||
|
*/
|
||||||
|
|
||||||
int kernel_connect(struct socket *sock, struct sockaddr *addr, int addrlen,
|
int kernel_connect(struct socket *sock, struct sockaddr *addr, int addrlen,
|
||||||
int flags)
|
int flags)
|
||||||
{
|
{
|
||||||
|
@ -3366,18 +3530,48 @@ int kernel_connect(struct socket *sock, struct sockaddr *addr, int addrlen,
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(kernel_connect);
|
EXPORT_SYMBOL(kernel_connect);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* kernel_getsockname - get the address which the socket is bound (kernel space)
|
||||||
|
* @sock: socket
|
||||||
|
* @addr: address holder
|
||||||
|
*
|
||||||
|
* Fills the @addr pointer with the address which the socket is bound.
|
||||||
|
* Returns 0 or an error code.
|
||||||
|
*/
|
||||||
|
|
||||||
int kernel_getsockname(struct socket *sock, struct sockaddr *addr)
|
int kernel_getsockname(struct socket *sock, struct sockaddr *addr)
|
||||||
{
|
{
|
||||||
return sock->ops->getname(sock, addr, 0);
|
return sock->ops->getname(sock, addr, 0);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(kernel_getsockname);
|
EXPORT_SYMBOL(kernel_getsockname);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* kernel_peername - get the address which the socket is connected (kernel space)
|
||||||
|
* @sock: socket
|
||||||
|
* @addr: address holder
|
||||||
|
*
|
||||||
|
* Fills the @addr pointer with the address which the socket is connected.
|
||||||
|
* Returns 0 or an error code.
|
||||||
|
*/
|
||||||
|
|
||||||
int kernel_getpeername(struct socket *sock, struct sockaddr *addr)
|
int kernel_getpeername(struct socket *sock, struct sockaddr *addr)
|
||||||
{
|
{
|
||||||
return sock->ops->getname(sock, addr, 1);
|
return sock->ops->getname(sock, addr, 1);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(kernel_getpeername);
|
EXPORT_SYMBOL(kernel_getpeername);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* kernel_getsockopt - get a socket option (kernel space)
|
||||||
|
* @sock: socket
|
||||||
|
* @level: API level (SOL_SOCKET, ...)
|
||||||
|
* @optname: option tag
|
||||||
|
* @optval: option value
|
||||||
|
* @optlen: option length
|
||||||
|
*
|
||||||
|
* Assigns the option length to @optlen.
|
||||||
|
* Returns 0 or an error.
|
||||||
|
*/
|
||||||
|
|
||||||
int kernel_getsockopt(struct socket *sock, int level, int optname,
|
int kernel_getsockopt(struct socket *sock, int level, int optname,
|
||||||
char *optval, int *optlen)
|
char *optval, int *optlen)
|
||||||
{
|
{
|
||||||
|
@ -3400,6 +3594,17 @@ int kernel_getsockopt(struct socket *sock, int level, int optname,
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(kernel_getsockopt);
|
EXPORT_SYMBOL(kernel_getsockopt);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* kernel_setsockopt - set a socket option (kernel space)
|
||||||
|
* @sock: socket
|
||||||
|
* @level: API level (SOL_SOCKET, ...)
|
||||||
|
* @optname: option tag
|
||||||
|
* @optval: option value
|
||||||
|
* @optlen: option length
|
||||||
|
*
|
||||||
|
* Returns 0 or an error.
|
||||||
|
*/
|
||||||
|
|
||||||
int kernel_setsockopt(struct socket *sock, int level, int optname,
|
int kernel_setsockopt(struct socket *sock, int level, int optname,
|
||||||
char *optval, unsigned int optlen)
|
char *optval, unsigned int optlen)
|
||||||
{
|
{
|
||||||
|
@ -3420,6 +3625,17 @@ int kernel_setsockopt(struct socket *sock, int level, int optname,
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(kernel_setsockopt);
|
EXPORT_SYMBOL(kernel_setsockopt);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* kernel_sendpage - send a &page through a socket (kernel space)
|
||||||
|
* @sock: socket
|
||||||
|
* @page: page
|
||||||
|
* @offset: page offset
|
||||||
|
* @size: total size in bytes
|
||||||
|
* @flags: flags (MSG_DONTWAIT, ...)
|
||||||
|
*
|
||||||
|
* Returns the total amount sent in bytes or an error.
|
||||||
|
*/
|
||||||
|
|
||||||
int kernel_sendpage(struct socket *sock, struct page *page, int offset,
|
int kernel_sendpage(struct socket *sock, struct page *page, int offset,
|
||||||
size_t size, int flags)
|
size_t size, int flags)
|
||||||
{
|
{
|
||||||
|
@ -3430,6 +3646,18 @@ int kernel_sendpage(struct socket *sock, struct page *page, int offset,
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(kernel_sendpage);
|
EXPORT_SYMBOL(kernel_sendpage);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* kernel_sendpage_locked - send a &page through the locked sock (kernel space)
|
||||||
|
* @sk: sock
|
||||||
|
* @page: page
|
||||||
|
* @offset: page offset
|
||||||
|
* @size: total size in bytes
|
||||||
|
* @flags: flags (MSG_DONTWAIT, ...)
|
||||||
|
*
|
||||||
|
* Returns the total amount sent in bytes or an error.
|
||||||
|
* Caller must hold @sk.
|
||||||
|
*/
|
||||||
|
|
||||||
int kernel_sendpage_locked(struct sock *sk, struct page *page, int offset,
|
int kernel_sendpage_locked(struct sock *sk, struct page *page, int offset,
|
||||||
size_t size, int flags)
|
size_t size, int flags)
|
||||||
{
|
{
|
||||||
|
@ -3443,17 +3671,30 @@ int kernel_sendpage_locked(struct sock *sk, struct page *page, int offset,
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(kernel_sendpage_locked);
|
EXPORT_SYMBOL(kernel_sendpage_locked);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* kernel_shutdown - shut down part of a full-duplex connection (kernel space)
|
||||||
|
* @sock: socket
|
||||||
|
* @how: connection part
|
||||||
|
*
|
||||||
|
* Returns 0 or an error.
|
||||||
|
*/
|
||||||
|
|
||||||
int kernel_sock_shutdown(struct socket *sock, enum sock_shutdown_cmd how)
|
int kernel_sock_shutdown(struct socket *sock, enum sock_shutdown_cmd how)
|
||||||
{
|
{
|
||||||
return sock->ops->shutdown(sock, how);
|
return sock->ops->shutdown(sock, how);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(kernel_sock_shutdown);
|
EXPORT_SYMBOL(kernel_sock_shutdown);
|
||||||
|
|
||||||
/* This routine returns the IP overhead imposed by a socket i.e.
|
/**
|
||||||
* the length of the underlying IP header, depending on whether
|
* kernel_sock_ip_overhead - returns the IP overhead imposed by a socket
|
||||||
* this is an IPv4 or IPv6 socket and the length from IP options turned
|
* @sk: socket
|
||||||
* on at the socket. Assumes that the caller has a lock on the socket.
|
*
|
||||||
|
* This routine returns the IP overhead imposed by a socket i.e.
|
||||||
|
* the length of the underlying IP header, depending on whether
|
||||||
|
* this is an IPv4 or IPv6 socket and the length from IP options turned
|
||||||
|
* on at the socket. Assumes that the caller has a lock on the socket.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
u32 kernel_sock_ip_overhead(struct sock *sk)
|
u32 kernel_sock_ip_overhead(struct sock *sk)
|
||||||
{
|
{
|
||||||
struct inet_sock *inet;
|
struct inet_sock *inet;
|
||||||
|
|
Loading…
Reference in New Issue