mirror of
https://github.com/PCSX2/pcsx2.git
synced 2026-01-31 01:15:24 +01:00
67 lines
2.2 KiB
C++
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);
|
|
};
|