From d7497905214caf98685ddab64eeb512afcd89276 Mon Sep 17 00:00:00 2001 From: radius Date: Mon, 15 May 2017 21:48:56 -0500 Subject: [PATCH 1/4] add sublabel indicating the room type --- menu/cbs/menu_cbs_sublabel.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index e17d79d962..2a9d754631 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -353,9 +353,13 @@ static int action_bind_sublabel_netplay_room( if (i < 1) return 0; - snprintf(s,len, "%s (%s)\n%s (%08x)", + snprintf(s,len, "%s (%s)\n%s (%08x)\nType: %s (%s)", netplay_room_list[i - 2].corename, netplay_room_list[i - 2].coreversion, - netplay_room_list[i - 2].gamename, netplay_room_list[i - 2].gamecrc); + netplay_room_list[i - 2].gamename, netplay_room_list[i - 2].gamecrc, + netplay_room_list[i - 2].lan ? "LAN game" : + (netplay_room_list[i - 2].host_method == NETPLAY_HOST_METHOD_MITM ? + "MITM game" : "Lobby game"), netplay_room_list[i - 2].address); + #if 0 strlcpy(s, netplay_room_list[i - 2].corename, len); #endif From ea0202a39d3e80ed89a32d12c9f32e67cc32e191 Mon Sep 17 00:00:00 2001 From: radius Date: Mon, 15 May 2017 23:01:35 -0500 Subject: [PATCH 2/4] LAN rooms work on android although it seems to be always using IPv6 now --- menu/cbs/menu_cbs_ok.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 95ec1e6000..72d301aa85 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -3510,10 +3510,19 @@ finish: sizeof(netplay_room_list[i].nickname)); address = &host->addr; + if (address->sa_family == AF_INET) + { + struct sockaddr_in *sin = (struct sockaddr_in *) address; + inet_ntop(AF_INET, &sin->sin_addr, + netplay_room_list[i].address, INET6_ADDRSTRLEN); + } + else if (address->sa_family == AF_INET6) + { + struct sockaddr_in6 *sin = (struct sockaddr_in6 *) address; + inet_ntop(AF_INET6, &sin->sin6_addr, + netplay_room_list[i].address, INET6_ADDRSTRLEN); + } - strlcpy(netplay_room_list[i].address, - inet_ntoa(((struct sockaddr_in*)(address))->sin_addr), - sizeof(netplay_room_list[i].address)); strlcpy(netplay_room_list[i].corename, host->core, sizeof(netplay_room_list[i].corename)); From 1de95c64132d26325e2dd3b8bd8ec8a438b4fb2f Mon Sep 17 00:00:00 2001 From: radius Date: Tue, 16 May 2017 00:15:06 -0500 Subject: [PATCH 3/4] further refinement of the netplay workflow --- menu/cbs/menu_cbs_ok.c | 24 ++++++++++++++---------- menu/menu_displaylist.c | 23 +++++++++++++---------- network/netplay/netplay.h | 3 ++- network/netplay/netplay_frontend.c | 16 ++++++++++++---- network/netplay/netplay_handshake.c | 1 + network/netplay/netplay_init.c | 1 + network/netplay/netplay_io.c | 1 + network/netplay/netplay_private.h | 3 +++ 8 files changed, 47 insertions(+), 25 deletions(-) diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 72d301aa85..cc024153ca 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -3464,15 +3464,9 @@ finish: sizeof(struct netplay_room)); menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, file_list); - if (!netplay_driver_ctl(RARCH_NETPLAY_CTL_IS_ENABLED, NULL)) - { - menu_entries_append_enum(file_list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETPLAY_ENABLE_HOST), - msg_hash_to_str(MENU_ENUM_LABEL_NETPLAY_ENABLE_HOST), - MENU_ENUM_LABEL_NETPLAY_ENABLE_HOST, - MENU_SETTING_ACTION, 0, 0); - } - else if (netplay_driver_ctl(RARCH_NETPLAY_CTL_IS_SERVER_ENABLED, NULL)) + + if (netplay_driver_ctl(RARCH_NETPLAY_CTL_IS_ENABLED, NULL) && + netplay_driver_ctl(RARCH_NETPLAY_CTL_IS_SERVER, NULL)) { menu_entries_append_enum(file_list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETPLAY_DISABLE_HOST), @@ -3480,7 +3474,9 @@ finish: MENU_ENUM_LABEL_NETPLAY_DISCONNECT, MENU_SETTING_ACTION, 0, 0); } - else + else if (netplay_driver_ctl(RARCH_NETPLAY_CTL_IS_ENABLED, NULL) && + !netplay_driver_ctl(RARCH_NETPLAY_CTL_IS_SERVER, NULL) && + netplay_driver_ctl(RARCH_NETPLAY_CTL_IS_CONNECTED, NULL)) { menu_entries_append_enum(file_list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETPLAY_DISCONNECT), @@ -3488,6 +3484,14 @@ finish: MENU_ENUM_LABEL_NETPLAY_DISCONNECT, MENU_SETTING_ACTION, 0, 0); } + else + { + menu_entries_append_enum(file_list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETPLAY_ENABLE_HOST), + msg_hash_to_str(MENU_ENUM_LABEL_NETPLAY_ENABLE_HOST), + MENU_ENUM_LABEL_NETPLAY_ENABLE_HOST, + MENU_SETTING_ACTION, 0, 0); + } menu_entries_append_enum(file_list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETPLAY_REFRESH_ROOMS), diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index 6cb6b12a4e..a9557b5619 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -3128,15 +3128,8 @@ static int menu_displaylist_parse_netplay_room_list( #ifdef HAVE_NETWORKING - if (!netplay_driver_ctl(RARCH_NETPLAY_CTL_IS_ENABLED, NULL)) - { - menu_entries_append_enum(info->list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETPLAY_ENABLE_HOST), - msg_hash_to_str(MENU_ENUM_LABEL_NETPLAY_ENABLE_HOST), - MENU_ENUM_LABEL_NETPLAY_ENABLE_HOST, - MENU_SETTING_ACTION, 0, 0); - } - else if (netplay_driver_ctl(RARCH_NETPLAY_CTL_IS_SERVER_ENABLED, NULL)) + if (netplay_driver_ctl(RARCH_NETPLAY_CTL_IS_ENABLED, NULL) && + netplay_driver_ctl(RARCH_NETPLAY_CTL_IS_SERVER, NULL)) { menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETPLAY_DISABLE_HOST), @@ -3144,7 +3137,9 @@ static int menu_displaylist_parse_netplay_room_list( MENU_ENUM_LABEL_NETPLAY_DISCONNECT, MENU_SETTING_ACTION, 0, 0); } - else + else if (netplay_driver_ctl(RARCH_NETPLAY_CTL_IS_ENABLED, NULL) && + !netplay_driver_ctl(RARCH_NETPLAY_CTL_IS_SERVER, NULL) && + netplay_driver_ctl(RARCH_NETPLAY_CTL_IS_CONNECTED, NULL)) { menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETPLAY_DISCONNECT), @@ -3152,6 +3147,14 @@ static int menu_displaylist_parse_netplay_room_list( MENU_ENUM_LABEL_NETPLAY_DISCONNECT, MENU_SETTING_ACTION, 0, 0); } + else + { + menu_entries_append_enum(info->list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETPLAY_ENABLE_HOST), + msg_hash_to_str(MENU_ENUM_LABEL_NETPLAY_ENABLE_HOST), + MENU_ENUM_LABEL_NETPLAY_ENABLE_HOST, + MENU_SETTING_ACTION, 0, 0); + } menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETPLAY_REFRESH_ROOMS), diff --git a/network/netplay/netplay.h b/network/netplay/netplay.h index 3805e6d5b3..387a355348 100644 --- a/network/netplay/netplay.h +++ b/network/netplay/netplay.h @@ -40,7 +40,8 @@ enum rarch_netplay_ctl_state RARCH_NETPLAY_CTL_ENABLE_CLIENT, RARCH_NETPLAY_CTL_DISABLE, RARCH_NETPLAY_CTL_IS_ENABLED, - RARCH_NETPLAY_CTL_IS_SERVER_ENABLED, + RARCH_NETPLAY_CTL_IS_SERVER, + RARCH_NETPLAY_CTL_IS_CONNECTED, RARCH_NETPLAY_CTL_IS_DATA_INITED, RARCH_NETPLAY_CTL_PAUSE, RARCH_NETPLAY_CTL_UNPAUSE, diff --git a/network/netplay/netplay_frontend.c b/network/netplay/netplay_frontend.c index ec1a6a1808..f700f859fe 100644 --- a/network/netplay/netplay_frontend.c +++ b/network/netplay/netplay_frontend.c @@ -1124,10 +1124,13 @@ static void netplay_toggle_play_spectate(netplay_t *netplay) bool netplay_disconnect(netplay_t *netplay) { size_t i; + if (!netplay) return true; for (i = 0; i < netplay->connections_size; i++) netplay_hangup(netplay, &netplay->connections[i]); + + deinit_netplay(); return true; } @@ -1137,6 +1140,7 @@ void deinit_netplay(void) { netplay_free(netplay_data); netplay_enabled = false; + netplay_is_client = false; is_mitm = false; } netplay_data = NULL; @@ -1271,11 +1275,13 @@ bool netplay_driver_ctl(enum rarch_netplay_ctl_state state, void *data) ret = false; goto done; - case RARCH_NETPLAY_CTL_IS_SERVER_ENABLED: + case RARCH_NETPLAY_CTL_IS_SERVER: ret = netplay_enabled && !netplay_is_client; - RARCH_LOG("TEST: %d = %d && %d", ret, netplay_enabled, netplay_is_client); goto done; + case RARCH_NETPLAY_CTL_IS_CONNECTED: + ret = false; + goto done; default: goto done; } @@ -1292,9 +1298,11 @@ bool netplay_driver_ctl(enum rarch_netplay_ctl_state state, void *data) goto done; case RARCH_NETPLAY_CTL_IS_ENABLED: goto done; - case RARCH_NETPLAY_CTL_IS_SERVER_ENABLED: + case RARCH_NETPLAY_CTL_IS_SERVER: ret = netplay_enabled && !netplay_is_client; - RARCH_LOG("TEST: %d = %d && %d", ret, netplay_enabled, netplay_is_client); + goto done; + case RARCH_NETPLAY_CTL_IS_CONNECTED: + ret = netplay_data->is_connected; goto done; case RARCH_NETPLAY_CTL_POST_FRAME: netplay_post_frame(netplay_data); diff --git a/network/netplay/netplay_handshake.c b/network/netplay/netplay_handshake.c index 5c44e90a97..6f9cd9deb7 100644 --- a/network/netplay/netplay_handshake.c +++ b/network/netplay/netplay_handshake.c @@ -450,6 +450,7 @@ static void netplay_handshake_ready(netplay_t *netplay, struct netplay_connectio } else { + netplay->is_connected = true; snprintf(msg, sizeof(msg), "%s: \"%s\"", msg_hash_to_str(MSG_CONNECTED_TO), connection->nick); diff --git a/network/netplay/netplay_init.c b/network/netplay/netplay_init.c index 6325918f7e..59e743072f 100644 --- a/network/netplay/netplay_init.c +++ b/network/netplay/netplay_init.c @@ -423,6 +423,7 @@ netplay_t *netplay_new(void *direct_host, const char *server, uint16_t port, netplay->connected_players = 0; netplay->player_max = 1; netplay->is_server = (direct_host == NULL && server == NULL); + netplay->is_connected = false;; netplay->nat_traversal = netplay->is_server ? nat_traversal : false; netplay->stateless_mode = stateless_mode; netplay->check_frames = check_frames; diff --git a/network/netplay/netplay_io.c b/network/netplay/netplay_io.c index fdba8ebf74..66a6d97a0c 100644 --- a/network/netplay/netplay_io.c +++ b/network/netplay/netplay_io.c @@ -111,6 +111,7 @@ void netplay_hangup(netplay_t *netplay, struct netplay_connection *connection) else { dmsg = msg_hash_to_str(MSG_NETPLAY_CLIENT_HANGUP); + netplay->is_connected = false; } RARCH_LOG("%s\n", dmsg); runloop_msg_queue_push(dmsg, 1, 180, false); diff --git a/network/netplay/netplay_private.h b/network/netplay/netplay_private.h index 272c96cfae..2f49860eac 100644 --- a/network/netplay/netplay_private.h +++ b/network/netplay/netplay_private.h @@ -330,6 +330,9 @@ struct netplay /* Are we the server? */ bool is_server; + /* Are we the connected? */ + bool is_connected; + /* Our nickname */ char nick[NETPLAY_NICK_LEN]; From 54ce598a00dc233c605dd3b6770d9cacdc98764b Mon Sep 17 00:00:00 2001 From: radius Date: Tue, 16 May 2017 00:34:28 -0500 Subject: [PATCH 4/4] cut code duplication further --- menu/cbs/menu_cbs_ok.c | 72 ++++++++++++++++++++--------------------- menu/menu_displaylist.c | 36 --------------------- 2 files changed, 36 insertions(+), 72 deletions(-) diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index cc024153ca..71073aa446 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -3348,6 +3348,42 @@ void netplay_refresh_rooms_menu(file_list_t *list) int i = 0; int j = 0; + menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, list); + + if (netplay_driver_ctl(RARCH_NETPLAY_CTL_IS_ENABLED, NULL) && + netplay_driver_ctl(RARCH_NETPLAY_CTL_IS_SERVER, NULL)) + { + menu_entries_append_enum(list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETPLAY_DISABLE_HOST), + msg_hash_to_str(MENU_ENUM_LABEL_NETPLAY_DISCONNECT), + MENU_ENUM_LABEL_NETPLAY_DISCONNECT, + MENU_SETTING_ACTION, 0, 0); + } + else if (netplay_driver_ctl(RARCH_NETPLAY_CTL_IS_ENABLED, NULL) && + !netplay_driver_ctl(RARCH_NETPLAY_CTL_IS_SERVER, NULL) && + netplay_driver_ctl(RARCH_NETPLAY_CTL_IS_CONNECTED, NULL)) + { + menu_entries_append_enum(list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETPLAY_DISCONNECT), + msg_hash_to_str(MENU_ENUM_LABEL_NETPLAY_DISCONNECT), + MENU_ENUM_LABEL_NETPLAY_DISCONNECT, + MENU_SETTING_ACTION, 0, 0); + } + else + { + menu_entries_append_enum(list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETPLAY_ENABLE_HOST), + msg_hash_to_str(MENU_ENUM_LABEL_NETPLAY_ENABLE_HOST), + MENU_ENUM_LABEL_NETPLAY_ENABLE_HOST, + MENU_SETTING_ACTION, 0, 0); + } + + menu_entries_append_enum(list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETPLAY_REFRESH_ROOMS), + msg_hash_to_str(MENU_ENUM_LABEL_NETPLAY_REFRESH_ROOMS), + MENU_ENUM_LABEL_NETPLAY_REFRESH_ROOMS, + MENU_SETTING_ACTION, 0, 0); + if (netplay_room_count != 0) { RARCH_LOG ("Found %d rooms...\n", netplay_room_count); @@ -3463,42 +3499,6 @@ finish: calloc(netplay_room_count + lan_room_count, sizeof(struct netplay_room)); - menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, file_list); - - if (netplay_driver_ctl(RARCH_NETPLAY_CTL_IS_ENABLED, NULL) && - netplay_driver_ctl(RARCH_NETPLAY_CTL_IS_SERVER, NULL)) - { - menu_entries_append_enum(file_list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETPLAY_DISABLE_HOST), - msg_hash_to_str(MENU_ENUM_LABEL_NETPLAY_DISCONNECT), - MENU_ENUM_LABEL_NETPLAY_DISCONNECT, - MENU_SETTING_ACTION, 0, 0); - } - else if (netplay_driver_ctl(RARCH_NETPLAY_CTL_IS_ENABLED, NULL) && - !netplay_driver_ctl(RARCH_NETPLAY_CTL_IS_SERVER, NULL) && - netplay_driver_ctl(RARCH_NETPLAY_CTL_IS_CONNECTED, NULL)) - { - menu_entries_append_enum(file_list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETPLAY_DISCONNECT), - msg_hash_to_str(MENU_ENUM_LABEL_NETPLAY_DISCONNECT), - MENU_ENUM_LABEL_NETPLAY_DISCONNECT, - MENU_SETTING_ACTION, 0, 0); - } - else - { - menu_entries_append_enum(file_list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETPLAY_ENABLE_HOST), - msg_hash_to_str(MENU_ENUM_LABEL_NETPLAY_ENABLE_HOST), - MENU_ENUM_LABEL_NETPLAY_ENABLE_HOST, - MENU_SETTING_ACTION, 0, 0); - } - - menu_entries_append_enum(file_list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETPLAY_REFRESH_ROOMS), - msg_hash_to_str(MENU_ENUM_LABEL_NETPLAY_REFRESH_ROOMS), - MENU_ENUM_LABEL_NETPLAY_REFRESH_ROOMS, - MENU_SETTING_ACTION, 0, 0); - for (i = 0; i < netplay_room_count; i++) memcpy(&netplay_room_list[i], netplay_room_get(i), sizeof(netplay_room_list[i])); diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index a9557b5619..3fc25732df 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -3127,43 +3127,7 @@ static int menu_displaylist_parse_netplay_room_list( { #ifdef HAVE_NETWORKING - - if (netplay_driver_ctl(RARCH_NETPLAY_CTL_IS_ENABLED, NULL) && - netplay_driver_ctl(RARCH_NETPLAY_CTL_IS_SERVER, NULL)) - { - menu_entries_append_enum(info->list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETPLAY_DISABLE_HOST), - msg_hash_to_str(MENU_ENUM_LABEL_NETPLAY_DISCONNECT), - MENU_ENUM_LABEL_NETPLAY_DISCONNECT, - MENU_SETTING_ACTION, 0, 0); - } - else if (netplay_driver_ctl(RARCH_NETPLAY_CTL_IS_ENABLED, NULL) && - !netplay_driver_ctl(RARCH_NETPLAY_CTL_IS_SERVER, NULL) && - netplay_driver_ctl(RARCH_NETPLAY_CTL_IS_CONNECTED, NULL)) - { - menu_entries_append_enum(info->list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETPLAY_DISCONNECT), - msg_hash_to_str(MENU_ENUM_LABEL_NETPLAY_DISCONNECT), - MENU_ENUM_LABEL_NETPLAY_DISCONNECT, - MENU_SETTING_ACTION, 0, 0); - } - else - { - menu_entries_append_enum(info->list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETPLAY_ENABLE_HOST), - msg_hash_to_str(MENU_ENUM_LABEL_NETPLAY_ENABLE_HOST), - MENU_ENUM_LABEL_NETPLAY_ENABLE_HOST, - MENU_SETTING_ACTION, 0, 0); - } - - menu_entries_append_enum(info->list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETPLAY_REFRESH_ROOMS), - msg_hash_to_str(MENU_ENUM_LABEL_NETPLAY_REFRESH_ROOMS), - MENU_ENUM_LABEL_NETPLAY_REFRESH_ROOMS, - MENU_SETTING_ACTION, 0, 0); - netplay_refresh_rooms_menu(info->list); - #endif return 0;