Add more adhoc hackery.

But without the kernel thread hackery as it breaks stuff.
This commit is contained in:
LunaMoo committed 2019-03-31 10:48:06 +02:00
1 parent 5f119f3bb8
commit 2652fedef0
7 files changed
+91 -39

No files matched your search

+2
View File
@@ -69,6 +69,8 @@ void Compatibility::CheckSettings(IniFile &iniFile, const std::string &gameID) {
CheckSetting(iniFile, gameID, "MGS2AcidHack", &flags_.MGS2AcidHack);
CheckSetting(iniFile, gameID, "SonicRivalsHack", &flags_.SonicRivalsHack);
CheckSetting(iniFile, gameID, "AdhocHackDisableNBSwitch", &flags_.AdhocHackDisableNBSwitch);
CheckSetting(iniFile, gameID, "AdhocHackStopFriendClear", &flags_.AdhocHackStopFriendClear);
CheckSetting(iniFile, gameID, "AdhocHackPhantasyStarOffset", &flags_.AdhocHackPhantasyStarOffset);
CheckSetting(iniFile, gameID, "BlockTransferAllowCreateFB", &flags_.BlockTransferAllowCreateFB);
CheckSetting(iniFile, gameID, "YugiohSaveFix", &flags_.YugiohSaveFix);
CheckSetting(iniFile, gameID, "ForceUMDDelay", &flags_.ForceUMDDelay);
+2
View File
@@ -69,6 +69,8 @@ struct CompatFlags {
bool MGS2AcidHack;
bool SonicRivalsHack;
bool AdhocHackDisableNBSwitch;
bool AdhocHackStopFriendClear;
bool AdhocHackPhantasyStarOffset;
bool BlockTransferAllowCreateFB;
bool YugiohSaveFix;
bool ForceUMDDelay;
+9 -9
View File
@@ -919,7 +919,7 @@ void AfterMatchingMipsCall::run(MipsCall &call) {
//u32 v0 = currentMIPS->r[MIPS_REG_V0];
if (__IsInInterrupt()) ERROR_LOG(SCENET, "AfterMatchingMipsCall::run [ID=%i][Event=%d] is Returning Inside an Interrupt!", context->id, EventID);
//while (__IsInInterrupt()) sleep_ms(1); // Must not sleep inside callback handler
context->eventlock->lock(); //peerlock.lock();
//context->eventlock->lock(); //peerlock.lock();
//SceNetAdhocMatchingContext * context = findMatchingContext(ID);
//if (context != NULL)
{
@@ -1493,14 +1493,14 @@ int initNetwork(SceNetAdhocctlAdhocId *adhoc_id){
setsockopt(metasocket, SOL_SOCKET, SO_REUSEADDR, (const char*)&on, sizeof(on));
setsockopt(metasocket, SOL_SOCKET, SO_DONTROUTE, (const char*)&on, sizeof(on));
// Prepare Local Address Information
/*
+ struct sockaddr_in local;
+ memset(&local, 0, sizeof(local));
+ local.sin_family = AF_INET;
+ local.sin_addr = serverIp;
+ local.sin_addr.S_un.S_un_b.s_b4 = PPSSPP_ID;
+ //local.sin_port = 0;
+ */
/*
struct sockaddr_in local;
memset(&local, 0, sizeof(local));
local.sin_family = AF_INET;
local.sin_addr = serverIp;
local.sin_addr.S_un.S_un_b.s_b4 = PPSSPP_ID;
//local.sin_port = 0;
*/
((struct sockaddr_in *)&localIP)->sin_port = 0;
// Bind Local Address to Socket
iResult = bind(metasocket, (struct sockaddr *)&localIP, sizeof(sockaddr));
+30 -21
View File
@@ -507,13 +507,13 @@ void login_user_stream(int fd, uint32_t ip)
// Enough Space available
if(_db_user_count < SERVER_USER_MAXIMUM)
{
// Check IP Duplication
// Check IP Duplication as current AdhocServer doesn't receives/broadcasts binded port information having more than 1 players using the same IP will only cause communication interference (sometimes clients bind to specific port on some games) since Reusable port will share the socket buffer when one already read the data the other can't read it anymore (no longer in buffer)
SceNetAdhocctlUserNode * u = _db_user;
while(u != NULL && u->resolver.ip != ip) u = u->next;
if (u != NULL) { // IP Already existed
uint8_t * ip4 = (uint8_t *)&u->resolver.ip;
INFO_LOG(SCENET, "AdhocServer: Already Existing IP: %u.%u.%u.%u\n", ip4[0], ip4[1], ip4[2], ip4[3]);
WARN_LOG(SCENET, "AdhocServer: Already Existing IP: %u.%u.%u.%u\n", ip4[0], ip4[1], ip4[2], ip4[3]);
}
// Unique IP Address
@@ -558,7 +558,7 @@ void login_user_stream(int fd, uint32_t ip)
}
}
// Duplicate IP, Allocation Error or not enough space - Close Stream
// Duplicate IP/MAC, Allocation Error or not enough space - Close Stream
closesocket(fd);
}
@@ -587,20 +587,20 @@ void login_user_data(SceNetAdhocctlUserNode * user, SceNetAdhocctlLoginPacketC2S
while (u != NULL && !IsMatch(u->resolver.mac, data->mac)) u = u->next;
if (u != NULL) { // MAC Already existed
/*
+ u32_le sip = user->resolver.ip;
+ // 127.0.0.1 should be replaced with LAN/WAN IP whenever available to make sure remote players can communicate with current (local) player
+ // It might be better if the client connects to AdhocServer using the correct interface instead of automatically changing the IP which might not be accurate on multihomed computer.
+ if (sip == 0x0100007f) {
+ char str[256];
+ gethostname(str, 256);
+ u8 *pip = (u8*)&sip;
+ struct hostent *pHost = 0;
+ pHost = gethostbyname(str);
+ if (pHost->h_addrtype == AF_INET && pHost->h_addr_list[0] != NULL) pip = (u8*)pHost->h_addr_list[0];
+ user->resolver.ip = *(u32_le*)pip;
+ WARN_LOG(SCENET, "AdhocServer: Replacing IP %u.%u.%u.%u with %u.%u.%u.%u", ((u8*)&sip)[0], ((u8*)&sip)[1], ((u8*)&sip)[2], ((u8*)&sip)[3], pip[0], pip[1], pip[2], pip[3]);
+ }
+ */
u32_le sip = user->resolver.ip;
// 127.0.0.1 should be replaced with LAN/WAN IP whenever available to make sure remote players can communicate with current (local) player
// It might be better if the client connects to AdhocServer using the correct interface instead of automatically changing the IP which might not be accurate on multihomed computer.
if (sip == 0x0100007f) {
char str[256];
gethostname(str, 256);
u8 *pip = (u8*)&sip;
struct hostent *pHost = 0;
pHost = gethostbyname(str);
if (pHost->h_addrtype == AF_INET && pHost->h_addr_list[0] != NULL) pip = (u8*)pHost->h_addr_list[0];
user->resolver.ip = *(u32_le*)pip;
WARN_LOG(SCENET, "AdhocServer: Replacing IP %u.%u.%u.%u with %u.%u.%u.%u", ((u8*)&sip)[0], ((u8*)&sip)[1], ((u8*)&sip)[2], ((u8*)&sip)[3], pip[0], pip[1], pip[2], pip[3]);
}
*/
uint8_t * ip4 = (uint8_t *)&u->resolver.ip;
WARN_LOG(SCENET, "AdhocServer: Already Existing MAC: %02X:%02X:%02X:%02X:%02X:%02X [%u.%u.%u.%u]\n", data->mac.data[0], data->mac.data[1], data->mac.data[2], data->mac.data[3], data->mac.data[4], data->mac.data[5], ip4[0], ip4[1], ip4[2], ip4[3]);
}
@@ -1817,9 +1817,16 @@ int create_listen_socket(uint16_t port)
struct sockaddr_in local;
memset(&local, 0, sizeof(local));
local.sin_family = AF_INET;
local.sin_addr.s_addr = INADDR_ANY;
local.sin_addr.s_addr = INADDR_ANY; // bind to all network adapter
local.sin_port = htons(port);
//Should only bind to specific IP for the 2nd or more instance of PPSSPP to prevent communication interference issue when sharing the same port. Doesn't work well when PPSSPP_ID reseted everytime emulation restarted.
/*
if (PPSSPP_ID > 1) {
local.sin_addr = ((sockaddr_in *)&localIP)->sin_addr;
}
*/
// Bind Local Address to Socket
int bindresult = bind(fd, (struct sockaddr *)&local, sizeof(local));
@@ -1893,10 +1900,12 @@ int server_loop(int server)
u32_le sip = addr.sin_addr.s_addr;
/*
if (sip == 0x0100007f) { //127.0.0.1 should be replaced with LAN/WAN IP whenever available
char str[100];
gethostname(str, 100);
char str[256];
gethostname(str, 256);
u8 *pip = (u8*)&sip;
if (gethostbyname(str)->h_addrtype == AF_INET && gethostbyname(str)->h_addr_list[0] != NULL) pip = (u8*)gethostbyname(str)->h_addr_list[0];
struct hostent *pHost = 0;
pHost = gethostbyname(str);
if (pHost->h_addrtype == AF_INET && pHost->h_addr_list[0] != NULL) pip = (u8*)pHost->h_addr_list[0];
sip = *(u32_le*)pip;
WARN_LOG(SCENET, "AdhocServer: Replacing IP %s with %u.%u.%u.%u", inet_ntoa(addr.sin_addr), pip[0], pip[1], pip[2], pip[3]);
}
+8 -2
View File
@@ -212,7 +212,9 @@ static void __ResetInitNetLib() {
void __NetInit() {
portOffset = g_Config.iPortOffset;
PPSSPP_ID = getInstanceNumber(); // This should be called when program started instead of when the game started/reseted
//if (PPSSPP_ID == 0) { // Each instance should use the same ID (and IP) once it's automatically assigned for consistency reason, But doesn't work well if PPSSPP_ID reseted everytime emulation restarted
PPSSPP_ID = getInstanceNumber(); // This should be called when program started instead of when the game started/reseted
//}
InitLocalIP();
INFO_LOG(SCENET, "LocalHost IP will be %s", inet_ntoa(((sockaddr_in *)&localIP)->sin_addr));
//net::Init();
@@ -220,8 +222,12 @@ void __NetInit() {
}
void __NetShutdown() {
PPSSPPIDCleanup(); //This should be called when program exited, otherwise everytime emulation restarted PPSSPP_ID will reset causing more than one instance might have the same ID and IP.
__ResetInitNetLib();
//net::Shutdown();
#ifdef _MSC_VER
WSACleanup();
#endif
PPSSPPIDCleanup(); //This should be called when program exited, otherwise everytime emulation restarted PPSSPP_ID will reset causing more than one instance might have the same ID and IP.
}
static void __UpdateApctlHandlers(int oldState, int newState, int flag, int error) {
+11 -7
View File
@@ -1082,12 +1082,14 @@ static u32 sceNetAdhocctlDisconnect() {
// Multithreading Lock
//peerlock.lock();
// Clear Peer List
freeFriendsRecursive(friends);
INFO_LOG(SCENET, "Cleared Peer List.");
if (!PSP_CoreParameter().compat.flags().AdhocHackStopFriendClear) {
// Clear Peer List
freeFriendsRecursive(friends);
INFO_LOG(SCENET, "Cleared Peer List.");
// Delete Peer Reference
friends = NULL;
// Delete Peer Reference
friends = NULL;
}
// Clear Group List
//freeGroupsRecursive(networks);
@@ -1642,8 +1644,10 @@ static int sceNetAdhocPtpOpen(const char *srcmac, int sport, const char *dstmac,
// Valid Ports
if (!isPTPPortInUse(sport) /*&& dport != 0*/) {
//sport 0 should be shifted back to 0 when using offset Phantasy Star Portable 2 use this
if (sport == 0) sport = -(int)portOffset;
if(PSP_CoreParameter().compat.flags().AdhocHackPhantasyStarOffset) {
//sport 0 should be shifted back to 0 when using offset Phantasy Star Portable 2 use this
if (sport == 0) sport = -(int)portOffset;
}
// Valid Arguments
if (bufsize > 0 && rexmt_int > 0 && rexmt_cnt > 0) {
// Create Infrastructure Socket
+29
View File
@@ -549,6 +549,35 @@ ULJS00250 = true
ULJS19048 = true
NPJH50107 = true
[AdhocHackStopFriendClear]
# Just in case, no known use-case for now.
[AdhocHackPhantasyStarOffset]
# Phantasy Star Portable
ULJM05309 = true
ULUS10410 = true
ULES01218 = true
ULJM08023 = true
ULES01218 = true
# Phantasy Star Portable 1 Demo
NPUH90023 = true
# Phantasy Star Portable 2
ULES01439 = true
ULUS10529 = true
ULJM05493 = true
NPJH50043 = true
ULJM08030 = true
NPUH90023 = true
ULJM91014 = true
NPJH90002 = true
ULJM05732 = true
NPJH50332 = true
# Phantasy Star Portable 2 JP Demo
ULJM91018 = true
NPJH90062 = true
# Phantasy Star Portable Infinity Demo
NPJH90157 = true # Infinity demo
[BlockTransferAllowCreateFB]
NPJH50686 = true # Digimon Adventures (JP, and English patches...)