-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrdma-server.c
More file actions
134 lines (103 loc) · 3 KB
/
Copy pathrdma-server.c
File metadata and controls
134 lines (103 loc) · 3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#include "rdma-common.h"
static int on_connect_request(struct rdma_cm_id *id);
static int on_connection(struct rdma_cm_id *id);
static int on_disconnect(struct rdma_cm_id *id);
static int on_event(struct rdma_cm_event *event);
static void usage(const char *argv0);
int main(int argc, char **argv)
{
struct sockaddr_in addr;
struct rdma_cm_event *event = NULL;
struct rdma_cm_id *listener = NULL;
struct rdma_event_channel *ec = NULL;
uint16_t port = 0;
uint16_t port2 = 0;
int porcik;
int udpMode = 0;
printf("%d\n", argc);
if (argc != 4)
usage(argv[0]);
if (strcmp(argv[1], "write") == 0)
set_mode(M_WRITE);
else if (strcmp(argv[1], "read") == 0)
set_mode(M_READ);
else
usage(argv[0]);
if (strcmp(argv[2], "tcp") == 0) {
setUdp(0);
udpMode = 0;
} else if (strcmp(argv[2], "udp") == 0) {
setUdp(1);
udpMode = 1;
} else
usage(argv[0]);
setClient(0);
printf("Podano adres %s i port: %s\n", argv[2], argv[3]);
porcik = atoi(argv[3]);
printf("Parsed port: %d\n", porcik);
port2 = porcik;
printf("Converted port number: %u\n", port2);
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons((uint16_t)porcik);
TEST_Z(ec = rdma_create_event_channel());
if (udpMode)
TEST_NZ(rdma_create_id(ec, &listener, NULL, RDMA_PS_UDP));
else
TEST_NZ(rdma_create_id(ec, &listener, NULL, RDMA_PS_TCP));
TEST_NZ(rdma_bind_addr(listener, (struct sockaddr *)&addr));
TEST_NZ(rdma_listen(listener, 10)); /* backlog=10 is arbitrary */
port = ntohs(rdma_get_src_port(listener));
printf("listening on port %d.\n", port);
while (rdma_get_cm_event(ec, &event) == 0) {
struct rdma_cm_event event_copy;
memcpy(&event_copy, event, sizeof(*event));
rdma_ack_cm_event(event);
if (on_event(&event_copy)) {
printf("Does that happen once or more?\n");
break;
}
}
rdma_destroy_id(listener);
rdma_destroy_event_channel(ec);
return 0;
}
int on_connect_request(struct rdma_cm_id *id)
{
struct rdma_conn_param cm_params;
printf("received connection request.\n");
build_connection(id);
build_params(&cm_params);
sprintf(get_local_message_region(id->context), "message from passive/server side with pid %d", getpid());
TEST_NZ(rdma_accept(id, &cm_params));
return 0;
}
int on_connection(struct rdma_cm_id *id)
{
on_connect(id->context);
return 0;
}
int on_disconnect(struct rdma_cm_id *id)
{
printf("peer disconnected.\n");
destroy_connection(id->context);
return 0;
}
int on_event(struct rdma_cm_event *event)
{
int r = 0;
if (event->event == RDMA_CM_EVENT_CONNECT_REQUEST)
r = on_connect_request(event->id);
else if (event->event == RDMA_CM_EVENT_ESTABLISHED)
r = on_connection(event->id);
else if (event->event == RDMA_CM_EVENT_DISCONNECTED)
r = on_disconnect(event->id);
else
die("on_event: unknown event.");
return r;
}
void usage(const char *argv0)
{
fprintf(stderr, "usage: %s <mode> <tcp/udp> <port no.>\n mode = \"read\", \"write\"\n", argv0);
exit(1);
}