refactor to use the utility function for bind_socket_to_device() instead of using the bind_to_device socket option directly, to make it best effort. include operation enum in udp_error alert.
This commit is contained in:
parent
ff300ed224
commit
534276e7a5
@ -1326,6 +1326,7 @@ TORRENT_VERSION_NAMESPACE_2
|
|||||||
udp_error_alert(
|
udp_error_alert(
|
||||||
aux::stack_allocator& alloc
|
aux::stack_allocator& alloc
|
||||||
, udp::endpoint const& ep
|
, udp::endpoint const& ep
|
||||||
|
, operation_t op
|
||||||
, error_code const& ec);
|
, error_code const& ec);
|
||||||
|
|
||||||
TORRENT_DEFINE_ALERT(udp_error_alert, 46)
|
TORRENT_DEFINE_ALERT(udp_error_alert, 46)
|
||||||
@ -1336,6 +1337,9 @@ TORRENT_VERSION_NAMESPACE_2
|
|||||||
// the source address associated with the error (if any)
|
// the source address associated with the error (if any)
|
||||||
aux::noexcept_movable<udp::endpoint> endpoint;
|
aux::noexcept_movable<udp::endpoint> endpoint;
|
||||||
|
|
||||||
|
// the operation that failed
|
||||||
|
operation_t operation;
|
||||||
|
|
||||||
// the error code describing the error
|
// the error code describing the error
|
||||||
error_code const error;
|
error_code const error;
|
||||||
};
|
};
|
||||||
|
@ -105,7 +105,7 @@ namespace libtorrent {
|
|||||||
// TODO: 3 use string_view for device_name
|
// TODO: 3 use string_view for device_name
|
||||||
template <class Socket>
|
template <class Socket>
|
||||||
address bind_socket_to_device(io_service& ios, Socket& sock
|
address bind_socket_to_device(io_service& ios, Socket& sock
|
||||||
, boost::asio::ip::tcp const& protocol
|
, tcp const& protocol
|
||||||
, char const* device_name, int port, error_code& ec)
|
, char const* device_name, int port, error_code& ec)
|
||||||
{
|
{
|
||||||
tcp::endpoint bind_ep(address_v4::any(), std::uint16_t(port));
|
tcp::endpoint bind_ep(address_v4::any(), std::uint16_t(port));
|
||||||
|
@ -1018,15 +1018,19 @@ namespace {
|
|||||||
udp_error_alert::udp_error_alert(
|
udp_error_alert::udp_error_alert(
|
||||||
aux::stack_allocator&
|
aux::stack_allocator&
|
||||||
, udp::endpoint const& ep
|
, udp::endpoint const& ep
|
||||||
|
, operation_t op
|
||||||
, error_code const& ec)
|
, error_code const& ec)
|
||||||
: endpoint(ep)
|
: endpoint(ep)
|
||||||
|
, operation(op)
|
||||||
, error(ec)
|
, error(ec)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
std::string udp_error_alert::message() const
|
std::string udp_error_alert::message() const
|
||||||
{
|
{
|
||||||
error_code ec;
|
error_code ec;
|
||||||
return "UDP error: " + convert_from_native(error.message()) + " from: " + endpoint.address().to_string(ec);
|
return "UDP error: " + convert_from_native(error.message())
|
||||||
|
+ " from: " + endpoint.address().to_string(ec)
|
||||||
|
+ " op: " + operation_name(operation);
|
||||||
}
|
}
|
||||||
|
|
||||||
external_ip_alert::external_ip_alert(aux::stack_allocator&
|
external_ip_alert::external_ip_alert(aux::stack_allocator&
|
||||||
|
@ -1438,24 +1438,14 @@ namespace aux {
|
|||||||
// have SO_BINDTODEVICE functionality, use it now.
|
// have SO_BINDTODEVICE functionality, use it now.
|
||||||
#if TORRENT_HAS_BINDTODEVICE
|
#if TORRENT_HAS_BINDTODEVICE
|
||||||
ret->sock->set_option(bind_to_device(lep.device.c_str()), ec);
|
ret->sock->set_option(bind_to_device(lep.device.c_str()), ec);
|
||||||
if (ec)
|
|
||||||
{
|
|
||||||
#ifndef TORRENT_DISABLE_LOGGING
|
#ifndef TORRENT_DISABLE_LOGGING
|
||||||
if (should_log())
|
if (ec && should_log())
|
||||||
{
|
{
|
||||||
session_log("bind to device failed (device: %s): %s"
|
session_log("bind to device failed (device: %s): %s"
|
||||||
, lep.device.c_str(), ec.message().c_str());
|
, lep.device.c_str(), ec.message().c_str());
|
||||||
}
|
|
||||||
#endif // TORRENT_DISABLE_LOGGING
|
|
||||||
|
|
||||||
last_op = operation_t::sock_bind_to_device;
|
|
||||||
if (m_alerts.should_post<listen_failed_alert>())
|
|
||||||
{
|
|
||||||
m_alerts.emplace_alert<listen_failed_alert>(lep.device, bind_ep
|
|
||||||
, last_op, ec, sock_type);
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
#endif // TORRENT_DISABLE_LOGGING
|
||||||
|
ec.clear();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1589,24 +1579,14 @@ namespace aux {
|
|||||||
if (!lep.device.empty())
|
if (!lep.device.empty())
|
||||||
{
|
{
|
||||||
ret->udp_sock->sock.set_option(bind_to_device(lep.device.c_str()), ec);
|
ret->udp_sock->sock.set_option(bind_to_device(lep.device.c_str()), ec);
|
||||||
if (ec)
|
|
||||||
{
|
|
||||||
#ifndef TORRENT_DISABLE_LOGGING
|
#ifndef TORRENT_DISABLE_LOGGING
|
||||||
if (should_log())
|
if (ec && should_log())
|
||||||
{
|
{
|
||||||
session_log("bind to device failed (device: %s): %s"
|
session_log("bind to device failed (device: %s): %s"
|
||||||
, lep.device.c_str(), ec.message().c_str());
|
, lep.device.c_str(), ec.message().c_str());
|
||||||
}
|
|
||||||
#endif // TORRENT_DISABLE_LOGGING
|
|
||||||
|
|
||||||
last_op = operation_t::sock_bind_to_device;
|
|
||||||
if (m_alerts.should_post<listen_failed_alert>())
|
|
||||||
{
|
|
||||||
m_alerts.emplace_alert<listen_failed_alert>(lep.device, bind_ep
|
|
||||||
, last_op, ec, udp_sock_type);
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
#endif // TORRENT_DISABLE_LOGGING
|
||||||
|
ec.clear();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
ret->udp_sock->sock.bind(udp_bind_ep, ec);
|
ret->udp_sock->sock.bind(udp_bind_ep, ec);
|
||||||
@ -1676,7 +1656,8 @@ namespace aux {
|
|||||||
if (err)
|
if (err)
|
||||||
{
|
{
|
||||||
if (m_alerts.should_post<udp_error_alert>())
|
if (m_alerts.should_post<udp_error_alert>())
|
||||||
m_alerts.emplace_alert<udp_error_alert>(ret->udp_sock->sock.local_endpoint(ec), err);
|
m_alerts.emplace_alert<udp_error_alert>(ret->udp_sock->sock.local_endpoint(ec)
|
||||||
|
, operation_t::alloc_recvbuf, err);
|
||||||
}
|
}
|
||||||
|
|
||||||
ret->udp_sock->sock.set_force_proxy(m_settings.get_bool(settings_pack::force_proxy));
|
ret->udp_sock->sock.set_force_proxy(m_settings.get_bool(settings_pack::force_proxy));
|
||||||
@ -2042,7 +2023,8 @@ namespace aux {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (m_alerts.should_post<udp_error_alert>())
|
if (m_alerts.should_post<udp_error_alert>())
|
||||||
m_alerts.emplace_alert<udp_error_alert>(udp_bind_ep, ec);
|
m_alerts.emplace_alert<udp_error_alert>(udp_bind_ep
|
||||||
|
, operation_t::sock_open, ec);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2050,20 +2032,14 @@ namespace aux {
|
|||||||
if (!ep.device.empty())
|
if (!ep.device.empty())
|
||||||
{
|
{
|
||||||
udp_sock->sock.set_option(bind_to_device(ep.device.c_str()), ec);
|
udp_sock->sock.set_option(bind_to_device(ep.device.c_str()), ec);
|
||||||
if (ec)
|
|
||||||
{
|
|
||||||
#ifndef TORRENT_DISABLE_LOGGING
|
#ifndef TORRENT_DISABLE_LOGGING
|
||||||
if (should_log())
|
if (ec && should_log())
|
||||||
{
|
{
|
||||||
session_log("bind to device failed (device: %s): %s"
|
session_log("bind to device failed (device: %s): %s"
|
||||||
, ep.device.c_str(), ec.message().c_str());
|
, ep.device.c_str(), ec.message().c_str());
|
||||||
}
|
|
||||||
#endif // TORRENT_DISABLE_LOGGING
|
|
||||||
|
|
||||||
if (m_alerts.should_post<udp_error_alert>())
|
|
||||||
m_alerts.emplace_alert<udp_error_alert>(udp_bind_ep, ec);
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
|
#endif // TORRENT_DISABLE_LOGGING
|
||||||
|
ec.clear();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
udp_sock->sock.bind(udp_bind_ep, ec);
|
udp_sock->sock.bind(udp_bind_ep, ec);
|
||||||
@ -2078,7 +2054,8 @@ namespace aux {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (m_alerts.should_post<udp_error_alert>())
|
if (m_alerts.should_post<udp_error_alert>())
|
||||||
m_alerts.emplace_alert<udp_error_alert>(udp_bind_ep, ec);
|
m_alerts.emplace_alert<udp_error_alert>(udp_bind_ep
|
||||||
|
, operation_t::sock_bind, ec);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2087,7 +2064,8 @@ namespace aux {
|
|||||||
if (err)
|
if (err)
|
||||||
{
|
{
|
||||||
if (m_alerts.should_post<udp_error_alert>())
|
if (m_alerts.should_post<udp_error_alert>())
|
||||||
m_alerts.emplace_alert<udp_error_alert>(udp_sock->sock.local_endpoint(ec), err);
|
m_alerts.emplace_alert<udp_error_alert>(udp_sock->sock.local_endpoint(ec)
|
||||||
|
, operation_t::alloc_recvbuf, err);
|
||||||
}
|
}
|
||||||
|
|
||||||
udp_sock->sock.set_force_proxy(m_settings.get_bool(settings_pack::force_proxy));
|
udp_sock->sock.set_force_proxy(m_settings.get_bool(settings_pack::force_proxy));
|
||||||
@ -2370,7 +2348,8 @@ namespace aux {
|
|||||||
&& ec != boost::asio::error::bad_descriptor
|
&& ec != boost::asio::error::bad_descriptor
|
||||||
&& m_alerts.should_post<udp_error_alert>())
|
&& m_alerts.should_post<udp_error_alert>())
|
||||||
{
|
{
|
||||||
m_alerts.emplace_alert<udp_error_alert>(ep, ec);
|
m_alerts.emplace_alert<udp_error_alert>(ep
|
||||||
|
, operation_t::sock_read, ec);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef TORRENT_DISABLE_LOGGING
|
#ifndef TORRENT_DISABLE_LOGGING
|
||||||
@ -2455,7 +2434,8 @@ namespace aux {
|
|||||||
|
|
||||||
if (err != boost::asio::error::operation_aborted
|
if (err != boost::asio::error::operation_aborted
|
||||||
&& m_alerts.should_post<udp_error_alert>())
|
&& m_alerts.should_post<udp_error_alert>())
|
||||||
m_alerts.emplace_alert<udp_error_alert>(ep, err);
|
m_alerts.emplace_alert<udp_error_alert>(ep
|
||||||
|
, operation_t::sock_read, err);
|
||||||
|
|
||||||
#ifndef TORRENT_DISABLE_LOGGING
|
#ifndef TORRENT_DISABLE_LOGGING
|
||||||
if (should_log())
|
if (should_log())
|
||||||
@ -5044,9 +5024,7 @@ namespace aux {
|
|||||||
if (ec) return bind_ep;
|
if (ec) return bind_ep;
|
||||||
|
|
||||||
bind_ep.address(bind_socket_to_device(m_io_service, s
|
bind_ep.address(bind_socket_to_device(m_io_service, s
|
||||||
, remote_address.is_v4()
|
, remote_address.is_v4() ? tcp::v4() : tcp::v6()
|
||||||
? boost::asio::ip::tcp::v4()
|
|
||||||
: boost::asio::ip::tcp::v6()
|
|
||||||
, ifname.c_str(), bind_ep.port(), ec));
|
, ifname.c_str(), bind_ep.port(), ec));
|
||||||
return bind_ep;
|
return bind_ep;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user