mirror of https://github.com/PCSX2/pcsx2.git
DEV9: Make use of MAC_Address struct
This commit is contained in:
parent
8fbecbcdd7
commit
a85a2a3cc5
|
@ -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);
|
||||||
//
|
//
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue