]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- |
2 | // vim: ts=8 sw=2 smarttab | |
3 | /* | |
4 | * Ceph - scalable distributed file system | |
5 | * | |
6 | * Copyright (C) 2016 XSKY <haomai@xsky.com> | |
7 | * | |
8 | * Author: Haomai Wang <haomaiwang@gmail.com> | |
9 | * | |
10 | * This is free software; you can redistribute it and/or | |
11 | * modify it under the terms of the GNU Lesser General Public | |
12 | * License version 2.1, as published by the Free Software | |
13 | * Foundation. See file COPYING. | |
14 | * | |
15 | */ | |
16 | ||
17 | #include "msg/async/net_handler.h" | |
18 | #include "RDMAStack.h" | |
7c673cae | 19 | |
91327a77 AA |
20 | #include "include/compat.h" |
21 | #include "include/sock_compat.h" | |
22 | ||
7c673cae FG |
23 | #define dout_subsys ceph_subsys_ms |
24 | #undef dout_prefix | |
25 | #define dout_prefix *_dout << " RDMAServerSocketImpl " | |
26 | ||
27 | RDMAServerSocketImpl::RDMAServerSocketImpl(CephContext *cct, Infiniband* i, RDMADispatcher *s, RDMAWorker *w, entity_addr_t& a) | |
31f18b77 | 28 | : cct(cct), net(cct), server_setup_socket(-1), infiniband(i), dispatcher(s), worker(w), sa(a) |
7c673cae FG |
29 | { |
30 | } | |
31 | ||
31f18b77 | 32 | int RDMAServerSocketImpl::listen(entity_addr_t &sa, const SocketOptions &opt) |
7c673cae FG |
33 | { |
34 | int rc = 0; | |
35 | server_setup_socket = net.create_socket(sa.get_family(), true); | |
36 | if (server_setup_socket < 0) { | |
37 | rc = -errno; | |
38 | lderr(cct) << __func__ << " failed to create server socket: " | |
39 | << cpp_strerror(errno) << dendl; | |
40 | return rc; | |
41 | } | |
42 | ||
43 | rc = net.set_nonblock(server_setup_socket); | |
44 | if (rc < 0) { | |
45 | goto err; | |
46 | } | |
47 | ||
48 | rc = net.set_socket_options(server_setup_socket, opt.nodelay, opt.rcbuf_size); | |
49 | if (rc < 0) { | |
50 | goto err; | |
51 | } | |
7c673cae FG |
52 | |
53 | rc = ::bind(server_setup_socket, sa.get_sockaddr(), sa.get_sockaddr_len()); | |
54 | if (rc < 0) { | |
55 | rc = -errno; | |
56 | ldout(cct, 10) << __func__ << " unable to bind to " << sa.get_sockaddr() | |
57 | << " on port " << sa.get_port() << ": " << cpp_strerror(errno) << dendl; | |
58 | goto err; | |
59 | } | |
60 | ||
224ce89b | 61 | rc = ::listen(server_setup_socket, cct->_conf->ms_tcp_listen_backlog); |
7c673cae FG |
62 | if (rc < 0) { |
63 | rc = -errno; | |
64 | lderr(cct) << __func__ << " unable to listen on " << sa << ": " << cpp_strerror(errno) << dendl; | |
65 | goto err; | |
66 | } | |
67 | ||
68 | ldout(cct, 20) << __func__ << " bind to " << sa.get_sockaddr() << " on port " << sa.get_port() << dendl; | |
69 | return 0; | |
70 | ||
71 | err: | |
72 | ::close(server_setup_socket); | |
73 | server_setup_socket = -1; | |
224ce89b | 74 | return rc; |
7c673cae FG |
75 | } |
76 | ||
31f18b77 | 77 | int RDMAServerSocketImpl::accept(ConnectedSocket *sock, const SocketOptions &opt, entity_addr_t *out, Worker *w) |
7c673cae FG |
78 | { |
79 | ldout(cct, 15) << __func__ << dendl; | |
80 | ||
81 | assert(sock); | |
82 | sockaddr_storage ss; | |
83 | socklen_t slen = sizeof(ss); | |
91327a77 | 84 | int sd = accept_cloexec(server_setup_socket, (sockaddr*)&ss, &slen); |
7c673cae FG |
85 | if (sd < 0) { |
86 | return -errno; | |
87 | } | |
88 | ||
7c673cae FG |
89 | int r = net.set_nonblock(sd); |
90 | if (r < 0) { | |
91 | ::close(sd); | |
92 | return -errno; | |
93 | } | |
94 | ||
95 | r = net.set_socket_options(sd, opt.nodelay, opt.rcbuf_size); | |
96 | if (r < 0) { | |
97 | ::close(sd); | |
98 | return -errno; | |
99 | } | |
100 | ||
101 | assert(NULL != out); //out should not be NULL in accept connection | |
102 | ||
103 | out->set_sockaddr((sockaddr*)&ss); | |
104 | net.set_priority(sd, opt.priority, out->get_family()); | |
105 | ||
31f18b77 | 106 | RDMAConnectedSocketImpl* server; |
7c673cae | 107 | //Worker* w = dispatcher->get_stack()->get_worker(); |
31f18b77 FG |
108 | server = new RDMAConnectedSocketImpl(cct, infiniband, dispatcher, dynamic_cast<RDMAWorker*>(w)); |
109 | server->set_accept_fd(sd); | |
7c673cae FG |
110 | ldout(cct, 20) << __func__ << " accepted a new QP, tcp_fd: " << sd << dendl; |
111 | std::unique_ptr<RDMAConnectedSocketImpl> csi(server); | |
112 | *sock = ConnectedSocket(std::move(csi)); | |
113 | ||
114 | return 0; | |
115 | } | |
116 | ||
31f18b77 | 117 | void RDMAServerSocketImpl::abort_accept() |
7c673cae FG |
118 | { |
119 | if (server_setup_socket >= 0) | |
120 | ::close(server_setup_socket); | |
121 | } |