DEV9: Make use of MAC_Address struct

This commit is contained in:
TheLastRar 2023-01-16 20:34:19 +00:00 committed by refractionpcsx2
parent 8fbecbcdd7
commit a85a2a3cc5
7 changed files with 56 additions and 52 deletions

View File

@ -27,8 +27,8 @@ namespace PacketReader
EthernetFrame::EthernetFrame(NetPacket* pkt) EthernetFrame::EthernetFrame(NetPacket* pkt)
{ {
int offset = 0; int offset = 0;
NetLib::ReadByteArray((u8*)pkt->buffer, &offset, 6, destinationMAC); NetLib::ReadMACAddress((u8*)pkt->buffer, &offset, &destinationMAC);
NetLib::ReadByteArray((u8*)pkt->buffer, &offset, 6, sourceMAC); NetLib::ReadMACAddress((u8*)pkt->buffer, &offset, &sourceMAC);
headerLength = 14; //(6+6+2) headerLength = 14; //(6+6+2)
@ -51,8 +51,8 @@ namespace PacketReader
int counter = 0; int counter = 0;
pkt->size = headerLength + payload->GetLength(); pkt->size = headerLength + payload->GetLength();
NetLib::WriteByteArray((u8*)pkt->buffer, &counter, 6, destinationMAC); NetLib::WriteMACAddress((u8*)pkt->buffer, &counter, destinationMAC);
NetLib::WriteByteArray((u8*)pkt->buffer, &counter, 6, sourceMAC); NetLib::WriteMACAddress((u8*)pkt->buffer, &counter, sourceMAC);
// //
NetLib::WriteUInt16((u8*)pkt->buffer, &counter, protocol); NetLib::WriteUInt16((u8*)pkt->buffer, &counter, protocol);
// //

View File

@ -16,6 +16,7 @@
#pragma once #pragma once
#include "DEV9/net.h" #include "DEV9/net.h"
#include "MAC_Address.h"
#include "Payload.h" #include "Payload.h"
namespace PacketReader namespace PacketReader
@ -34,8 +35,8 @@ namespace PacketReader
class EthernetFrame class EthernetFrame
{ {
public: public:
u8 destinationMAC[6] = {0}; MAC_Address destinationMAC{};
u8 sourceMAC[6] = {0}; MAC_Address sourceMAC{};
u16 protocol = 0; u16 protocol = 0;
int headerLength = 14; int headerLength = 14;

View File

@ -37,6 +37,8 @@
#include <wil/com.h> #include <wil/com.h>
#include <wil/resource.h> #include <wil/resource.h>
#include "DEV9/PacketReader/MAC_Address.h"
//============= //=============
// TAP IOCTLs // TAP IOCTLs
//============= //=============
@ -206,7 +208,7 @@ AdapterOptions TAPAdapter::GetAdapterOptions()
return AdapterOptions::None; return AdapterOptions::None;
} }
static int TAPGetMACAddress(HANDLE handle, u8* addr) static int TAPGetMACAddress(HANDLE handle, PacketReader::MAC_Address* addr)
{ {
DWORD len = 0; DWORD len = 0;
@ -551,17 +553,17 @@ TAPAdapter::TAPAdapter()
cancel = CreateEvent(NULL, TRUE, FALSE, NULL); cancel = CreateEvent(NULL, TRUE, FALSE, NULL);
u8 hostMAC[6]; PacketReader::MAC_Address hostMAC;
u8 newMAC[6]; PacketReader::MAC_Address newMAC;
TAPGetMACAddress(htap, hostMAC); TAPGetMACAddress(htap, &hostMAC);
memcpy(newMAC, ps2MAC, 6); newMAC = ps2MAC;
//Lets take the hosts last 2 bytes to make it unique on Xlink //Lets take the hosts last 2 bytes to make it unique on Xlink
newMAC[5] = hostMAC[4]; newMAC.bytes[5] = hostMAC.bytes[4];
newMAC[4] = hostMAC[5]; newMAC.bytes[4] = hostMAC.bytes[5];
SetMACAddress(newMAC); SetMACAddress(&newMAC);
IP_ADAPTER_ADDRESSES adapter; IP_ADAPTER_ADDRESSES adapter;
std::unique_ptr<IP_ADAPTER_ADDRESSES[]> buffer; std::unique_ptr<IP_ADAPTER_ADDRESSES[]> buffer;

View File

@ -178,8 +178,8 @@ using namespace PacketReader::IP;
using namespace PacketReader::IP::UDP; using namespace PacketReader::IP::UDP;
const IP_Address NetAdapter::internalIP{{{192, 0, 2, 1}}}; const IP_Address NetAdapter::internalIP{{{192, 0, 2, 1}}};
const u8 NetAdapter::broadcastMAC[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; const MAC_Address NetAdapter::broadcastMAC{{{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}}};
const u8 NetAdapter::internalMAC[6] = {0x76, 0x6D, 0xF4, 0x63, 0x30, 0x31}; const MAC_Address NetAdapter::internalMAC{{{0x76, 0x6D, 0xF4, 0x63, 0x30, 0x31}}};
NetAdapter::NetAdapter() NetAdapter::NetAdapter()
{ {
@ -268,15 +268,14 @@ void NetAdapter::InspectRecv(NetPacket* pkt)
} }
} }
void NetAdapter::SetMACAddress(u8* mac) void NetAdapter::SetMACAddress(MAC_Address* mac)
{ {
if (mac == nullptr) if (mac == nullptr)
memcpy(ps2MAC, defaultMAC, 6); ps2MAC = defaultMAC;
else else
memcpy(ps2MAC, mac, 6); ps2MAC = *mac;
for (int i = 0; i < 3; i++) *(MAC_Address*)&dev9.eeprom[0] = ps2MAC;
dev9.eeprom[i] = ((u16*)ps2MAC)[i];
//The checksum seems to be all the values of the mac added up in 16bit chunks //The checksum seems to be all the values of the mac added up in 16bit chunks
dev9.eeprom[3] = (dev9.eeprom[0] + dev9.eeprom[1] + dev9.eeprom[2]) & 0xffff; dev9.eeprom[3] = (dev9.eeprom[0] + dev9.eeprom[1] + dev9.eeprom[2]) & 0xffff;
@ -284,13 +283,13 @@ void NetAdapter::SetMACAddress(u8* mac)
bool NetAdapter::VerifyPkt(NetPacket* pkt, int read_size) bool NetAdapter::VerifyPkt(NetPacket* pkt, int read_size)
{ {
if ((memcmp(pkt->buffer, ps2MAC, 6) != 0) && (memcmp(pkt->buffer, &broadcastMAC, 6) != 0)) if ((*(MAC_Address*)&pkt->buffer[0] != ps2MAC) && (*(MAC_Address*)&pkt->buffer[0] != broadcastMAC))
{ {
//ignore strange packets //ignore strange packets
return false; return false;
} }
if (memcmp(pkt->buffer + 6, ps2MAC, 6) == 0) if (*(MAC_Address*)&pkt->buffer[6] == ps2MAC)
{ {
//avoid pcap looping packets //avoid pcap looping packets
return false; return false;
@ -347,8 +346,8 @@ bool NetAdapter::InternalServerRecv(NetPacket* pkt)
ippkt->destinationIP = {{{255, 255, 255, 255}}}; ippkt->destinationIP = {{{255, 255, 255, 255}}};
ippkt->sourceIP = internalIP; ippkt->sourceIP = internalIP;
EthernetFrame frame(ippkt); EthernetFrame frame(ippkt);
memcpy(frame.sourceMAC, internalMAC, 6); frame.sourceMAC = internalMAC;
memcpy(frame.destinationMAC, ps2MAC, 6); frame.destinationMAC = ps2MAC;
frame.protocol = (u16)EtherType::IPv4; frame.protocol = (u16)EtherType::IPv4;
frame.WritePacket(pkt); frame.WritePacket(pkt);
return true; return true;
@ -361,8 +360,8 @@ bool NetAdapter::InternalServerRecv(NetPacket* pkt)
ippkt->destinationIP = ps2IP; ippkt->destinationIP = ps2IP;
ippkt->sourceIP = internalIP; ippkt->sourceIP = internalIP;
EthernetFrame frame(ippkt); EthernetFrame frame(ippkt);
memcpy(frame.sourceMAC, internalMAC, 6); frame.sourceMAC = internalMAC;
memcpy(frame.destinationMAC, ps2MAC, 6); frame.destinationMAC = ps2MAC;
frame.protocol = (u16)EtherType::IPv4; frame.protocol = (u16)EtherType::IPv4;
frame.WritePacket(pkt); frame.WritePacket(pkt);
InspectRecv(pkt); InspectRecv(pkt);

View File

@ -34,6 +34,7 @@
#include "Config.h" #include "Config.h"
#include "PacketReader/MAC_Address.h"
#include "PacketReader/IP/IP_Address.h" #include "PacketReader/IP/IP_Address.h"
#include "InternalServers/DHCP_Server.h" #include "InternalServers/DHCP_Server.h"
#include "InternalServers/DNS_Logger.h" #include "InternalServers/DNS_Logger.h"
@ -42,7 +43,7 @@
struct ConfigDEV9; struct ConfigDEV9;
// first three recognized by Xlink as Sony PS2 // first three recognized by Xlink as Sony PS2
const u8 defaultMAC[6] = {0x00, 0x04, 0x1F, 0x82, 0x30, 0x31}; const PacketReader::MAC_Address defaultMAC = {{{0x00, 0x04, 0x1F, 0x82, 0x30, 0x31}}};
struct NetPacket struct NetPacket
{ {
@ -93,9 +94,9 @@ public:
static const PacketReader::IP::IP_Address internalIP; static const PacketReader::IP::IP_Address internalIP;
protected: protected:
u8 ps2MAC[6]; PacketReader::MAC_Address ps2MAC;
static const u8 broadcastMAC[6]; static const PacketReader::MAC_Address broadcastMAC;
static const u8 internalMAC[6]; static const PacketReader::MAC_Address internalMAC;
private: private:
//Only set if packet sent to the internal IP address //Only set if packet sent to the internal IP address
@ -126,7 +127,7 @@ public:
virtual ~NetAdapter(); virtual ~NetAdapter();
protected: protected:
void SetMACAddress(u8* mac); void SetMACAddress(PacketReader::MAC_Address* mac);
bool VerifyPkt(NetPacket* pkt, int read_size); bool VerifyPkt(NetPacket* pkt, int read_size);
void InspectRecv(NetPacket* pkt); void InspectRecv(NetPacket* pkt);

View File

@ -39,6 +39,7 @@
#include "DEV9.h" #include "DEV9.h"
#include "AdapterUtils.h" #include "AdapterUtils.h"
#include "net.h" #include "net.h"
#include "DEV9/PacketReader/MAC_Address.h"
#ifndef PCAP_NETMASK_UNKNOWN #ifndef PCAP_NETMASK_UNKNOWN
#define PCAP_NETMASK_UNKNOWN 0xffffffff #define PCAP_NETMASK_UNKNOWN 0xffffffff
#endif #endif
@ -293,13 +294,13 @@ PCAPAdapter::PCAPAdapter()
mac_address newMAC; mac_address newMAC;
GetMACAddress(EmuConfig.DEV9.EthDevice, &hostMAC); GetMACAddress(EmuConfig.DEV9.EthDevice, &hostMAC);
memcpy(&newMAC, ps2MAC, 6); memcpy(&newMAC, &ps2MAC, 6);
//Lets take the hosts last 2 bytes to make it unique on Xlink //Lets take the hosts last 2 bytes to make it unique on Xlink
newMAC.bytes[5] = hostMAC.bytes[4]; newMAC.bytes[5] = hostMAC.bytes[4];
newMAC.bytes[4] = hostMAC.bytes[5]; newMAC.bytes[4] = hostMAC.bytes[5];
SetMACAddress((u8*)&newMAC); SetMACAddress((PacketReader::MAC_Address*)&newMAC);
host_mac = hostMAC; host_mac = hostMAC;
ps2_mac = newMAC; //Needed outside of this class ps2_mac = newMAC; //Needed outside of this class

View File

@ -239,34 +239,34 @@ SocketAdapter::SocketAdapter()
InitInternalServer(&adapter, true, ps2IP, subnet, gateway); InitInternalServer(&adapter, true, ps2IP, subnet, gateway);
u8 hostMAC[6]; MAC_Address hostMAC;
u8 newMAC[6]; MAC_Address newMAC;
#ifdef _WIN32 #ifdef _WIN32
memcpy(hostMAC, adapter.PhysicalAddress, 6); hostMAC = *(MAC_Address*)adapter.PhysicalAddress;
#elif defined(__linux__) #elif defined(__linux__)
struct ifreq ifr; struct ifreq ifr;
int fd = socket(AF_INET, SOCK_DGRAM, 0); int fd = socket(AF_INET, SOCK_DGRAM, 0);
strcpy(ifr.ifr_name, adapter.ifa_name); strcpy(ifr.ifr_name, adapter.ifa_name);
if (0 == ioctl(fd, SIOCGIFHWADDR, &ifr)) if (0 == ioctl(fd, SIOCGIFHWADDR, &ifr))
memcpy(hostMAC, ifr.ifr_hwaddr.sa_data, 6); hostMAC = *(MAC_Address*)ifr.ifr_hwaddr.sa_data;
else else
{ {
memcpy(hostMAC, ps2MAC, 6); hostMAC = ps2MAC;
Console.Error("Could not get MAC address for adapter: %s", adapter.ifa_name); Console.Error("Could not get MAC address for adapter: %s", adapter.ifa_name);
} }
::close(fd); ::close(fd);
#else #else
memcpy(hostMAC, ps2MAC, 6); hostMAC = ps2MAC;
Console.Error("Could not get MAC address for adapter, OS not supported"); Console.Error("Could not get MAC address for adapter, OS not supported");
#endif #endif
memcpy(newMAC, ps2MAC, 6); newMAC = ps2MAC;
//Lets take the hosts last 2 bytes to make it unique on Xlink //Lets take the hosts last 2 bytes to make it unique on Xlink
newMAC[5] = hostMAC[4]; newMAC.bytes[5] = hostMAC.bytes[4];
newMAC[4] = hostMAC[5]; newMAC.bytes[4] = hostMAC.bytes[5];
SetMACAddress(newMAC); SetMACAddress(&newMAC);
#ifdef _WIN32 #ifdef _WIN32
/* Use the MAKEWORD(lowbyte, highbyte) macro declared in Windef.h */ /* Use the MAKEWORD(lowbyte, highbyte) macro declared in Windef.h */
@ -322,8 +322,8 @@ bool SocketAdapter::recv(NetPacket* pkt)
ipPkt->sourceIP = session->destIP; ipPkt->sourceIP = session->destIP;
EthernetFrame frame(ipPkt); EthernetFrame frame(ipPkt);
memcpy(frame.sourceMAC, internalMAC, 6); frame.sourceMAC = internalMAC;
memcpy(frame.destinationMAC, ps2MAC, 6); frame.destinationMAC = ps2MAC;
frame.protocol = (u16)EtherType::IPv4; frame.protocol = (u16)EtherType::IPv4;
frame.WritePacket(pkt); frame.WritePacket(pkt);
@ -380,17 +380,17 @@ bool SocketAdapter::send(NetPacket* pkt)
//it's trying to resolve the virtual gateway's mac addr //it's trying to resolve the virtual gateway's mac addr
{ {
ARP_Packet* arpRet = new ARP_Packet(6, 4); ARP_Packet* arpRet = new ARP_Packet(6, 4);
memcpy(arpRet->targetHardwareAddress.get(), arpPkt.senderHardwareAddress.get(), 6); *(MAC_Address*)arpRet->targetHardwareAddress.get() = *(MAC_Address*)arpPkt.senderHardwareAddress.get();
memcpy(arpRet->senderHardwareAddress.get(), internalMAC, 6); *(MAC_Address*)arpRet->senderHardwareAddress.get() = internalMAC;
memcpy(arpRet->targetProtocolAddress.get(), arpPkt.senderProtocolAddress.get(), 4); *(IP_Address*)arpRet->targetProtocolAddress.get() = *(IP_Address*)arpPkt.senderProtocolAddress.get();
memcpy(arpRet->senderProtocolAddress.get(), arpPkt.targetProtocolAddress.get(), 4); *(IP_Address*)arpRet->senderProtocolAddress.get() = *(IP_Address*)arpPkt.targetProtocolAddress.get();
arpRet->op = 2, arpRet->op = 2,
arpRet->protocol = arpPkt.protocol; arpRet->protocol = arpPkt.protocol;
arpRet->hardwareType = arpPkt.hardwareType; arpRet->hardwareType = arpPkt.hardwareType;
EthernetFrame* retARP = new EthernetFrame(arpRet); EthernetFrame* retARP = new EthernetFrame(arpRet);
memcpy(retARP->destinationMAC, ps2MAC, 6); retARP->destinationMAC = ps2MAC;
memcpy(retARP->sourceMAC, internalMAC, 6); retARP->sourceMAC = internalMAC;
retARP->protocol = (u16)EtherType::ARP; retARP->protocol = (u16)EtherType::ARP;
vRecBuffer.Enqueue(retARP); vRecBuffer.Enqueue(retARP);