]>
git.proxmox.com Git - ceph.git/blob - ceph/src/seastar/src/net/stack.cc
2 * This file is open source software, licensed to you under the terms
3 * of the Apache License, Version 2.0 (the "License"). See the NOTICE file
4 * distributed with this work for additional information regarding copyright
5 * ownership. You may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing,
12 * software distributed under the License is distributed on an
13 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14 * KIND, either express or implied. See the License for the
15 * specific language governing permissions and limitations
19 * Copyright 2015 Cloudius Systems
22 #include <seastar/net/stack.hh>
23 #include <seastar/core/reactor.hh>
27 net::udp_channel::udp_channel()
30 net::udp_channel::udp_channel(std::unique_ptr
<udp_channel_impl
> impl
) : _impl(std::move(impl
))
33 net::udp_channel::~udp_channel()
36 net::udp_channel::udp_channel(udp_channel
&&) = default;
37 net::udp_channel
& net::udp_channel::operator=(udp_channel
&&) = default;
39 future
<net::udp_datagram
> net::udp_channel::receive() {
40 return _impl
->receive();
43 future
<> net::udp_channel::send(ipv4_addr dst
, const char* msg
) {
44 return _impl
->send(std::move(dst
), msg
);
47 future
<> net::udp_channel::send(ipv4_addr dst
, packet p
) {
48 return _impl
->send(std::move(dst
), std::move(p
));
51 bool net::udp_channel::is_closed() const {
52 return _impl
->is_closed();
55 void net::udp_channel::shutdown_input() {
56 _impl
->shutdown_input();
59 void net::udp_channel::shutdown_output() {
60 _impl
->shutdown_output();
64 void net::udp_channel::close() {
65 return _impl
->close();
68 connected_socket::connected_socket()
71 connected_socket::connected_socket(
72 std::unique_ptr
<net::connected_socket_impl
> csi
)
73 : _csi(std::move(csi
)) {
76 connected_socket::connected_socket(connected_socket
&& cs
) noexcept
= default;
77 connected_socket
& connected_socket::operator=(connected_socket
&& cs
) noexcept
= default;
79 connected_socket::~connected_socket()
82 input_stream
<char> connected_socket::input() {
83 return input_stream
<char>(_csi
->source());
86 output_stream
<char> connected_socket::output(size_t buffer_size
) {
87 // TODO: allow user to determine buffer size etc
88 return output_stream
<char>(_csi
->sink(), buffer_size
, false, true);
91 void connected_socket::set_nodelay(bool nodelay
) {
92 _csi
->set_nodelay(nodelay
);
95 bool connected_socket::get_nodelay() const {
96 return _csi
->get_nodelay();
98 void connected_socket::set_keepalive(bool keepalive
) {
99 _csi
->set_keepalive(keepalive
);
101 bool connected_socket::get_keepalive() const {
102 return _csi
->get_keepalive();
104 void connected_socket::set_keepalive_parameters(const net::keepalive_params
& p
) {
105 _csi
->set_keepalive_parameters(p
);
107 net::keepalive_params
connected_socket::get_keepalive_parameters() const {
108 return _csi
->get_keepalive_parameters();
111 void connected_socket::shutdown_output() {
112 _csi
->shutdown_output();
115 void connected_socket::shutdown_input() {
116 _csi
->shutdown_input();
123 std::unique_ptr
<net::socket_impl
> si
)
124 : _si(std::move(si
)) {
127 socket::socket(socket
&&) noexcept
= default;
128 socket
& socket::operator=(socket
&&) noexcept
= default;
130 future
<connected_socket
> socket::connect(socket_address sa
, socket_address local
, transport proto
) {
131 return _si
->connect(sa
, local
, proto
);
134 void socket::shutdown() {
138 server_socket::server_socket() {
141 server_socket::server_socket(std::unique_ptr
<net::server_socket_impl
> ssi
)
142 : _ssi(std::move(ssi
)) {
144 server_socket::server_socket(server_socket
&& ss
) noexcept
= default;
145 server_socket
& server_socket::operator=(server_socket
&& cs
) noexcept
= default;
147 server_socket::~server_socket() {
150 future
<connected_socket
, socket_address
> server_socket::accept() {
152 return make_exception_future
<connected_socket
, socket_address
>(std::system_error(ECONNABORTED
, std::system_category()));
154 return _ssi
->accept();
157 void server_socket::abort_accept() {
158 _ssi
->abort_accept();
162 socket_address::socket_address(ipv4_addr addr
)
163 : socket_address(make_ipv4_address(addr
))
167 bool socket_address::operator==(const socket_address
& a
) const {
169 return std::tie(u
.in
.sin_family
, u
.in
.sin_port
, u
.in
.sin_addr
.s_addr
)
170 == std::tie(a
.u
.in
.sin_family
, a
.u
.in
.sin_port
,
171 a
.u
.in
.sin_addr
.s_addr
);