Partially implement IOCtlV 0x8 (NCDGetWirelessMacAddress) of /dev/net/ncd/manage
Only works on Linux for now, need to test the Windows code later git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@5275 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
parent
44038081e3
commit
8cd46cc3bf
|
@ -51,13 +51,18 @@ it failed)
|
||||||
#include <string>
|
#include <string>
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
#include <ws2tcpip.h>
|
#include <ws2tcpip.h>
|
||||||
|
#elif defined(__linux__)
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#include <net/if.h>
|
||||||
#else
|
#else
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
extern std::queue<std::pair<u32,std::string> > g_ReplyQueueLater;
|
extern std::queue<std::pair<u32,std::string> > g_ReplyQueueLater;
|
||||||
|
|
||||||
// **********************************************************************************
|
// **********************************************************************************
|
||||||
|
@ -257,8 +262,8 @@ bool CWII_IPC_HLE_Device_net_ncd_manage::IOCtlV(u32 _CommandAddress)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case IOCTLV_NCD_SETIFCONFIG4: // 7004 In, 32 Out. 4th
|
case IOCTLV_NCD_UNK4: // 7004 In, 32 Out. 4th
|
||||||
INFO_LOG(WII_IPC_NET, "NET_NCD_MANAGE: IOCTLV_NCD_SETIFCONFIG4");
|
INFO_LOG(WII_IPC_NET, "NET_NCD_MANAGE: IOCTLV_NCD_UNK4");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x05: // 7004 Out, 32 Out. 2nd, 3rd
|
case 0x05: // 7004 Out, 32 Out. 2nd, 3rd
|
||||||
|
@ -269,9 +274,51 @@ bool CWII_IPC_HLE_Device_net_ncd_manage::IOCtlV(u32 _CommandAddress)
|
||||||
INFO_LOG(WII_IPC_NET, "NET_NCD_MANAGE: IOCTLV_NCD_GETLINKSTATUS");
|
INFO_LOG(WII_IPC_NET, "NET_NCD_MANAGE: IOCTLV_NCD_GETLINKSTATUS");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x08: // 32 Out, 6 Out. 1st
|
case IOCTLV_NCD_GETWIRELESSMACADDRESS: // 32 Out, 6 Out. 1st
|
||||||
INFO_LOG(WII_IPC_NET, "NET_NCD_MANAGE: IOCtlV 0x8");
|
// TODO: What's the first output buffer for?
|
||||||
|
// second out buffer gets filled with first four bytes of the wireless MAC address.
|
||||||
|
// No idea why the fifth and sixth bytes are left untouched.
|
||||||
|
{
|
||||||
|
// hardcoded address as a fallback
|
||||||
|
// TODO: Make this configurable? Different MAC addresses MIGHT be needed for requesting a user id or encrypting content with NWC24
|
||||||
|
const u8 default_address[] = { 0x00, 0x19, 0x1e, 0xfd, 0x71, 0x84 };
|
||||||
|
|
||||||
|
INFO_LOG(WII_IPC_NET, "NET_NCD_MANAGE: IOCTLV_NCD_GETWIRELESSMACADDRESS");
|
||||||
|
|
||||||
|
#if defined(__linux__)
|
||||||
|
const char *check_devices[3] = { "wlan0", "ath0", "eth0" };
|
||||||
|
int fd, ret;
|
||||||
|
struct ifreq ifr;
|
||||||
|
|
||||||
|
fd = socket(AF_INET, SOCK_DGRAM, 0);
|
||||||
|
ifr.ifr_addr.sa_family = AF_INET;
|
||||||
|
|
||||||
|
for (unsigned int dev = 0; dev < 3; dev++ )
|
||||||
|
{
|
||||||
|
strncpy(ifr.ifr_name, check_devices[dev], IFNAMSIZ-1);
|
||||||
|
|
||||||
|
ret = ioctl(fd, SIOCGIFHWADDR, &ifr);
|
||||||
|
if (ret == 0)
|
||||||
|
{
|
||||||
|
INFO_LOG(WII_IPC_NET, "NET_NCD_MANAGE: IOCTLV_NCD_GETWIRELESSMACADDRESS returning local MAC address of %s", check_devices[dev]);
|
||||||
|
Memory::WriteBigEData((const u8*)ifr.ifr_hwaddr.sa_data, CommandBuffer.PayloadBuffer.at(1).m_Address, 4);
|
||||||
|
close(fd);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
close(fd);
|
||||||
|
|
||||||
|
// fall back to the hardcoded address
|
||||||
|
Memory::WriteBigEData(default_address, CommandBuffer.PayloadBuffer.at(1).m_Address, 4);
|
||||||
|
|
||||||
|
//#elif defined(WIN32)
|
||||||
|
// TODO
|
||||||
|
|
||||||
|
#else
|
||||||
|
Memory::WriteBigEData(default_address, CommandBuffer.PayloadBuffer.at(1).m_Address, 4);
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
INFO_LOG(WII_IPC_NET, "NET_NCD_MANAGE IOCtlV: %#x", CommandBuffer.Parameter);
|
INFO_LOG(WII_IPC_NET, "NET_NCD_MANAGE IOCtlV: %#x", CommandBuffer.Parameter);
|
||||||
|
|
|
@ -304,14 +304,15 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
enum {
|
enum {
|
||||||
IOCTLV_NCD_UNK1 = 1, // NCDLockWirelessDriver
|
IOCTLV_NCD_UNK1 = 0x1, // NCDLockWirelessDriver
|
||||||
IOCTLV_NCD_UNK2 = 2, // NCDUnlockWirelessDriver
|
IOCTLV_NCD_UNK2 = 0x2, // NCDUnlockWirelessDriver
|
||||||
IOCTLV_NCD_READCONFIG = 3,
|
IOCTLV_NCD_READCONFIG = 0x3, // NCDReadConfig?
|
||||||
IOCTLV_NCD_SETIFCONFIG4 = 4, // NCDGetWirelessMacAddress
|
IOCTLV_NCD_UNK4 = 0x4,
|
||||||
IOCTLV_NCD_GETLINKSTATUS = 7 // NCDGetLinkStatus
|
IOCTLV_NCD_GETLINKSTATUS = 0x7, // NCDGetLinkStatus
|
||||||
|
IOCTLV_NCD_GETWIRELESSMACADDRESS = 0x8, // NCDGetWirelessMacAddress
|
||||||
};
|
};
|
||||||
|
|
||||||
network_config_t m_Ifconfig;
|
network_config_t m_Ifconfig;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue