aboutsummaryrefslogtreecommitdiff
path: root/samples/client.c
diff options
context:
space:
mode:
authorThanos Makatos <thanos.makatos@nutanix.com>2020-09-23 08:48:03 -0400
committerThanos Makatos <thanos.makatos@nutanix.com>2020-09-23 08:48:03 -0400
commit2a7005c683c9768484bd791107a4edf6f9bab46d (patch)
tree9a0a2b2ab3f250b21e55b663589235bdeed284f5 /samples/client.c
parenta6664824c7cdc48b8df84e021d4675def272e14d (diff)
downloadlibvfio-user-2a7005c683c9768484bd791107a4edf6f9bab46d.zip
libvfio-user-2a7005c683c9768484bd791107a4edf6f9bab46d.tar.gz
libvfio-user-2a7005c683c9768484bd791107a4edf6f9bab46d.tar.bz2
start handling MAP_DMA, FDs not yet received
Signed-off-by: Thanos Makatos <thanos.makatos@nutanix.com>
Diffstat (limited to 'samples/client.c')
-rw-r--r--samples/client.c67
1 files changed, 34 insertions, 33 deletions
diff --git a/samples/client.c b/samples/client.c
index be7b059..d93870c 100644
--- a/samples/client.c
+++ b/samples/client.c
@@ -37,6 +37,7 @@
#include "../lib/muser.h"
#include "../lib/muser_priv.h"
+#include "../lib/common.h"
static int
init_sock(const char *path)
@@ -59,13 +60,11 @@ init_sock(const char *path)
return sock;
}
-#if 0
static int
map_dma(int sock)
{
struct vfio_user_header hdr = {.msg_id = 1, .cmd = VFIO_USER_DMA_MAP};
}
-#endif
static int
set_version(int sock)
@@ -95,36 +94,15 @@ set_version(int sock)
return 0;
}
-#if 0
-static int
-dma_map(int sock, int fd, uint64_t addr, int size, int offset) {
-
- struct vfio_user_dma_region dma_region = {
- .addr = addr,
- .size = size,
- .offset = offset,
- .prot = PROT_READ | PROT_WRITE,
- .flags = VFIO_USER_F_DMA_REGION_MAPPABLE
- };
- int ret;
-
- ret = send_vfio_user_msg(sock, 1, false, VFIO_USER_DMA_MAP, &dma_region,
- sizeof(dma_region), &fd, 1);
- if (ret < 0) {
- return ret;
- }
- return 0;
-}
-#endif
-
int main(int argc, char *argv[])
{
int ret, sock;
-#if 0
- int dma_region_fd;
char template[] = "XXXXXX";
-#endif
+ struct vfio_user_dma_region dma_regions[2];
+ int dma_region_fds[ARRAY_SIZE(dma_regions)];
+ struct vfio_user_header hdr;
+ uint16_t msg_id;
if (argc != 2) {
fprintf(stderr, "usage: %s /path/to/socket\n", argv[0]);
@@ -143,22 +121,45 @@ int main(int argc, char *argv[])
return ret;
}
-#if 0
/* Tell the server we have a memory DMA region it can access. */
- if ((dma_region_fd = mkstemp(template)) == -1) {
+ if ((dma_region_fds[0] = mkstemp(template)) == -1) {
perror("failed to create DMA file");
return -1;
}
- if ((ret = ftruncate(dma_region_fd, 2 * sysconf(_SC_PAGESIZE))) == -1) {
+ if ((ret = ftruncate(dma_region_fds[0], 2 * sysconf(_SC_PAGESIZE))) == -1) {
perror("failed to truncate file");
return -1;
}
- ret = dma_map(sock, dma_region_fd, 0xdeadbeef, sysconf(_SC_PAGESIZE),
- sysconf(_SC_PAGESIZE));
+
+ dma_regions[0].addr = 0xdeadbeef;
+ dma_regions[0].size = sysconf(_SC_PAGESIZE);
+ dma_regions[0].offset = 0;
+ dma_regions[0].prot = PROT_READ | PROT_WRITE;
+ dma_regions[0].flags = VFIO_USER_F_DMA_REGION_MAPPABLE;
+
+ dma_regions[1].addr = 0xcafebabe;
+ dma_regions[1].size = sysconf(_SC_PAGESIZE);
+ dma_regions[1].offset = dma_regions[0].size;
+ dma_regions[1].prot = PROT_READ | PROT_WRITE;
+ dma_regions[1].flags = VFIO_USER_F_DMA_REGION_MAPPABLE;
+
+ dma_region_fds[1] = dma_region_fds[0];
+
+ msg_id = 1;
+ ret = send_vfio_user_msg(sock, msg_id, false, VFIO_USER_DMA_MAP, dma_regions,
+ sizeof(dma_regions), dma_region_fds,
+ ARRAY_SIZE(dma_region_fds));
+
+ if (ret < 0) {
+ fprintf(stderr, "failed to send DMA regions: %s\n", strerror(-ret));
+ return ret;
+ }
+ ret = recv_vfio_user_msg(sock, &hdr, true, &msg_id);
if (ret < 0) {
+ fprintf(stderr, "failed to receive response for mapping DMA regions: %s\n",
+ strerror(-ret));
return ret;
}
-#endif
return 0;
}