Commit Graph

97 Commits

Author SHA1 Message Date
Gregor Richards
fb3c35dc9f Handle forwarding of netplay state demotions correctly.
Netplay state demotions, i.e. changes from playing to spectating or
disconnected states, could cause chain disconnections of all other
clients. This was due to a bug in when MODE change messages were sent.
Clients rely on the server sending all messages in its own order, and as
a consequence, the server typically holds messages for retransmission
until they can be retransmitted at the correct time. MODE messages were
not held, so could be sent early. When they were sent early, this caused
other clients to panic and disconnect.

A smaller but much stupider secondary bug was also fixed, in which the
first connection could be dropped due simply to writing connections[0]
instead of connections[i] somewhere.
2017-06-06 21:35:09 -04:00
radius
1de95c6413 further refinement of the netplay workflow 2017-05-16 00:18:29 -05:00
Gregor Richards
fbb508ab5e Make rewind compatible with netplay.
This commit adds support for temporary desync in netplay. When frontend
features that can't be truly synced, in particular rewind, are used,
netplay is momentarily disabled. As soon as the feature finished, e.g. a
rewind ending, netplay resumes with a state load. For rewind, netplay
peers won't actually experience the effect of rewind, but they will load
the rewound state.
2017-04-18 15:25:58 -04:00
Gregor Richards
3ff9a43b7d Spectator and slave mode are rewind-free
This commit makes spectator mode and slave mode in netplay always stay
ahead of the input, thereby avoiding rewinds, which is sort of the
point. This also changes catch-up detection to be a bit less eager, so
that they hopefully don't flap between stalling for server input and
catching up with that input.
2017-02-23 19:05:43 -05:00
Gregor Richards
e495671563 In spectator mode, we should never be ahead of our peer. 2017-02-22 23:19:22 -05:00
Gregor Richards
e70ee045bf Initial implementation of Netplay master/slave mode. 2017-02-22 20:34:17 -05:00
Gregor Richards
972b41f803 Fix race condition in NAT traversal task. 2017-02-20 20:16:53 -05:00
Gregor Richards
4c1abfaa71 Support for reset in netplay
This patch transfers core_reset across netplay. Resets effectively
worked before thanks to check_frames, but this makes resets work even
without check_frames, and in particular should allow resets to force
sync in savestateless cores, bringing them one step closer to actually
being usable by non-experts.
2017-02-15 14:40:37 -05:00
Gregor Richards
2ea3936d16 Renaming input_ptr/input_frame_count back to self_. 2017-02-01 22:54:03 -05:00
Gregor Richards
55157e934d input_latency_frames is now configurable and has a range 2017-02-01 22:54:03 -05:00
Gregor Richards
c4cb94db19 New approach to input latency 2017-02-01 22:54:03 -05:00
twinaphex
96c8ca5a09 Header update #1 2017-01-22 13:40:32 +01:00
Gregor Richards
cd281d5757 Reverse catch-up, i.e., server-demanded stalling
Previously, if two clients were connected to the same server and one of
them was ahead of the server, the only way to rectify that situation was
for the client to get so far ahead that it stalled, as the server could
only catch up with an ahead client if all clients were ahead. That's
unrealistic. This gives the server the alternate option of demanding
that a client stall. This keeps things nicely in line even with >2
players.
2016-12-24 15:25:03 -05:00
Gregor Richards
f0bb0a77f8 Make netplay no longer cache passwords
Netplay now always loads passwords from the configuration, so that
passwords can be changed mid-session.
2016-12-21 09:51:50 -05:00
Gregor Richards
c780e7db43 Accept the variable size quirk
Since the quirks protocol was that a core could report variable
savestate size, but the host then tells it "no", we should actually
accept the variable size quirk in netplay, since RetroArch refuses to
allow cores to actually produce variable-size states.
2016-12-20 22:17:15 -05:00
Gregor Richards
dcd4b3046b Making negative check_frames be "check only" mode 2016-12-18 19:28:44 -05:00
Gregor Richards
677ffa9ebd Support different forms of compression from different clients. 2016-12-18 19:28:44 -05:00
Gregor Richards
84c33634a6 Communicate paused-ness during initial connection SYNC. 2016-12-18 19:28:44 -05:00
Gregor Richards
04266cf4f7 Run synchronization even when stalled
Previously, we could be stalled by one player but still reading data
from another, which would wedge the client because we would never act
upon the newly-read data. Now we act upon data even if we're stalled.
Fixes bugs in initial connection with high latency.
2016-12-18 19:28:44 -05:00
Gregor Richards
8b21014d07 Improvements to handshake protocol
Making the netplay handshake protocol send the core and content as an
explicit command, so that the other side can (notionally) choose to load
it. That isn't implemented, of course.
2016-12-18 19:28:43 -05:00
Gregor Richards
f7f6590156 Goodbye delay_frames! stateless_mode is the new delay_frames=0 2016-12-18 19:28:43 -05:00
Gregor Richards
45d732a014 New sync system
The idea:
   * Use a fixed number of delay_frames (eventually to be fixed at 120,
     currently still uses the config variable, 0 will still be an option)
   * Determine how long it takes to simulate a frame.
   * Stall only if resimulating the intervening frames would be
     sufficiently annoying (currently fixed at three frames worth of
     time)

