Skip to content

Commit

Permalink
Revert "Use connected datagram sockets for audio and video"
Browse files Browse the repository at this point in the history
This causes problems on multi-homed GFE and Sunshine (prior to v0.21) hosts
because audio and video data can be sent back from an address different than
the one we used as our original destination address.

This reverts commit c13f4a3.
  • Loading branch information
cgutman committed Oct 26, 2023
1 parent 05c3f9c commit bbf15af
Show file tree
Hide file tree
Showing 4 changed files with 17 additions and 38 deletions.
18 changes: 9 additions & 9 deletions src/AudioStream.c
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,12 @@ typedef struct _QUEUED_AUDIO_PACKET {

static void AudioPingThreadProc(void* context) {
char legacyPingData[] = { 0x50, 0x49, 0x4E, 0x47 };
LC_SOCKADDR saddr;

LC_ASSERT(AudioPortNumber != 0);

memcpy(&saddr, &RemoteAddr, sizeof(saddr));
SET_PORT(&saddr, AudioPortNumber);

// We do not check for errors here. Socket errors will be handled
// on the read-side in ReceiveThreadProc(). This avoids potential
Expand All @@ -48,10 +54,10 @@ static void AudioPingThreadProc(void* context) {
pingCount++;
AudioPingPayload.sequenceNumber = BE32(pingCount);

send(rtpSocket, (char*)&AudioPingPayload, sizeof(AudioPingPayload), 0);
sendto(rtpSocket, (char*)&AudioPingPayload, sizeof(AudioPingPayload), 0, (struct sockaddr*)&saddr, AddrLen);
}
else {
send(rtpSocket, legacyPingData, sizeof(legacyPingData), 0);
sendto(rtpSocket, legacyPingData, sizeof(legacyPingData), 0, (struct sockaddr*)&saddr, AddrLen);
}

PltSleepMsInterruptible(&udpPingThread, 500);
Expand Down Expand Up @@ -92,15 +98,9 @@ int notifyAudioPortNegotiationComplete(void) {
return LastSocketFail();
}

// Connect our audio socket to the target address and port
int err = connectUdpSocket(rtpSocket, &RemoteAddr, AddrLen, AudioPortNumber);
if (err != 0) {
return err;
}

// We may receive audio before our threads are started, but that's okay. We'll
// drop the first 1 second of audio packets to catch up with the backlog.
err = PltCreateThread("AudioPing", AudioPingThreadProc, NULL, &udpPingThread);
int err = PltCreateThread("AudioPing", AudioPingThreadProc, NULL, &udpPingThread);
if (err != 0) {
return err;
}
Expand Down
17 changes: 0 additions & 17 deletions src/PlatformSockets.c
Original file line number Diff line number Diff line change
Expand Up @@ -317,23 +317,6 @@ SOCKET bindUdpSocket(int addressFamily, struct sockaddr_storage* localAddr, SOCK
return s;
}

int connectUdpSocket(SOCKET s, struct sockaddr_storage* dstaddr, SOCKADDR_LEN addrlen, unsigned short port) {
int err;
LC_SOCKADDR saddr;

LC_ASSERT(port != 0);

memcpy(&saddr, dstaddr, addrlen);
SET_PORT(&saddr, port);
err = connect(s, (struct sockaddr*)&saddr, addrlen);
if (err < 0) {
Limelog("connect() failed for UDP socket: %d\n", (int)LastSocketError());
return LastSocketFail();
}

return 0;
}

int setSocketNonBlocking(SOCKET s, bool enabled) {
#if defined(__vita__)
int val = enabled ? 1 : 0;
Expand Down
1 change: 0 additions & 1 deletion src/PlatformSockets.h
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,6 @@ void addrToUrlSafeString(struct sockaddr_storage* addr, char* string, size_t str

SOCKET createSocket(int addressFamily, int socketType, int protocol, bool nonBlocking);
SOCKET connectTcpSocket(struct sockaddr_storage* dstaddr, SOCKADDR_LEN addrlen, unsigned short port, int timeoutSec);
int connectUdpSocket(SOCKET s, struct sockaddr_storage* dstaddr, SOCKADDR_LEN addrlen, unsigned short port);
int sendMtuSafe(SOCKET s, char* buffer, int size);
SOCKET bindUdpSocket(int addressFamily, struct sockaddr_storage* localAddr, SOCKADDR_LEN addrLen, int bufferSize);
int enableNoDelay(SOCKET s);
Expand Down
19 changes: 8 additions & 11 deletions src/VideoStream.c
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,12 @@ void destroyVideoStream(void) {
// UDP Ping proc
static void VideoPingThreadProc(void* context) {
char legacyPingData[] = { 0x50, 0x49, 0x4E, 0x47 };
LC_SOCKADDR saddr;

LC_ASSERT(VideoPortNumber != 0);

memcpy(&saddr, &RemoteAddr, sizeof(saddr));
SET_PORT(&saddr, VideoPortNumber);

// We do not check for errors here. Socket errors will be handled
// on the read-side in ReceiveThreadProc(). This avoids potential
Expand All @@ -61,10 +67,10 @@ static void VideoPingThreadProc(void* context) {
pingCount++;
VideoPingPayload.sequenceNumber = BE32(pingCount);

send(rtpSocket, (char*)&VideoPingPayload, sizeof(VideoPingPayload), 0);
sendto(rtpSocket, (char*)&VideoPingPayload, sizeof(VideoPingPayload), 0, (struct sockaddr*)&saddr, AddrLen);
}
else {
send(rtpSocket, legacyPingData, sizeof(legacyPingData), 0);
sendto(rtpSocket, legacyPingData, sizeof(legacyPingData), 0, (struct sockaddr*)&saddr, AddrLen);
}

PltSleepMsInterruptible(&udpPingThread, 500);
Expand Down Expand Up @@ -268,15 +274,6 @@ int startVideoStream(void* rendererContext, int drFlags) {
return LastSocketError();
}

// Connect our video socket to the target address and port
LC_ASSERT(VideoPortNumber != 0);
err = connectUdpSocket(rtpSocket, &RemoteAddr, AddrLen, VideoPortNumber);
if (err != 0) {
VideoCallbacks.cleanup();
closeSocket(rtpSocket);
return err;
}

VideoCallbacks.start();

err = PltCreateThread("VideoRecv", VideoReceiveThreadProc, NULL, &receiveThread);
Expand Down

0 comments on commit bbf15af

Please sign in to comment.