#include <netinet/tcp.h>
#include <unistd.h>
#include <semaphore.h>
+#include <stdio.h>
#include <rdma/rdma_cma.h>
#include <rdma/rdma_verbs.h>
uint32_t msg;
long flags;
+ printf("connect_fork\n");
fd = fd_getd(socket);
flags = real.fcntl(fd, F_GETFL);
real.fcntl(fd, F_SETFL, 0);
ret = real.connect(fd, addr, addrlen);
+ printf("connect_fork - real connect %d %s\n", ret, strerror(errno));
if (ret)
return ret;
ret = real.recv(fd, &msg, sizeof msg, MSG_PEEK);
+ printf("connect_fork - real recv %d msg %d\n", ret, msg);
if ((ret != sizeof msg) || msg) {
fd_store(socket, fd, fd_normal);
return 0;
real.fcntl(fd, F_SETFL, flags);
ret = transpose_socket(socket, fd_rsocket);
+ printf("connect_fork - transpose socket %d\n", ret);
if (ret < 0)
return ret;
uint32_t msg;
init_preload();
+ printf("fork\n");
pid = real.fork();
+ printf("fork - pid %d fork_support %d last_accept %d \n",
+ pid, fork_support, last_accept);
if (pid || !fork_support || (last_accept < 0) ||
(fd_get(last_accept, &sfd) != fd_fork))
goto out;
+ printf("fork - switching to rsocket\n");
len = sizeof sin6;
ret = real.getsockname(sfd, (struct sockaddr *) &sin6, &len);
if (ret)
sin6.sin6_flowinfo = sin6.sin6_scope_id = 0;
memset(&sin6.sin6_addr, 0, sizeof sin6.sin6_addr);
+ sem_unlink("/rsocket_fork");
sem = sem_open("/rsocket_fork", O_CREAT | O_RDWR,
S_IRWXU | S_IRWXG, 1);
+ printf("fork - sem_open\n");
+ printf("fork - sem value %d\n", sem_getvalue(sem, &ret));
if (sem == SEM_FAILED)
goto out;
lfd = rsocket(sin6.sin6_family, SOCK_STREAM, 0);
+ printf("fork - rsocket %d\n", lfd);
if (lfd < 0)
goto sclose;
param = 1;
rsetsockopt(lfd, SOL_SOCKET, SO_REUSEADDR, ¶m, sizeof param);
+ printf("fork - waiting for semaphore\n");
sem_wait(sem);
ret = rbind(lfd, (struct sockaddr *) &sin6, sizeof sin6);
+ printf("fork - rbind %d\n", ret);
if (ret)
goto lclose;
ret = rlisten(lfd, 1);
+ printf("fork - rlisten %d\n", ret);
if (ret)
goto lclose;
msg = 0;
ret = real.write(sfd, &msg, sizeof msg);
+ printf("fork - real write %d\n", ret);
if (ret != sizeof msg)
goto lclose;
dfd = raccept(lfd, NULL, NULL);
+ printf("fork - raccept %d %s\n", dfd, strerror(errno));
if (dfd < 0)
goto lclose;
struct rs_conn_data *creq, cresp;
int ret;
+ printf("raccept %d\n", socket);
rs = idm_at(&idm, socket);
new_rs = rs_alloc(rs);
if (!new_rs)
return ERR(ENOMEM);
ret = rdma_get_request(rs->cm_id, &new_rs->cm_id);
+ printf("raccept get request %d\n", ret);
if (ret)
goto err;
ret = rs_insert(new_rs);
+ printf("raccept insert %d\n", ret);
if (ret < 0)
goto err;
rs_set_nonblocking(new_rs, O_NONBLOCK);
ret = rs_create_ep(new_rs);
+ printf("raccept create ep %d\n", ret);
if (ret)
goto err;
param = new_rs->cm_id->event->param.conn;
rs_set_conn_data(new_rs, ¶m, &cresp);
ret = rdma_accept(new_rs->cm_id, ¶m);
+ printf("raccept rdma accept %d\n", ret);
if (!ret)
new_rs->state = rs_connect_rdwr;
else if (errno == EAGAIN || errno == EWOULDBLOCK)