Compute game info request buffer at compile time
Its contents depend only on compile-time constants, so compute it once and store it as a read-only variable to be sent as needed.
This commit is contained in:
parent
a0c95c21a8
commit
9af7159592
|
@ -330,6 +330,23 @@ static void net_udp_process_game_info(const uint8_t *data, uint_fast32_t data_le
|
||||||
static int udp_tracker_register();
|
static int udp_tracker_register();
|
||||||
static int udp_tracker_reqgames();
|
static int udp_tracker_reqgames();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
template <uint8_t id>
|
||||||
|
constexpr std::array<uint8_t, UPID_GAME_INFO_REQ_SIZE> udp_request_game_info_template{{
|
||||||
|
id,
|
||||||
|
UDP_REQ_ID[0],
|
||||||
|
UDP_REQ_ID[1],
|
||||||
|
UDP_REQ_ID[2],
|
||||||
|
UDP_REQ_ID[3],
|
||||||
|
#define DXX_CONST_INIT_LE16(V) \
|
||||||
|
static_cast<uint8_t>(V), \
|
||||||
|
static_cast<uint8_t>(V >> 8)
|
||||||
|
DXX_CONST_INIT_LE16(DXX_VERSION_MAJORi),
|
||||||
|
DXX_CONST_INIT_LE16(DXX_VERSION_MINORi),
|
||||||
|
DXX_CONST_INIT_LE16(DXX_VERSION_MICROi),
|
||||||
|
DXX_CONST_INIT_LE16(MULTI_PROTO_VERSION),
|
||||||
|
}};
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
namespace {
|
namespace {
|
||||||
|
@ -713,16 +730,6 @@ static void copy_to_ntstring(const uint8_t *const buf, uint_fast32_t &len, ntstr
|
||||||
len += c;
|
len += c;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void net_udp_prepare_request_game_info(std::array<uint8_t, UPID_GAME_INFO_REQ_SIZE> &buf, int lite)
|
|
||||||
{
|
|
||||||
buf[0] = lite ? UPID_GAME_INFO_LITE_REQ : UPID_GAME_INFO_REQ;
|
|
||||||
memcpy(&buf[1], UDP_REQ_ID, 4);
|
|
||||||
PUT_INTEL_SHORT(&buf[5], DXX_VERSION_MAJORi);
|
|
||||||
PUT_INTEL_SHORT(&buf[7], DXX_VERSION_MINORi);
|
|
||||||
PUT_INTEL_SHORT(&buf[9], DXX_VERSION_MICROi);
|
|
||||||
PUT_INTEL_SHORT(&buf[11], MULTI_PROTO_VERSION);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void reset_UDP_MyPort()
|
static void reset_UDP_MyPort()
|
||||||
{
|
{
|
||||||
UDP_MyPort = CGameArg.MplUdpMyPort >= 1024 ? CGameArg.MplUdpMyPort : UDP_PORT_DEFAULT;
|
UDP_MyPort = CGameArg.MplUdpMyPort >= 1024 ? CGameArg.MplUdpMyPort : UDP_PORT_DEFAULT;
|
||||||
|
@ -945,13 +952,6 @@ static ssize_t udp_receive_packet(RAIIsocket &sock, const socket_data_buffer msg
|
||||||
}
|
}
|
||||||
/* General UDP functions - END */
|
/* General UDP functions - END */
|
||||||
|
|
||||||
void net_udp_request_game_info(const csockaddr_ref game_addr, int lite)
|
|
||||||
{
|
|
||||||
std::array<uint8_t, UPID_GAME_INFO_REQ_SIZE> buf;
|
|
||||||
net_udp_prepare_request_game_info(buf, lite);
|
|
||||||
dxx_sendto(UDP_Socket[0], buf, 0, game_addr);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct direct_join
|
struct direct_join
|
||||||
{
|
{
|
||||||
enum class connect_type : uint8_t
|
enum class connect_type : uint8_t
|
||||||
|
@ -1082,9 +1082,14 @@ void net_udp_send_game_info(csockaddr_ref sender_addr, const _sockaddr *player_a
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace dsx {
|
namespace dsx {
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
|
void net_udp_request_game_info(const csockaddr_ref game_addr, int lite)
|
||||||
|
{
|
||||||
|
auto &buf = lite ? udp_request_game_info_template<UPID_GAME_INFO_LITE_REQ> : udp_request_game_info_template<UPID_GAME_INFO_REQ>;
|
||||||
|
dxx_sendto(UDP_Socket[0], buf, 0, game_addr);
|
||||||
|
}
|
||||||
|
|
||||||
direct_join::connect_type net_udp_show_game_info(const netgame_info &Netgame);
|
direct_join::connect_type net_udp_show_game_info(const netgame_info &Netgame);
|
||||||
|
|
||||||
// Connect to a game host and get full info. Eventually we join!
|
// Connect to a game host and get full info. Eventually we join!
|
||||||
|
|
Loading…
Reference in a new issue