sys_net/P2P: Various fixes
Fix RTT adjustment Fix possible dead pointer interaction in lv2_socket_native::recvfrom() Fix iterator invalidation in nt_p2p_port::recv_data()
This commit is contained in:
@@ -112,7 +112,6 @@ public:
|
|||||||
|
|
||||||
// reply is late, increases rtt
|
// reply is late, increases rtt
|
||||||
auto& msg = it->second;
|
auto& msg = it->second;
|
||||||
const auto addr = msg.dst_addr.sin_addr.s_addr;
|
|
||||||
rtt_info rtt = rtts[msg.sock_id];
|
rtt_info rtt = rtts[msg.sock_id];
|
||||||
// Only increases rtt once per loop(in case a big number of packets are sent at once)
|
// Only increases rtt once per loop(in case a big number of packets are sent at once)
|
||||||
if (!rtt_increased.count(msg.sock_id))
|
if (!rtt_increased.count(msg.sock_id))
|
||||||
@@ -120,7 +119,7 @@ public:
|
|||||||
rtt.num_retries += 1;
|
rtt.num_retries += 1;
|
||||||
// Increases current rtt by 10%
|
// Increases current rtt by 10%
|
||||||
rtt.rtt_time += (rtt.rtt_time / 10);
|
rtt.rtt_time += (rtt.rtt_time / 10);
|
||||||
rtts[addr] = rtt;
|
rtts[msg.sock_id] = rtt;
|
||||||
|
|
||||||
rtt_increased.emplace(msg.sock_id);
|
rtt_increased.emplace(msg.sock_id);
|
||||||
}
|
}
|
||||||
@@ -625,7 +624,7 @@ std::tuple<bool, s32, shared_ptr<lv2_socket>, sys_net_sockaddr> lv2_socket_p2ps:
|
|||||||
sys_net_sockaddr ps3_addr{};
|
sys_net_sockaddr ps3_addr{};
|
||||||
auto* paddr = reinterpret_cast<sys_net_sockaddr_in_p2p*>(&ps3_addr);
|
auto* paddr = reinterpret_cast<sys_net_sockaddr_in_p2p*>(&ps3_addr);
|
||||||
|
|
||||||
lv2_socket_p2ps* sock_client = reinterpret_cast<lv2_socket_p2ps*>(idm::check_unlocked<lv2_socket>(p2ps_client));
|
auto sock_client = static_cast<shared_ptr<lv2_socket_p2ps>>(idm::get_unlocked<lv2_socket>(p2ps_client));
|
||||||
{
|
{
|
||||||
std::lock_guard lock(sock_client->mutex);
|
std::lock_guard lock(sock_client->mutex);
|
||||||
paddr->sin_family = SYS_NET_AF_INET;
|
paddr->sin_family = SYS_NET_AF_INET;
|
||||||
|
|||||||
@@ -249,8 +249,9 @@ bool nt_p2p_port::recv_data()
|
|||||||
|
|
||||||
auto& bound_sockets = ::at32(bound_p2p_vports, dst_vport);
|
auto& bound_sockets = ::at32(bound_p2p_vports, dst_vport);
|
||||||
|
|
||||||
for (const auto sock_id : bound_sockets)
|
for (auto it = bound_sockets.begin(); it != bound_sockets.end();)
|
||||||
{
|
{
|
||||||
|
s32 sock_id = *it;
|
||||||
const auto sock = idm::check<lv2_socket>(sock_id, [&](lv2_socket& sock)
|
const auto sock = idm::check<lv2_socket>(sock_id, [&](lv2_socket& sock)
|
||||||
{
|
{
|
||||||
ensure(sock.get_type() == SYS_NET_SOCK_DGRAM_P2P);
|
ensure(sock.get_type() == SYS_NET_SOCK_DGRAM_P2P);
|
||||||
@@ -262,12 +263,17 @@ bool nt_p2p_port::recv_data()
|
|||||||
if (!sock)
|
if (!sock)
|
||||||
{
|
{
|
||||||
sys_net.error("Socket %d found in bound_p2p_vports didn't exist!", sock_id);
|
sys_net.error("Socket %d found in bound_p2p_vports didn't exist!", sock_id);
|
||||||
bound_sockets.erase(sock_id);
|
it = bound_sockets.erase(it);
|
||||||
if (bound_sockets.empty())
|
if (bound_sockets.empty())
|
||||||
{
|
{
|
||||||
bound_p2p_vports.erase(dst_vport);
|
bound_p2p_vports.erase(dst_vport);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
it++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
Reference in New Issue
Block a user