[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[UNIKRAFT PATCH 0/3] Introduce posix-socket



From: Alexander Jung <alexander.jung@xxxxxxxxx>

This patch series introduces the posix-socket microlibrary within the
Unikraft core in order to facilitate the use of multiple POSIX-
compliant socket implementations which target specific AF family
numbers.

This library allows for the registration of socket interfaces, listed
within `struct posix_socket_ops`, and exposes unikernel-wide 
prototypes for socket(), accept(), bind(), listen(), connect(),
send(), recv() and friends in order to access them via a 
corresponding AF family number.  The implementing library simply needs
to register against the desired interfaces with a glue function:

  #include <uk/socket.h>
  #include "my_socket.h"

  static struct posix_socket_ops mysock_socket_ops = {
    /* The initialization function on socket registration. */
    .init        = mysock_lib_init,
    /* POSIX interfaces */
    .create      = mysock_glue_create,
    .accept      = mysock_glue_accept,
    .bind        = mysock_glue_bind,
    .shutdown    = mysock_glue_shutdown,
    .getpeername = mysock_glue_getpeername,
    .getsockname = mysock_glue_getsockname,
    .getsockopt  = mysock_glue_getsockopt,
    .setsockopt  = mysock_glue_setsockopt,
    .connect     = mysock_glue_connect,
    .listen      = mysock_glue_listen,
    .recv        = mysock_glue_recv,
    .recvfrom    = mysock_glue_recvfrom,
    .recvmsg     = mysock_glue_recvmsg,
    .send        = mysock_glue_send,
    .sendmsg     = mysock_glue_sendmsg,
    .sendto      = mysock_glue_sendto,
    /* vfscore ops */
    .read        = mysock_glue_read,
    .write       = mysock_glue_write,
    .close       = mysock_glue_close,
    .ioctl       = mysock_glue_ioctl,
  };

Each glue function accepts traditional parameters for the POSIX 
interface as side from the file descriptor, traditionally `int fd` or 
`int sock`, which has instead been cast as `void *`.  This allows the
implementing library to use internal socket file descriptor or
reference.  The creation of a socket via socket() and accept() have 
also been cast to return `void *` in line with internal needs of the 
implementing library.  This makes sense for implementing libraries
which use a structure instead of a file descriptor identification 
integer.  An additional parameter, `struct posix_socket_driver`, is 
passed to each interface which can store private data as well as a
preferred memory allocator.  The glue for each interface simply needs
to call the appropriate method internally, for example:

  static int
  mysock_glue_bind(struct posix_socket_driver *d,
          void *sock, const struct sockaddr *addr, socklen_t addr_len)
  {
    int ret = 0;
    struct my_socket *mysock;

    /* Transform the socket descriptor to the my_socket pointer. */
    mysock = (struct my_socket *)sock;
    if (mysock->mysock_fd < 0) {
      ret = -1;
      SOCKET_LIB_ERR(d, ret, "failed to identify socket descriptor");
      goto EXIT;
    }
    
    /* Bind to my socket */
    ret = mysock_bind(mysock->mysock_fd, addr, addr_len);
    if (ret < 0)
      ret = -1;

  EXIT:
    return ret;
  }

The library selects the appropriate implementation based on the AF
family number and registers the required interfaces using a newly
exposed macro:

  POSIX_SOCKET_FAMILY_REGISTER(AF_INET,  &mysock_socket_ops, NULL);

Implementing libraries can register as many AF numbers as desired
or specify new families which are not listed in the <sys/socket.h>
header.  To access the relevant implementation, the application
simply needs to call the socket() method with the relevant AF family
number.

Alexander Jung (3):
  lib/posix-socket: Introduce abstraction for communication sockets
  lib/nolibc: Provide sys/socket.h
  lib/posix-socket: Register library within Unikraft.

 lib/Makefile.uk                             |    1 +
 lib/nolibc/include/sys/socket.h             |  258 +++++
 lib/posix-socket/Config.uk                  |   18 +
 lib/posix-socket/Makefile.uk                |   10 +
 lib/posix-socket/driver.c                   |  154 +++
 lib/posix-socket/exportsyms.uk              |   26 +
 lib/posix-socket/extra.ld                   |    9 +
 lib/posix-socket/include/uk/socket.h        |   45 +
 lib/posix-socket/include/uk/socket_driver.h | 1018 +++++++++++++++++++
 lib/posix-socket/include/uk/socket_vnops.h  |   97 ++
 lib/posix-socket/socket.c                   |  722 +++++++++++++
 lib/posix-socket/socket_vnops.c             |  323 ++++++
 12 files changed, 2681 insertions(+)
 create mode 100644 lib/nolibc/include/sys/socket.h
 create mode 100644 lib/posix-socket/Config.uk
 create mode 100644 lib/posix-socket/Makefile.uk
 create mode 100644 lib/posix-socket/driver.c
 create mode 100644 lib/posix-socket/exportsyms.uk
 create mode 100644 lib/posix-socket/extra.ld
 create mode 100644 lib/posix-socket/include/uk/socket.h
 create mode 100644 lib/posix-socket/include/uk/socket_driver.h
 create mode 100644 lib/posix-socket/include/uk/socket_vnops.h
 create mode 100644 lib/posix-socket/socket.c
 create mode 100644 lib/posix-socket/socket_vnops.c

-- 
2.20.1




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.