Skip to content

Commit

Permalink
DEV9: Always bind UDP ports
Browse files Browse the repository at this point in the history
  • Loading branch information
TheLastRar authored and F0bes committed Dec 3, 2024
1 parent 671255c commit 687c587
Showing 1 changed file with 31 additions and 41 deletions.
72 changes: 31 additions & 41 deletions pcsx2/DEV9/sockets.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -464,55 +464,45 @@ bool SocketAdapter::SendUDP(ConnectionKey Key, IP_Packet* ipPkt)
return false;
else
{
UDP_Session* s = nullptr;

if (abs(udp.sourcePort - udp.destinationPort) <= 10 || //Used for games that assume the destination/source port
ipPkt->destinationIP == dhcpServer.broadcastIP || //Broadcast packets
ipPkt->destinationIP == IP_Address{{{255, 255, 255, 255}}} || //Limited Broadcast packets
(ipPkt->destinationIP.bytes[0] & 0xF0) == 0xE0) //Multicast address start with 0b1110
// Always bind the UDP source port
// PS2 software can run into issues if the source port is not preserved
UDP_FixedPort* fPort = nullptr;
BaseSession* fSession;
if (fixedUDPPorts.TryGetValue(udp.sourcePort, &fSession))
{
UDP_FixedPort* fPort = nullptr;
BaseSession* fSession;
if (fixedUDPPorts.TryGetValue(udp.sourcePort, &fSession))
{
//DevCon.WriteLn("DEV9: Socket: Using Existing UDPFixedPort");
fPort = static_cast<UDP_FixedPort*>(fSession);
}
else
{
ConnectionKey fKey{};
fKey.protocol = (u8)IP_Type::UDP;
fKey.ps2Port = udp.sourcePort;
fKey.srvPort = 0;
fPort = static_cast<UDP_FixedPort*>(fSession);
}
else
{
ConnectionKey fKey{};
fKey.protocol = static_cast<u8>(IP_Type::UDP);
fKey.ps2Port = udp.sourcePort;
fKey.srvPort = 0;

Console.WriteLn("DEV9: Socket: Creating New UDPFixedPort with port %d", udp.sourcePort);
Console.WriteLn("DEV9: Socket: Binding UDP fixed port %d", udp.sourcePort);

fPort = new UDP_FixedPort(fKey, adapterIP, udp.sourcePort);
fPort->AddConnectionClosedHandler([&](BaseSession* session) { HandleFixedPortClosed(session); });
fPort = new UDP_FixedPort(fKey, adapterIP, udp.sourcePort);
fPort->AddConnectionClosedHandler([&](BaseSession* session) { HandleFixedPortClosed(session); });

fPort->destIP = {};
fPort->sourceIP = dhcpServer.ps2IP;
fPort->destIP = {};
fPort->sourceIP = dhcpServer.ps2IP;

connections.Add(fKey, fPort);
fixedUDPPorts.Add(udp.sourcePort, fPort);
connections.Add(fKey, fPort);
fixedUDPPorts.Add(udp.sourcePort, fPort);

fPort->Init();
}
fPort->Init();
}

Console.WriteLn("DEV9: Socket: Creating New UDP Connection from FixedPort %d to %d", udp.sourcePort, udp.destinationPort);
s = fPort->NewClientSession(Key,
ipPkt->destinationIP == dhcpServer.broadcastIP || ipPkt->destinationIP == IP_Address{{{255, 255, 255, 255}}},
(ipPkt->destinationIP.bytes[0] & 0xF0) == 0xE0);
Console.WriteLn("DEV9: Socket: Creating New UDP Connection from fixed port %d to %d", udp.sourcePort, udp.destinationPort);
UDP_Session* s = fPort->NewClientSession(Key,
ipPkt->destinationIP == dhcpServer.broadcastIP || ipPkt->destinationIP == IP_Address{{{255, 255, 255, 255}}},
(ipPkt->destinationIP.bytes[0] & 0xF0) == 0xE0);

if (s == nullptr)
{
Console.Error("DEV9: Socket: Failed to Create New UDP Connection from FixedPort");
return false;
}
}
else
// If we are unable to bind to the port, fall back to a dynamic port
if (s == nullptr)
{
Console.WriteLn("DEV9: Socket: Creating New UDP Connection to %d", udp.destinationPort);
Console.Error("DEV9: Socket: Failed to Create New UDP Connection from fixed port");
Console.WriteLn("DEV9: Socket: Retrying with dynamic port to %d", udp.destinationPort);
s = new UDP_Session(Key, adapterIP);
}

Expand Down Expand Up @@ -577,7 +567,7 @@ void SocketAdapter::HandleFixedPortClosed(BaseSession* sender)
else
deleteQueueRecvThread.push_back(sender);

Console.WriteLn("DEV9: Socket: Closed Dead UDP Fixed Port to %d", key.ps2Port);
Console.WriteLn("DEV9: Socket: Unbound fixed port %d", key.ps2Port);
}

void SocketAdapter::close()
Expand Down

0 comments on commit 687c587

Please sign in to comment.