diff --git a/network/netplay/netplay_frontend.c b/network/netplay/netplay_frontend.c index d39769d63f..04434812dc 100644 --- a/network/netplay/netplay_frontend.c +++ b/network/netplay/netplay_frontend.c @@ -90,7 +90,7 @@ #define SET_TCP_NODELAY(fd) \ { \ int on = 1; \ - if (setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, \ + if (setsockopt((fd), IPPROTO_TCP, TCP_NODELAY, \ (const char *) &on, sizeof(on)) < 0) \ RARCH_WARN("[Netplay] Could not set netplay TCP socket to nodelay. Expect jitter.\n"); \ } @@ -100,7 +100,7 @@ #if defined(F_SETFD) && defined(FD_CLOEXEC) #define SET_FD_CLOEXEC(fd) \ - if (fcntl(fd, F_SETFD, FD_CLOEXEC) < 0) \ + if (fcntl((fd), F_SETFD, FD_CLOEXEC) < 0) \ RARCH_WARN("[Netplay] Cannot set netplay port to close-on-exec. It may fail to reopen.\n"); #else #define SET_FD_CLOEXEC(fd) @@ -115,10 +115,17 @@ } \ else if (recvd < 0) -#define SET_PING() \ - ping = (int32_t)((cpu_features_get_time_usec() - connection->ping_timer) / 1000); \ - if (connection->ping < 0 || ping < connection->ping) \ - connection->ping = ping; +#define SET_PING(connection) \ + ping = (int32_t)((cpu_features_get_time_usec() - (connection)->ping_timer) / 1000); \ + if ((connection)->ping < 0 || ping < (connection)->ping) \ + (connection)->ping = ping; + +#define REQUIRE_PROTOCOL_VERSION(connection, version) \ + if ((connection)->netplay_protocol >= (version)) + +#define REQUIRE_PROTOCOL_RANGE(connection, vmin, vmax) \ + if ((connection)->netplay_protocol >= (vmin) && \ + (connection)->netplay_protocol <= (vmax)) #define NETPLAY_MAGIC 0x52414E50 /* RANP */ #define FULL_MAGIC 0x46554C4C /* FULL */ @@ -340,10 +347,10 @@ static bool netplay_lan_ad_client_response(void) continue; /* And that we know how to handle it */ - #ifdef HAVE_INET6 +#ifdef HAVE_INET6 if (their_addr.ss_family != AF_INET) continue; - #endif +#endif if (!netplay_is_lan_address( (struct sockaddr_in *) &their_addr)) @@ -559,10 +566,10 @@ static bool netplay_lan_ad_server(netplay_t *netplay) return true; } - #ifdef HAVE_INET6 +#ifdef HAVE_INET6 if (their_addr.ss_family != AF_INET) return true; - #endif +#endif if (!netplay_is_lan_address( (struct sockaddr_in *) &their_addr)) @@ -998,7 +1005,7 @@ bool netplay_handshake_init(netplay_t *netplay, else { /* Only the client is able to estimate latency at this point. */ - SET_PING() + SET_PING(connection) if (netplay_magic == FULL_MAGIC) { @@ -1404,7 +1411,7 @@ static bool netplay_handshake_sync(netplay_t *netplay, #endif /* Send our settings. */ - if (connection->netplay_protocol >= 6) + REQUIRE_PROTOCOL_VERSION(connection, 6) { uint32_t allow_pausing; int32_t frames[2]; @@ -1472,7 +1479,7 @@ static bool netplay_handshake_pre_nick(netplay_t *netplay, return false; } - SET_PING() + SET_PING(connection) strlcpy(connection->nick, nick_buf.nick, sizeof(connection->nick)); @@ -1620,7 +1627,7 @@ static bool netplay_handshake_pre_info(netplay_t *netplay, if (netplay->is_server) { /* Only the server is able to estimate latency at this point. */ - SET_PING() + SET_PING(connection) } cmd_size = ntohl(info_buf.cmd[1]); @@ -4767,19 +4774,24 @@ static bool chat_check(netplay_t *netplay) for (i = 0; i < netplay->connections_size; i++) { struct netplay_connection *conn = &netplay->connections[i]; - if (conn->active && conn->netplay_protocol >= 6 && + if (conn->active && (conn->mode == NETPLAY_CONNECTION_PLAYING || conn->mode == NETPLAY_CONNECTION_SLAVE)) - return true; + { + REQUIRE_PROTOCOL_VERSION(conn, 6) + return true; + } } } /* Otherwise, just check whether our connection is active and the server is running protocol 6+. */ else { - if (netplay->connections[0].active && - netplay->connections[0].netplay_protocol >= 6) - return true; + if (netplay->connections[0].active) + { + REQUIRE_PROTOCOL_VERSION(&netplay->connections[0], 6) + return true; + } } return false; @@ -4802,11 +4814,14 @@ static void relay_chat(netplay_t *netplay, struct netplay_connection *conn = &netplay->connections[i]; /* Only playing clients can receive chat. Protocol 6+ is required. */ - if (conn->active && conn->netplay_protocol >= 6 && + if (conn->active && (conn->mode == NETPLAY_CONNECTION_PLAYING || conn->mode == NETPLAY_CONNECTION_SLAVE)) - netplay_send_raw_cmd(netplay, conn, - NETPLAY_CMD_PLAYER_CHAT, data, NETPLAY_NICK_LEN + msg_len); + { + REQUIRE_PROTOCOL_VERSION(conn, 6) + netplay_send_raw_cmd(netplay, conn, + NETPLAY_CMD_PLAYER_CHAT, data, NETPLAY_NICK_LEN + msg_len); + } } /* We don't flush. Chat is not time essential. */ } @@ -4916,40 +4931,46 @@ static bool handle_chat(netplay_t *netplay, struct netplay_connection *connection, const char *nick, const char *msg) { - if (!connection->active || connection->netplay_protocol < 6 || + if (!connection->active || string_is_empty(nick) || string_is_empty(msg)) return false; - /* Client sent a chat message; - Relay it to the other clients, - including the one who sent it. */ - if (netplay->is_server) + REQUIRE_PROTOCOL_VERSION(connection, 6) { - /* Only playing clients can send chat. */ - if (connection->mode != NETPLAY_CONNECTION_PLAYING && - connection->mode != NETPLAY_CONNECTION_SLAVE) - return false; + /* Client sent a chat message; + Relay it to the other clients, + including the one who sent it. */ + if (netplay->is_server) + { + /* Only playing clients can send chat. */ + if (connection->mode != NETPLAY_CONNECTION_PLAYING && + connection->mode != NETPLAY_CONNECTION_SLAVE) + return false; - relay_chat(netplay, nick, msg); + relay_chat(netplay, nick, msg); + } + + /* If we still got a message even though we are not playing, + ignore it! */ + if (netplay->self_mode == NETPLAY_CONNECTION_PLAYING || + netplay->self_mode == NETPLAY_CONNECTION_SLAVE) + show_chat(nick, msg); + + return true; } - /* If we still got a message even though we are not playing, - ignore it! */ - if (netplay->self_mode == NETPLAY_CONNECTION_PLAYING || - netplay->self_mode == NETPLAY_CONNECTION_SLAVE) - show_chat(nick, msg); - - return true; + return false; } static void request_ping(netplay_t *netplay, struct netplay_connection *connection) { - /* Only protocol 6+ supports the ping command. */ - if (!connection->active || connection->netplay_protocol < 6) + if (!connection->active || + connection->mode < NETPLAY_CONNECTION_CONNECTED) return; - if (connection->mode >= NETPLAY_CONNECTION_CONNECTED) + /* Only protocol 6+ supports the ping command. */ + REQUIRE_PROTOCOL_VERSION(connection, 6) { connection->ping_timer = cpu_features_get_time_usec(); @@ -8787,11 +8808,14 @@ const gfx_widget_t gfx_widget_netplay_ping = { #undef FULL_MAGIC #undef POKE_MAGIC +#undef REQUIRE_PROTOCOL_VERSION +#undef REQUIRE_PROTOCOL_RANGE + #undef SET_PING #undef SET_FD_CLOEXEC #undef SET_TCP_NODELAY -#if defined(AF_INET6) && !defined(HAVE_SOCKET_LEGACY) && !defined(_3DS) +#ifdef HAVE_INET6 #undef HAVE_INET6 #endif