mirror of
https://github.com/melonDS-emu/melonDS.git
synced 2025-07-23 14:19:55 -06:00
* lay base for UDP
* only handle DNS when it's destined to our internal DNS server
This commit is contained in:
@ -86,7 +86,21 @@ typedef struct
|
|||||||
|
|
||||||
} TCPSocket;
|
} TCPSocket;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
u8 DestIP[4];
|
||||||
|
u16 SourcePort;
|
||||||
|
u16 DestPort;
|
||||||
|
|
||||||
|
SOCKET Backend;
|
||||||
|
struct sockaddr_in BackendAddr;
|
||||||
|
|
||||||
|
} UDPSocket;
|
||||||
|
|
||||||
TCPSocket TCPSocketList[16];
|
TCPSocket TCPSocketList[16];
|
||||||
|
UDPSocket UDPSocketList[4];
|
||||||
|
|
||||||
|
int UDPSocketID = 0;
|
||||||
|
|
||||||
|
|
||||||
bool Init()
|
bool Init()
|
||||||
@ -101,13 +115,16 @@ bool Init()
|
|||||||
IPv4ID = 1;
|
IPv4ID = 1;
|
||||||
|
|
||||||
memset(TCPSocketList, 0, sizeof(TCPSocketList));
|
memset(TCPSocketList, 0, sizeof(TCPSocketList));
|
||||||
|
memset(UDPSocketList, 0, sizeof(UDPSocketList));
|
||||||
|
|
||||||
|
UDPSocketID = 0;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DeInit()
|
void DeInit()
|
||||||
{
|
{
|
||||||
//
|
// TODO CLEANUP SHIT!!!!
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -472,7 +489,71 @@ void HandleUDPFrame(u8* data, int len)
|
|||||||
u8* ipheader = &data[0xE];
|
u8* ipheader = &data[0xE];
|
||||||
u8* udpheader = &data[0x22];
|
u8* udpheader = &data[0x22];
|
||||||
|
|
||||||
// TODO!
|
// debug
|
||||||
|
/*for (int j = 0; j < len; j += 16)
|
||||||
|
{
|
||||||
|
int rem = len - j;
|
||||||
|
if (rem > 16) rem = 16;
|
||||||
|
for (int i = 0; i < rem; i++)
|
||||||
|
{
|
||||||
|
printf("%02X ", data[i+j]);
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
}*/
|
||||||
|
|
||||||
|
u16 srcport = ntohs(*(u16*)&udpheader[0]);
|
||||||
|
u16 dstport = ntohs(*(u16*)&udpheader[2]);
|
||||||
|
|
||||||
|
int sockid = -1;
|
||||||
|
UDPSocket* sock;
|
||||||
|
for (int i = 0; i < (sizeof(UDPSocketList)/sizeof(UDPSocket)); i++)
|
||||||
|
{
|
||||||
|
sock = &UDPSocketList[i];
|
||||||
|
if (sock->Backend != 0 && !memcmp(&sock->DestIP, &ipheader[16], 4) &&
|
||||||
|
sock->SourcePort == srcport && sock->DestPort == dstport)
|
||||||
|
{
|
||||||
|
sockid = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sockid == -1)
|
||||||
|
{
|
||||||
|
sockid = UDPSocketID;
|
||||||
|
sock = &UDPSocketList[sockid];
|
||||||
|
|
||||||
|
UDPSocketID++;
|
||||||
|
if (UDPSocketID >= (sizeof(UDPSocketList)/sizeof(UDPSocket)))
|
||||||
|
UDPSocketID = 0;
|
||||||
|
|
||||||
|
if (sock->Backend != 0)
|
||||||
|
{
|
||||||
|
printf("LANMAGIC: closing previous UDP socket #%d\n", sockid);
|
||||||
|
closesocket(sock->Backend);
|
||||||
|
}
|
||||||
|
|
||||||
|
sock->Backend = socket(AF_INET, SOCK_DGRAM, 0);
|
||||||
|
|
||||||
|
memset(&sock->BackendAddr, 0, sizeof(sock->BackendAddr));
|
||||||
|
sock->BackendAddr.sin_family = AF_INET;
|
||||||
|
sock->BackendAddr.sin_port = htons(dstport);
|
||||||
|
memcpy(&sock->BackendAddr.sin_addr, &ipheader[16], 4);
|
||||||
|
if (bind(sock->Backend, (struct sockaddr*)&sock->BackendAddr, sizeof(sock->BackendAddr)) == SOCKET_ERROR)
|
||||||
|
{
|
||||||
|
printf("bind() shat itself :(\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("LANMAGIC: opening UDP socket #%d to %d.%d.%d.%d:%d, srcport %d\n",
|
||||||
|
sockid,
|
||||||
|
ipheader[16], ipheader[17], ipheader[18], ipheader[19],
|
||||||
|
dstport, srcport);
|
||||||
|
}
|
||||||
|
|
||||||
|
u16 udplen = ntohs(*(u16*)&udpheader[4]) - 8;
|
||||||
|
|
||||||
|
printf("UDP: socket %d sending %d bytes\n", sockid, udplen);
|
||||||
|
sendto(sock->Backend, (char*)&udpheader[8], udplen, 0,
|
||||||
|
(struct sockaddr*)&sock->BackendAddr, sizeof(sock->BackendAddr));
|
||||||
}
|
}
|
||||||
|
|
||||||
void TCP_SYNACK(TCPSocket* sock, u8* data, int len)
|
void TCP_SYNACK(TCPSocket* sock, u8* data, int len)
|
||||||
@ -850,13 +931,13 @@ void HandlePacket(u8* data, int len)
|
|||||||
printf("LANMAGIC: DHCP packet\n");
|
printf("LANMAGIC: DHCP packet\n");
|
||||||
return HandleDHCPFrame(data, len);
|
return HandleDHCPFrame(data, len);
|
||||||
}
|
}
|
||||||
else if (dstport == 53) // DNS
|
else if (dstport == 53 && htonl(*(u32*)&data[0x1E]) == kDNSIP) // DNS
|
||||||
{
|
{
|
||||||
printf("LANMAGIC: DNS packet\n");
|
printf("LANMAGIC: DNS packet\n");
|
||||||
return HandleDNSFrame(data, len);
|
return HandleDNSFrame(data, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("LANMAGIC: UDP packet\n");
|
printf("LANMAGIC: UDP packet %d->%d\n", srcport, dstport);
|
||||||
return HandleUDPFrame(data, len);
|
return HandleUDPFrame(data, len);
|
||||||
}
|
}
|
||||||
else if (protocol == 0x06) // TCP
|
else if (protocol == 0x06) // TCP
|
||||||
@ -924,6 +1005,35 @@ int RecvPacket(u8* data)
|
|||||||
TCP_BuildIncomingFrame(sock, recvbuf, recvlen);
|
TCP_BuildIncomingFrame(sock, recvbuf, recvlen);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < (sizeof(UDPSocketList)/sizeof(UDPSocket)); i++)
|
||||||
|
{
|
||||||
|
UDPSocket* sock = &UDPSocketList[i];
|
||||||
|
if (sock->Backend == 0) continue;
|
||||||
|
|
||||||
|
fd_set fd;
|
||||||
|
struct timeval tv;
|
||||||
|
|
||||||
|
FD_ZERO(&fd);
|
||||||
|
FD_SET(sock->Backend, &fd);
|
||||||
|
tv.tv_sec = 0;
|
||||||
|
tv.tv_usec = 0;
|
||||||
|
|
||||||
|
if (!select(sock->Backend+1, &fd, 0, 0, &tv))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
u8 recvbuf[1024];
|
||||||
|
//int recvlen = recv(sock->Backend, (char*)recvbuf, 1024, 0);
|
||||||
|
sockaddr_t fromAddr;
|
||||||
|
socklen_t fromLen = sizeof(sockaddr_t);
|
||||||
|
int recvlen = recvfrom(sock->Backend, (char*)recvbuf, 1024, 0, &fromAddr, &fromLen);
|
||||||
|
if (recvlen < 1) continue;
|
||||||
|
|
||||||
|
printf("UDP: socket %d receiving %d bytes\n", i, recvlen);
|
||||||
|
//TCP_BuildIncomingFrame(sock, recvbuf, recvlen);
|
||||||
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user