#include <netinet/tcp.h>
#include <unistd.h>
#include <semaphore.h>
+#include <stdio.h>
#include <rdma/rdma_cma.h>
#include <rdma/rdma_verbs.h>
if (index < 0)
return index;
+ printf("socket\n");
recursive = 1;
ret = rsocket(domain, type, protocol);
recursive = 0;
if (fork_support) {
rclose(ret);
ret = real.socket(domain, type, protocol);
+ printf("socket - fork support - real socket %d\n", ret);
if (ret < 0)
return ret;
fd_store(index, ret, fd_fork);
fd_store(index, ret, fd_rsocket);
set_rsocket_options(ret);
}
+ printf("socket - return %d\n", index);
return index;
}
fd_close(index, &ret);
int bind(int socket, const struct sockaddr *addr, socklen_t addrlen)
{
int fd;
+ printf("bind %d\n", socket);
return (fd_get(socket, &fd) == fd_rsocket) ?
rbind(fd, addr, addrlen) : real.bind(fd, addr, addrlen);
}
int listen(int socket, int backlog)
{
int fd;
+ printf("listen %d\n", socket);
return (fd_get(socket, &fd) == fd_rsocket) ?
rlisten(fd, backlog) : real.listen(fd, backlog);
}
int fd, index, ret;
enum fd_type type;
+ printf("accept %d\n", socket);
type = fd_get(socket, &fd);
if (type == fd_rsocket || type == fd_fork) {
index = fd_open();
ret = (type == fd_rsocket) ? raccept(fd, addr, addrlen) :
real.accept(fd, addr, addrlen);
+ printf("accept %d, new index %d new socket %d err %s\n",
+ socket, index, ret, strerror(errno));
if (ret < 0) {
fd_close(index, &fd);
return ret;
}
+ printf("accept %d, new index %d new socket %d\n", socket, index, ret);
fd_store(index, ret, type);
return index;
} else {
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);
+ do {
+ ret = real.recv(fd, &msg, sizeof msg, MSG_PEEK);
+ } while (!ret);
+ printf("connect_fork - real recv %d msg %d\n", ret, msg);
if ((ret != sizeof msg) || msg) {
+ printf("connect_fork - falling back to normal socket\n");
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;
real.close(fd);
+ printf("connect_fork - connecting rsocket");
return rconnect(ret, addr, addrlen);
}
socklen_t len;
uint32_t msg;
+ printf("fork_passive\n");
fd_get(socket, &sfd);
len = sizeof sin6;
ret = real.getsockname(sfd, (struct sockaddr *) &sin6, &len);
+ printf("fork_passive - getsockname %d (%s)\n", ret, strerror(errno));
if (ret)
goto out;
sin6.sin6_flowinfo = sin6.sin6_scope_id = 0;
sem = sem_open("/rsocket_fork", O_CREAT | O_RDWR,
S_IRWXU | S_IRWXG, 1);
+ printf("fork_passive - sem_open %p (%s)\n", (void *) sem, strerror(errno));
if (sem == SEM_FAILED) {
ret = -1;
goto out;
}
lfd = rsocket(sin6.sin6_family, SOCK_STREAM, 0);
+ printf("fork_passive - rsocket %d (%s)\n", lfd, strerror(errno));
if (lfd < 0) {
ret = lfd;
goto sclose;
sem_wait(sem);
ret = rbind(lfd, (struct sockaddr *) &sin6, sizeof sin6);
+ printf("fork_passive - rbind %d (%s)\n", ret, strerror(errno));
if (ret)
goto lclose;
{
int fd, ret;
+ printf("conect %d\n", socket);
switch (fd_get(socket, &fd)) {
case fd_fork:
return fork_active(socket, addr, addrlen);
if (!rs->sbuf)
return -1;
+ printf("rs init bufs cm_id %p pd %p\n", rs->cm_id, rs->cm_id->pd);
rs->smr = rdma_reg_msgs(rs->cm_id, rs->sbuf, rs->sbuf_size);
+ printf("rs init bufs - after reg %p\n", rs->smr);
if (!rs->smr)
return -1;
rs_set_qp_size(rs);
ret = rs_init_bufs(rs);
+ printf("rs create ep init bufs %d\n", ret);
if (ret)
return ret;
ret = rs_create_cq(rs);
+ printf("rs create ep - create cq %d\n", ret);
if (ret)
return ret;
qp_attr.cap.max_inline_data = rs->sq_inline;
ret = rdma_create_qp(rs->cm_id, NULL, &qp_attr);
+ printf("rs create ep - create qp %d\n", ret);
if (ret)
return ret;
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)