Files
archived-pcsx2/pcsx2/DEV9/sockets.h

67 lines
2.2 KiB
C++

// SPDX-FileCopyrightText: 2002-2026 PCSX2 Dev Team
// SPDX-License-Identifier: GPL-3.0+
#pragma once
#include <mutex>
#include <vector>
#include "net.h"
#include "PacketReader/IP/IP_Packet.h"
#include "PacketReader/EthernetFrame.h"
#include "Sessions/BaseSession.h"
#include "SimpleQueue.h"
#include "ThreadSafeMap.h"
class SocketAdapter : public NetAdapter
{
//SimpleQueue for ARP packages
SimpleQueue<PacketReader::EthernetFrame*> vRecBuffer;
#ifdef _WIN32
bool wsa_init = false;
#endif
bool initialized = false;
PacketReader::IP::IP_Address adapterIP;
ThreadSafeMap<Sessions::ConnectionKey, Sessions::BaseSession*> connections;
ThreadSafeMap<u16, Sessions::BaseSession*> fixedUDPPorts;
std::thread::id sendThreadId;
std::vector<Sessions::BaseSession*> deleteQueueSendThread;
std::vector<Sessions::BaseSession*> deleteQueueRecvThread;
//Mutex to be held when processing the delete queue.
//The Send thread will lock the RecvSentry to prevent the recv thread
//from deleting a session the send thread might be currently working on.
std::mutex deleteSendSentry;
std::mutex deleteRecvSentry;
public:
SocketAdapter();
virtual bool blocks();
virtual bool isInitialised();
//gets a packet.rv :true success
virtual bool recv(NetPacket* pkt);
//sends the packet and deletes it when done (if successful).rv :true success
virtual bool send(NetPacket* pkt);
virtual void reset();
virtual void reloadSettings();
virtual void close();
virtual ~SocketAdapter();
static std::vector<AdapterEntry> GetAdapters();
static AdapterOptions GetAdapterOptions();
private:
bool SendIP(PacketReader::IP::IP_Packet* ipPkt);
bool SendICMP(Sessions::ConnectionKey Key, PacketReader::IP::IP_Packet* ipPkt);
bool SendIGMP(Sessions::ConnectionKey Key, PacketReader::IP::IP_Packet* ipPkt);
bool SendTCP(Sessions::ConnectionKey Key, PacketReader::IP::IP_Packet* ipPkt);
bool SendUDP(Sessions::ConnectionKey Key, PacketReader::IP::IP_Packet* ipPkt);
int SendFromConnection(Sessions::ConnectionKey Key, PacketReader::IP::IP_Packet* ipPkt);
//Event must only be raised once per connection
void HandleConnectionClosed(Sessions::BaseSession* sender);
void HandleFixedPortClosed(Sessions::BaseSession* sender);
};