Linux Kernel Architecture

(Jacob Rumans) #1

Chapter 12: Networks


<net.h>
int kernel_sendmsg(struct socket *sock, struct msghdr *msg,
struct kvec *vec, size_t num, size_t len);
int kernel_recvmsg(struct socket *sock, struct msghdr *msg,
struct kvec *vec, size_t num,
size_t len, int flags);

int kernel_bind(struct socket *sock, struct sockaddr *addr,
int addrlen);
int kernel_listen(struct socket *sock, int backlog);
int kernel_accept(struct socket *sock, struct socket **newsock,
int flags);
int kernel_connect(struct socket *sock, struct sockaddr *addr,
int addrlen, int flags);
int kernel_getsockname(struct socket *sock, struct sockaddr *addr,
int *addrlen);
int kernel_getpeername(struct socket *sock, struct sockaddr *addr,
int *addrlen);
int kernel_getsockopt(struct socket *sock, int level, int optname,
char *optval, int *optlen);
int kernel_setsockopt(struct socket *sock, int level, int optname,
char *optval, int optlen);
int kernel_sendpage(struct socket *sock, struct page *page, int offset,
size_t size, int flags);
int kernel_sock_ioctl(struct socket *sock, int cmd, unsigned long arg);
int kernel_sock_shutdown(struct socket *sock,
enum sock_shutdown_cmd how);

With the exception ofkernel_sendmsgandkernel_recvmsg, the parameters are more or less identical
with the userland API, except that sockets are not specified by socket file descriptors, but directly by a
pointer to an instance ofstruct socket. The implementation is simple since the functions work as simple
wrapper routines around the pointers stored in the protocol operationsproto_opsofstruct socket:


net/socket.c
int kernel_connect(struct socket *sock, struct sockaddr *addr, int addrlen,
int flags)
{
return sock->ops->connect(sock, addr, addrlen, flags);
}

A little care is required when the buffer space that takes received data or holds data that must be sent
is specified.kernel_sendmsgandkernel_recvmsgdo not access the data region directly viastruct
msghdras in userland, but employstruct kvec. However, the kernel automatically provides a conversion
between both representations askernel_sendmsgshows.


net/socket.c
int kernel_sendmsg(struct socket *sock, struct msghdr *msg,
struct kvec *vec, size_t num, size_t size)
{
...
int result;
...
msg->msg_iov = (struct iovec *)vec;
msg->msg_iovlen = num;
Free download pdf