Because clients always try to catch up, the actual frame delay works out
automatically to be minimally zero and maximally the latency. If one
client is underpowered but the other is fine, the powerful one will
automatically take up the slack. Seems like the most reasonable system.
2016-12-18 19:28:43 -05:00
Gregor Richards
6658826759 CRC validity checking. Ignore CRCs if they don't work. 2016-12-18 19:28:43 -05:00
Gregor Richards
df2600fbf4 Added error reporting when a player is not allowed to play. 2016-12-18 19:28:43 -05:00
Gregor Richards
bade067d9a Support for catching up if the netplay peer is ahead of us. 2016-12-18 19:28:43 -05:00
Gregor Richards
da7efcb939 Cleaning up netplay headers. 2016-12-18 19:28:43 -05:00
Gregor Richards
03415c261d Added netplay spectator password separate from play password 2016-12-18 19:28:43 -05:00
Gregor Richards
694b7a9723 Don't allow more players to join than are actually being polled 2016-12-18 19:28:43 -05:00
Gregor Richards
7ad4e3f115 Per-connection stalling 2016-12-18 19:28:43 -05:00
Gregor Richards
7e2465ef1f Refactoring: Moving I/O functionality into netplay_io.c 2016-12-18 19:28:43 -05:00
Gregor Richards
8c59c7dd77 Starting to refactor: Separating frontend stuff into netplay_frontend.c 2016-12-18 19:28:43 -05:00
Gregor Richards
28e331b5fd Remove some magic numbers 2016-12-18 19:28:43 -05:00
Gregor Richards
6e6f2bfdbe Use a proper password hash across the line. 2016-12-18 19:28:42 -05:00
Gregor Richards
763a657f82 Terrible first cut at password (sent in plain text D-8) 2016-12-18 19:28:42 -05:00
Gregor Richards
3631ff74ff Very, very partial support for the server spectating 2016-12-18 19:28:42 -05:00
Gregor Richards
f6f9905ae3 Made remote pausing connection-specific 2016-12-18 19:28:42 -05:00
Gregor Richards
6556af1100 force_send_savestate is global again
We cannot send a savestate to only one player, as sending a savestate is
a synchronization event invalidating all prior input.
2016-12-18 19:28:42 -05:00
Gregor Richards
2130fd81a5 Fixed simulation for >2 players 2016-12-18 19:28:42 -05:00
Gregor Richards
e7ce01ad3b More renaming
Now that remote_input_state isn't always remote, it should just be
called real_input_state (and is).
2016-12-18 19:28:42 -05:00
Gregor Richards
2cc8c5c467 Removing silly foo_ names used to help migration. 2016-12-18 19:28:42 -05:00
Gregor Richards
53c46530aa Very first tidbits of true multiplayer support (minus actual multiple
players so far)
2016-12-18 19:28:42 -05:00
Gregor Richards
b5cd187077 Since there's now only one mode, removing netplay_callbacks entirely. 2016-12-18 19:28:42 -05:00
Gregor Richards
9b2270f5d4 Say goodbye to spectator mode (for now) 2016-12-18 19:28:42 -05:00
Gregor Richards
4768970d52 Moving force_send_savestate from netplay to connection. 2016-12-18 19:28:42 -05:00
Gregor Richards
ea722b49c8 Move other_addr from netplay to connection. 2016-12-18 19:28:42 -05:00
Gregor Richards
d1d29143b2 Move nickname field to connections. Spectate mode officially broken. 2016-12-18 19:28:42 -05:00
Gregor Richards
189cc6e5d6 Moving socket buffers to per-connection (currently breaks
delay_frames=0)
2016-12-18 19:28:42 -05:00
Gregor Richards
b334f04bd5 Removing RARCH_ from Netplay stall reasons. 2016-12-18 19:28:42 -05:00
Gregor Richards
1e1abf6951 First step of multiple connections. Still only one connection actually
works.
2016-12-18 19:28:42 -05:00
Gregor Richards
3908e25895 Separating local mode from remote mode. 2016-12-18 19:28:42 -05:00