Skip to content

Architecture

Alex Rosenbaum edited this page Dec 24, 2015 · 1 revision

Top-Level

The VMA library is a dynamically linked user-space library. Use of the VMA library does not require any code changes or recompiling of user applications. Instead, it is dynamically loaded via the Linux OS environment variable, LD_PRELOAD. When a user application transmits TCP and UDP, unicast and multicast IPv4 data, or listens for such network traffic data, the VMA library:

  • Intercepts the socket receive and send calls made to the stream socket or datagram socket address families.
  • Implements the underlying work in user space (instead of allowing the buffers to pass on to the usual OS network kernel libraries).

VMA implements native RDMA verbs API. The native RDMA verbs have been extended into the Ethernet RDMA-capable NICs, enabling the packets to pass directly between the user application and the InfiniBand HCA or Ethernet NIC, bypassing the kernel and its TCP/UDP handling network stack.
You can implement the code in native RDMA verbs API, by making any changes to your applications. The VMA library does all the heavy lifting under the hood, while transparently presenting the same standard socket API to the application, thus redirecting the data flow directly to the application so it does not need to change at all.
The VMA library operates in a standard networking stack fashion to serve multiple network interfaces.
The VMA library behaves according to the way the application calls the bind(), connect(), and setsockopt() directives and the administrator sets the route lookup to determine the interface to be used for the socket traffic. The library knows whether data is passing to or from an InfiniBand HCA or Ethernet NIC.
If the data is routed to/from an supported network adapter, the VMA library intercepts the call and does the bypass work. If the data is passing to/from an unsupported network adapter, the VMA library passes the call to the usual kernel libraries responsible for handling network traffic. Thus, the same application can listen in on multiple network interface, without requiring any configuration changes for the hybrid environment.

Socket Types

The following Linux BSD socket types are supported:

  • Datagram sockets (SOCK_DGRAM), also known as connectionless sockets, which use User Datagram Protocol (UDP).
  • Stream sockets (SOCK_STREAM), also known as connection-oriented sockets, which use Transmission Control Protocol (TCP).
Clone this wiki locally