mirror of
https://github.com/Team-Resurgent/dvd2xbox.git
synced 2026-04-30 10:09:12 -07:00
379 lines
9.9 KiB
C++
379 lines
9.9 KiB
C++
//#include "../stdafx.h"
|
|
|
|
#include "network.h"
|
|
#include "Undocumented.h"
|
|
|
|
// global network variable
|
|
CNetwork g_network;
|
|
|
|
static char* inet_ntoa (struct in_addr in)
|
|
{
|
|
static char _inetaddress[32];
|
|
sprintf(_inetaddress, "%d.%d.%d.%d", in.S_un.S_un_b.s_b1, in.S_un.S_un_b.s_b2, in.S_un.S_un_b.s_b3, in.S_un.S_un_b.s_b4);
|
|
return _inetaddress;
|
|
}
|
|
|
|
|
|
void CNetwork::OverrideDash( struct network_info& networkinfo )
|
|
{
|
|
TXNetConfigParams params;
|
|
XNetLoadConfigParams( ¶ms );
|
|
bool bDirty = false;
|
|
|
|
if ( !networkinfo.DHCP )
|
|
{
|
|
bool bXboxVersion2 = (params.V2_Tag == 0x58425632 ); // "XBV2"
|
|
|
|
if (bXboxVersion2)
|
|
{
|
|
if (params.V2_IP.s_addr != inet_addr(networkinfo.ip))
|
|
{
|
|
params.V2_IP.s_addr = inet_addr(networkinfo.ip);
|
|
bDirty = true;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (params.V1_IP.s_addr != inet_addr(networkinfo.ip))
|
|
{
|
|
params.V1_IP.s_addr = inet_addr(networkinfo.ip);
|
|
bDirty = true;
|
|
}
|
|
}
|
|
|
|
if (bXboxVersion2)
|
|
{
|
|
if (params.V2_Subnetmask.s_addr != inet_addr(networkinfo.subnet))
|
|
{
|
|
params.V2_Subnetmask.s_addr = inet_addr(networkinfo.subnet);
|
|
bDirty = true;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (params.V1_Subnetmask.s_addr != inet_addr(networkinfo.subnet))
|
|
{
|
|
params.V1_Subnetmask.s_addr = inet_addr(networkinfo.subnet);
|
|
bDirty = true;
|
|
}
|
|
}
|
|
|
|
if (bXboxVersion2)
|
|
{
|
|
if (params.V2_Defaultgateway.s_addr != inet_addr(networkinfo.gateway))
|
|
{
|
|
params.V2_Defaultgateway.s_addr = inet_addr(networkinfo.gateway);
|
|
bDirty = true;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (params.V1_Defaultgateway.s_addr != inet_addr(networkinfo.gateway))
|
|
{
|
|
params.V1_Defaultgateway.s_addr = inet_addr(networkinfo.gateway);
|
|
bDirty = true;
|
|
}
|
|
}
|
|
|
|
if (bXboxVersion2)
|
|
{
|
|
if (params.V2_DNS1.s_addr != inet_addr(networkinfo.DNS1))
|
|
{
|
|
params.V2_DNS1.s_addr = inet_addr(networkinfo.DNS1);
|
|
bDirty = true;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (params.V1_DNS1.s_addr != inet_addr(networkinfo.DNS1))
|
|
{
|
|
params.V1_DNS1.s_addr = inet_addr(networkinfo.DNS1);
|
|
bDirty = true;
|
|
}
|
|
}
|
|
|
|
if (bXboxVersion2)
|
|
{
|
|
if (params.V2_DNS2.s_addr != inet_addr(networkinfo.DNS2))
|
|
{
|
|
params.V2_DNS2.s_addr = inet_addr(networkinfo.DNS2);
|
|
bDirty = true;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (params.V1_DNS2.s_addr != inet_addr(networkinfo.DNS2))
|
|
{
|
|
params.V1_DNS2.s_addr = inet_addr(networkinfo.DNS2);
|
|
bDirty = true;
|
|
}
|
|
}
|
|
|
|
if (params.Flag != (0x04 | 0x08) )
|
|
{
|
|
params.Flag = 0x04 | 0x08;
|
|
bDirty = true;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
TXNetConfigParams oldconfig;
|
|
memcpy(&oldconfig, ¶ms, sizeof(TXNetConfigParams));
|
|
|
|
unsigned char *raw = (unsigned char*)¶ms;
|
|
|
|
//memset( raw, 0, sizeof(params)); /* shouldn't be needed, xbox should still remember what ip's where set statically */
|
|
|
|
/** Set DHCP-flags from a known DHCP mode (maybe some day we will fix this) **/
|
|
/* i'm guessing these are some dhcp options */
|
|
/* debug dash doesn't set them like this thou */
|
|
/* i have a feeling we don't even need to touch these */
|
|
raw[40] = 33; raw[41] = 223; raw[42] = 196; raw[43] = 67; // param.Data_28
|
|
raw[44] = 6; raw[45] = 145; raw[46] = 157; raw[47] = 118; // param.Data_2c
|
|
raw[48] = 182; raw[49] = 239; raw[50] = 68; raw[51] = 197; // param.Data_30
|
|
raw[52] = 133; raw[53] = 150; raw[54] = 118; raw[55] = 211; // param.Data_34
|
|
raw[56] = 38; raw[57] = 87; raw[58] = 222; raw[59] = 119; // param.Data_38
|
|
|
|
/* clears static ip flag */
|
|
raw[64] = 0; // first part of params.Flag.. wonder if params.Flag really should be a DWORD
|
|
|
|
//raw[72] = 0; raw[73] = 0; raw[74] = 0; raw[75] = 0; /* this would have cleared the v2 ip, just silly */
|
|
|
|
/* no idea what this is, could be additional dhcp options, but's hard to tell */
|
|
raw[340] = 160; raw[341] = 93; raw[342] = 131; raw[343] = 191; raw[344] = 46;
|
|
|
|
/* if something was changed, update with this */
|
|
if( memcmp(&oldconfig, ¶ms, sizeof(TXNetConfigParams)) != 0 )
|
|
bDirty = true;
|
|
|
|
DebugOut("requesting DHCP");
|
|
}
|
|
|
|
/* if we changed anything, we should write data to persistant memory */
|
|
/* maybe we could avoid this by calling XNetConfig after XNetStartup */
|
|
if( bDirty )
|
|
XNetSaveConfigParams( ¶ms );
|
|
}
|
|
|
|
bool CNetwork::Initialize(int iAssignment, const char* szLocalAddress, const char* szLocalSubnet, const char* szLocalGateway, const char* szNameServer)
|
|
{
|
|
|
|
WSACleanup();
|
|
XNetCleanup();
|
|
|
|
memset(&m_networkinfo , 0, sizeof(m_networkinfo ));
|
|
if (iAssignment == NETWORK_DHCP)
|
|
{
|
|
DebugOut( "use DHCP");
|
|
m_networkinfo.DHCP = true;
|
|
OverrideDash( m_networkinfo );
|
|
}
|
|
else if (iAssignment == NETWORK_STATIC)
|
|
{
|
|
DebugOut( "use static ip");
|
|
m_networkinfo.DHCP = false;
|
|
|
|
strcpy(m_networkinfo.ip, szLocalAddress);
|
|
strcpy(m_networkinfo.subnet, szLocalSubnet);
|
|
strcpy(m_networkinfo.gateway, szLocalGateway);
|
|
strcpy(m_networkinfo.DNS1, szNameServer);
|
|
OverrideDash( m_networkinfo );
|
|
}
|
|
else
|
|
{
|
|
DebugOut("use dashboard");
|
|
}
|
|
|
|
{ /* okey now startup the settings we wish to use */
|
|
XNetStartupParams xnsp;
|
|
memset(&xnsp, 0, sizeof(xnsp));
|
|
xnsp.cfgSizeOfStruct = sizeof(XNetStartupParams);
|
|
|
|
// Bypass security so that we may connect to 'untrusted' hosts
|
|
xnsp.cfgFlags = XNET_STARTUP_BYPASS_SECURITY;
|
|
// create more memory for networking
|
|
xnsp.cfgPrivatePoolSizeInPages = 64; // == 256kb, default = 12 (48kb)
|
|
xnsp.cfgEnetReceiveQueueLength = 16; // == 32kb, default = 8 (16kb)
|
|
xnsp.cfgIpFragMaxSimultaneous = 16; // default = 4
|
|
xnsp.cfgIpFragMaxPacketDiv256 = 32; // == 8kb, default = 8 (2kb)
|
|
xnsp.cfgSockMaxSockets = 64; // default = 64
|
|
xnsp.cfgSockDefaultRecvBufsizeInK = 128; // default = 16
|
|
xnsp.cfgSockDefaultSendBufsizeInK = 128; // default = 16
|
|
|
|
DWORD dwState = XNetStartup(&xnsp);
|
|
if( dwState != 0 )
|
|
{
|
|
DebugOut(" - XNetStartup failed with error %d", dwState);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/* startup winsock */
|
|
WSADATA WsaData;
|
|
DWORD dwState = WSAStartup( MAKEWORD(2, 2), &WsaData );
|
|
if( NO_ERROR != dwState )
|
|
{
|
|
DebugOut(" - WSAStartup failed with error %d", dwState);
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/* update network state, call repetedly while return value is XNET_GET_XNADDR_PENDING */
|
|
DWORD CNetwork::UpdateState()
|
|
{
|
|
XNADDR xna;
|
|
DWORD dwState = XNetGetTitleXnAddr(&xna);
|
|
DWORD dwLink = XNetGetEthernetLinkStatus();
|
|
|
|
if( !(dwLink & XNET_ETHERNET_LINK_ACTIVE) )
|
|
{
|
|
if( m_networkup )
|
|
{
|
|
memset(&m_networkinfo, 0, sizeof(m_networkinfo));
|
|
m_lastlink = 0;
|
|
m_laststate = 0;
|
|
m_networkup = false;
|
|
}
|
|
return XNET_GET_XNADDR_NONE;
|
|
}
|
|
|
|
if( dwState == XNET_GET_XNADDR_PENDING )
|
|
{
|
|
/* reset current network settings, as we might have lost */
|
|
/* connection */
|
|
if( m_networkup )
|
|
{
|
|
memset(&m_networkinfo, 0, sizeof(m_networkinfo));
|
|
m_lastlink = 0;
|
|
m_laststate = 0;
|
|
m_networkup = false;
|
|
}
|
|
|
|
return XNET_GET_XNADDR_PENDING;
|
|
}
|
|
|
|
|
|
/* get the current status */
|
|
TXNetConfigStatus status;
|
|
XNetGetConfigStatus(&status);
|
|
|
|
/* fill local network info */
|
|
strcpy(m_networkinfo.ip, inet_ntoa(status.ip));
|
|
strcpy(m_networkinfo.subnet, inet_ntoa(status.subnet));
|
|
strcpy(m_networkinfo.gateway, inet_ntoa(status.gateway));
|
|
strcpy(m_networkinfo.dhcpserver, "");
|
|
strcpy(m_networkinfo.DNS1, inet_ntoa(status.dns1));
|
|
strcpy(m_networkinfo.DNS2, inet_ntoa(status.dns2));
|
|
|
|
|
|
if( m_lastlink != dwState )
|
|
{
|
|
/* check that what type of network is attached */
|
|
if ( dwLink & XNET_ETHERNET_LINK_ACTIVE )
|
|
{
|
|
|
|
if ( dwLink & XNET_ETHERNET_LINK_FULL_DUPLEX )
|
|
DebugOut(" - Link: full duplex");
|
|
|
|
if ( dwLink & XNET_ETHERNET_LINK_HALF_DUPLEX )
|
|
DebugOut(" - Link: half duplex");
|
|
|
|
if ( dwLink & XNET_ETHERNET_LINK_100MBPS )
|
|
DebugOut(" - Link: 100 mbps");
|
|
|
|
if ( dwLink & XNET_ETHERNET_LINK_10MBPS )
|
|
DebugOut(" - Link: 10bmps");
|
|
}
|
|
}
|
|
|
|
if( m_laststate != dwState )
|
|
{
|
|
if ( dwState & XNET_GET_XNADDR_STATIC )
|
|
{
|
|
DebugOut(" - State: static");
|
|
|
|
m_networkinfo.DHCP = false;
|
|
m_networkup = true;
|
|
}
|
|
|
|
if ( dwState & XNET_GET_XNADDR_DHCP )
|
|
{
|
|
DebugOut(" - State: dhcp");
|
|
|
|
m_networkinfo.DHCP = true;
|
|
m_networkup = true;
|
|
}
|
|
|
|
if ( dwState & XNET_GET_XNADDR_DNS )
|
|
DebugOut(" - State: dns");
|
|
|
|
if ( dwState & XNET_GET_XNADDR_ETHERNET )
|
|
DebugOut(" - State: ethernet");
|
|
|
|
if ( dwState & XNET_GET_XNADDR_NONE )
|
|
DebugOut(" - State: none");
|
|
|
|
if ( dwState & XNET_GET_XNADDR_ONLINE )
|
|
DebugOut(" - State: online");
|
|
|
|
if ( dwState & XNET_GET_XNADDR_PENDING )
|
|
DebugOut(" - State: pending");
|
|
|
|
if ( dwState & XNET_GET_XNADDR_TROUBLESHOOT )
|
|
DebugOut(" - State: error");
|
|
|
|
if ( dwState & XNET_GET_XNADDR_PPPOE )
|
|
DebugOut(" - State: ppoe");
|
|
|
|
|
|
DebugOut(" - Interface: IP %s", m_networkinfo.ip);
|
|
DebugOut(" - Interface: SUBNET %s", m_networkinfo.subnet);
|
|
DebugOut(" - Interface: GATEWAY %s", m_networkinfo.gateway);
|
|
// DebugOut(" - DHCPSERVER: %s", m_networkinfo.dhcpserver);
|
|
DebugOut(" - Interface: DNS1 %s", m_networkinfo.DNS1);
|
|
DebugOut(" - Interface: DNS2 %s", m_networkinfo.DNS2);
|
|
|
|
}
|
|
return dwState;
|
|
}
|
|
|
|
bool CNetwork::IsEthernetConnected()
|
|
{
|
|
if (!(XNetGetEthernetLinkStatus() & XNET_ETHERNET_LINK_ACTIVE))
|
|
return false;
|
|
|
|
return true;
|
|
}
|
|
|
|
bool CNetwork::WaitForSetup(DWORD timeout)
|
|
{
|
|
DWORD timestamp = GetTickCount() + timeout;
|
|
|
|
if( !IsEthernetConnected() )
|
|
return false;
|
|
|
|
do
|
|
{
|
|
if( UpdateState() != XNET_GET_XNADDR_PENDING )
|
|
return true;
|
|
|
|
Sleep(100);
|
|
} while( GetTickCount() < timestamp );
|
|
|
|
return false;
|
|
}
|
|
|
|
CNetwork::CNetwork(void)
|
|
{
|
|
memset(&m_networkinfo, 0, sizeof(m_networkinfo));
|
|
m_lastlink = 0;
|
|
m_laststate = 0;
|
|
m_networkup = false;
|
|
}
|
|
|
|
CNetwork::~CNetwork(void)
|
|
{
|
|
}
|