mirror of https://github.com/OpenTTD/OpenTTD
(svn r281) -Fix: some endian issues fixed in network code
parent
f7cfd47261
commit
e049bd9b2b
75
network.c
75
network.c
|
@ -101,7 +101,7 @@ typedef struct CommandPacket {
|
||||||
TileIndex tile;
|
TileIndex tile;
|
||||||
byte player;// player id, this is checked by the server.
|
byte player;// player id, this is checked by the server.
|
||||||
byte when; // offset from the current max_frame value minus 1. this is set by the server.
|
byte when; // offset from the current max_frame value minus 1. this is set by the server.
|
||||||
uint32 dp[8];
|
uint32 dp[10];
|
||||||
} CommandPacket;
|
} CommandPacket;
|
||||||
|
|
||||||
typedef struct EventPacket {
|
typedef struct EventPacket {
|
||||||
|
@ -460,6 +460,7 @@ void NetworkSendCommand(TileIndex tile, uint32 p1, uint32 p2, uint32 cmd, Comman
|
||||||
int nump;
|
int nump;
|
||||||
QueuedCommand *qp;
|
QueuedCommand *qp;
|
||||||
ClientState *cs;
|
ClientState *cs;
|
||||||
|
CommandPacket cp;
|
||||||
|
|
||||||
if (!(cmd & CMD_NET_INSTANT)) {
|
if (!(cmd & CMD_NET_INSTANT)) {
|
||||||
qp = AllocQueuedCommand(_networking_server ? &_command_queue : &_ack_queue);
|
qp = AllocQueuedCommand(_networking_server ? &_command_queue : &_ack_queue);
|
||||||
|
@ -469,7 +470,7 @@ void NetworkSendCommand(TileIndex tile, uint32 p1, uint32 p2, uint32 cmd, Comman
|
||||||
qp->cp.packet_type = PACKET_TYPE_COMMAND;
|
qp->cp.packet_type = PACKET_TYPE_COMMAND;
|
||||||
qp->cp.tile = tile;
|
qp->cp.tile = tile;
|
||||||
qp->cp.p1 = p1;
|
qp->cp.p1 = p1;
|
||||||
qp->cp.p2 = p2;
|
qp->cp.p2 = p2;
|
||||||
qp->cp.cmd = (uint16)cmd;
|
qp->cp.cmd = (uint16)cmd;
|
||||||
qp->cp.player = _local_player;
|
qp->cp.player = _local_player;
|
||||||
qp->cp.when = 0;
|
qp->cp.when = 0;
|
||||||
|
@ -480,27 +481,22 @@ void NetworkSendCommand(TileIndex tile, uint32 p1, uint32 p2, uint32 cmd, Comman
|
||||||
qp->frame = _frame_counter_max - GetNextSyncFrame();
|
qp->frame = _frame_counter_max - GetNextSyncFrame();
|
||||||
|
|
||||||
// calculate the amount of extra bytes.
|
// calculate the amount of extra bytes.
|
||||||
nump = 8;
|
nump = 10;
|
||||||
while ( nump != 0 && ((uint32*)_decode_parameters)[nump-1] == 0) nump--;
|
while ( nump != 0 && ((uint32*)_decode_parameters)[nump-1] == 0) nump--;
|
||||||
qp->cp.packet_length = COMMAND_PACKET_BASE_SIZE + nump * sizeof(uint32);
|
qp->cp.packet_length = COMMAND_PACKET_BASE_SIZE + nump * sizeof(uint32);
|
||||||
if (nump != 0) memcpy(qp->cp.dp, _decode_parameters, nump * sizeof(uint32));
|
if (nump != 0) memcpy(qp->cp.dp, _decode_parameters, nump * sizeof(uint32));
|
||||||
|
|
||||||
#if defined(TTD_BIG_ENDIAN)
|
cp = qp->cp;
|
||||||
// need to convert the command to little endian before sending it.
|
|
||||||
{
|
// convert to little endian
|
||||||
CommandPacket cp;
|
cp.tile = TO_LE16(cp.tile);
|
||||||
cp = qp->cp;
|
cp.p1 = TO_LE32(cp.p1);
|
||||||
cp.cmd = TO_LE16(cp.cmd);
|
cp.p2 = TO_LE32(cp.p2);
|
||||||
cp.tile = TO_LE16(cp.tile);
|
cp.cmd = TO_LE16(cp.cmd);
|
||||||
cp.p1 = TO_LE32(cp.p1);
|
|
||||||
cp.p2 = TO_LE32(cp.p2);
|
// send it to the peers
|
||||||
for(cs=_clients; cs->socket != INVALID_SOCKET; cs++) if (!cs->inactive) SendBytes(cs, &cp, cp.packet_length);
|
for(cs=_clients; cs->socket != INVALID_SOCKET; cs++) if (!cs->inactive) SendBytes(cs, &cp, cp.packet_length);
|
||||||
}
|
|
||||||
#else
|
|
||||||
// send it to the peers
|
|
||||||
for(cs=_clients; cs->socket != INVALID_SOCKET; cs++) if (!cs->inactive) SendBytes(cs, &qp->cp, qp->cp.packet_length);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
if (cmd & CMD_NET_INSTANT) {
|
if (cmd & CMD_NET_INSTANT) {
|
||||||
free(qp);
|
free(qp);
|
||||||
}
|
}
|
||||||
|
@ -546,10 +542,7 @@ static void HandleCommandPacket(ClientState *cs, CommandPacket *np)
|
||||||
DEBUG(net, 2) ("NET: %i] cmd size %d", _frame_counter, np->packet_length);
|
DEBUG(net, 2) ("NET: %i] cmd size %d", _frame_counter, np->packet_length);
|
||||||
assert(np->packet_length >= COMMAND_PACKET_BASE_SIZE);
|
assert(np->packet_length >= COMMAND_PACKET_BASE_SIZE);
|
||||||
|
|
||||||
cmd = np->cmd;
|
cmd = FROM_LE16(np->cmd);
|
||||||
#if defined(TTD_BIG_ENDIAN)
|
|
||||||
cmd = TO_LE16(cmd);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (!(cmd & CMD_NET_INSTANT)) {
|
if (!(cmd & CMD_NET_INSTANT)) {
|
||||||
// put it into the command queue
|
// put it into the command queue
|
||||||
|
@ -567,7 +560,7 @@ static void HandleCommandPacket(ClientState *cs, CommandPacket *np)
|
||||||
memcpy(&qp->cp.dp, np->dp, np->packet_length - COMMAND_PACKET_BASE_SIZE);
|
memcpy(&qp->cp.dp, np->dp, np->packet_length - COMMAND_PACKET_BASE_SIZE);
|
||||||
|
|
||||||
ap.packet_type = PACKET_TYPE_ACK;
|
ap.packet_type = PACKET_TYPE_ACK;
|
||||||
ap.when = GetNextSyncFrame();
|
ap.when = TO_LE16(GetNextSyncFrame());
|
||||||
ap.packet_length = sizeof(AckPacket);
|
ap.packet_length = sizeof(AckPacket);
|
||||||
DEBUG(net,4)("NET: %i] NewACK: frame=%i %i",_frame_counter, ap.when,_frame_counter_max - GetNextSyncFrame());
|
DEBUG(net,4)("NET: %i] NewACK: frame=%i %i",_frame_counter, ap.when,_frame_counter_max - GetNextSyncFrame());
|
||||||
|
|
||||||
|
@ -584,10 +577,10 @@ static void HandleCommandPacket(ClientState *cs, CommandPacket *np)
|
||||||
|
|
||||||
// convert from little endian to big endian?
|
// convert from little endian to big endian?
|
||||||
#if defined(TTD_BIG_ENDIAN)
|
#if defined(TTD_BIG_ENDIAN)
|
||||||
qp->cp.cmd = TO_LE16(qp->cp.cmd);
|
qp->cp.cmd = FROM_LE16(qp->cp.cmd);
|
||||||
qp->cp.tile = TO_LE16(qp->cp.tile);
|
qp->cp.tile = FROM_LE16(qp->cp.tile);
|
||||||
qp->cp.p1 = TO_LE32(qp->cp.p1);
|
qp->cp.p1 = FROM_LE32(qp->cp.p1);
|
||||||
qp->cp.p2 = TO_LE32(qp->cp.p2);
|
qp->cp.p2 = FROM_LE32(qp->cp.p2);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
qp->cmd = qp->cp.cmd;
|
qp->cmd = qp->cp.cmd;
|
||||||
|
@ -627,8 +620,8 @@ static void HandleSyncPacket(SyncPacket *sp)
|
||||||
if (_networking_queuing || _frame_counter == 0)
|
if (_networking_queuing || _frame_counter == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
s1 = TO_LE32(sp->random_seed_1);
|
s1 = FROM_LE32(sp->random_seed_1);
|
||||||
s2 = TO_LE32(sp->random_seed_2);
|
s2 = FROM_LE32(sp->random_seed_2);
|
||||||
|
|
||||||
DEBUG(net, 3) ("NET: %i] sync seeds: 1=%i 2=%i",_frame_counter, sp->random_seed_1, sp->random_seed_2);
|
DEBUG(net, 3) ("NET: %i] sync seeds: 1=%i 2=%i",_frame_counter, sp->random_seed_1, sp->random_seed_2);
|
||||||
|
|
||||||
|
@ -666,7 +659,8 @@ static void HandleAckPacket(AckPacket * ap)
|
||||||
assert(q);
|
assert(q);
|
||||||
if (!(_ack_queue.head = q->next)) _ack_queue.last = &_ack_queue.head;
|
if (!(_ack_queue.head = q->next)) _ack_queue.last = &_ack_queue.head;
|
||||||
q->next = NULL;
|
q->next = NULL;
|
||||||
q->frame = (_frame_counter_max - (ap->when));
|
|
||||||
|
q->frame = (_frame_counter_max - (FROM_LE16(ap->when)));
|
||||||
|
|
||||||
*_command_queue.last = q;
|
*_command_queue.last = q;
|
||||||
_command_queue.last = &q->next;
|
_command_queue.last = &q->next;
|
||||||
|
@ -720,15 +714,16 @@ static void HandleWelcomePacket(WelcomePacket *wp)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
for (i=0; i<MAX_PLAYERS; i++) {
|
for (i=0; i<MAX_PLAYERS; i++) {
|
||||||
_player_seeds[i][0]=wp->player_seeds[i][0];
|
|
||||||
_player_seeds[i][1]=wp->player_seeds[i][1];
|
_player_seeds[i][0] = FROM_LE32(wp->player_seeds[i][0]);
|
||||||
|
_player_seeds[i][1] = FROM_LE32(wp->player_seeds[i][1]);
|
||||||
}
|
}
|
||||||
if (wp->frames_srv != 0) {
|
if (wp->frames_srv != 0) {
|
||||||
_frame_counter_max = wp->frames_max;
|
_frame_counter_max = FROM_LE32(wp->frames_max);
|
||||||
_frame_counter_srv = wp->frames_srv;
|
_frame_counter_srv = FROM_LE32(wp->frames_srv);
|
||||||
}
|
}
|
||||||
if (wp->frames_cnt != 0) {
|
if (wp->frames_cnt != 0) {
|
||||||
_frame_counter = wp->frames_cnt;
|
_frame_counter = FROM_LE32(wp->frames_cnt);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1014,17 +1009,17 @@ void NetworkSendWelcome(ClientState *cs, bool direct) {
|
||||||
wp.packet_type = PACKET_TYPE_WELCOME;
|
wp.packet_type = PACKET_TYPE_WELCOME;
|
||||||
wp.packet_length = sizeof(WelcomePacket);
|
wp.packet_length = sizeof(WelcomePacket);
|
||||||
for (i=0; i<MAX_PLAYERS; i++) {
|
for (i=0; i<MAX_PLAYERS; i++) {
|
||||||
wp.player_seeds[i][0]=_player_seeds[i][0];
|
wp.player_seeds[i][0]=TO_LE32(_player_seeds[i][0]);
|
||||||
wp.player_seeds[i][1]=_player_seeds[i][1];
|
wp.player_seeds[i][1]=TO_LE32(_player_seeds[i][1]);
|
||||||
}
|
}
|
||||||
if (direct) {
|
if (direct) {
|
||||||
wp.frames_max=0;
|
wp.frames_max=0;
|
||||||
wp.frames_srv=0;
|
wp.frames_srv=0;
|
||||||
wp.frames_cnt=_frame_counter;
|
wp.frames_cnt=TO_LE32(_frame_counter);
|
||||||
SendDirectBytes(cs,(void *)&wp,wp.packet_length);
|
SendDirectBytes(cs,(void *)&wp,wp.packet_length);
|
||||||
} else {
|
} else {
|
||||||
wp.frames_max=_frame_counter_max;
|
wp.frames_max=TO_LE32(_frame_counter_max);
|
||||||
wp.frames_srv=_frame_counter_srv;
|
wp.frames_srv=TO_LE32(_frame_counter_srv);
|
||||||
wp.frames_cnt=0;
|
wp.frames_cnt=0;
|
||||||
SendBytes(cs,(void *)&wp,wp.packet_length);
|
SendBytes(cs,(void *)&wp,wp.packet_length);
|
||||||
}
|
}
|
||||||
|
|
23
stdafx.h
23
stdafx.h
|
@ -113,19 +113,32 @@ typedef unsigned __int64 uint64;
|
||||||
|
|
||||||
// Setup alignment and conversion macros
|
// Setup alignment and conversion macros
|
||||||
#if defined(TTD_BIG_ENDIAN)
|
#if defined(TTD_BIG_ENDIAN)
|
||||||
|
|
||||||
# define TTD_ALIGNMENT_2
|
# define TTD_ALIGNMENT_2
|
||||||
# define TTD_ALIGNMENT_4
|
# define TTD_ALIGNMENT_4
|
||||||
|
|
||||||
static uint32 INLINE TO_LE32(uint32 x) { return BSWAP32(x); }
|
static uint32 INLINE TO_LE32(uint32 x) { return BSWAP32(x); }
|
||||||
static uint16 INLINE TO_LE16(uint16 x) { return BSWAP16(x); }
|
static uint16 INLINE TO_LE16(uint16 x) { return BSWAP16(x); }
|
||||||
# define TO_BE32(x) x
|
static uint32 INLINE FROM_LE32(uint32 x) { return BSWAP32(x); }
|
||||||
# define TO_BE16(x) x
|
static uint16 INLINE FROM_LE16(uint16 x) { return BSWAP16(x); }
|
||||||
|
#define TO_BE32(x) x
|
||||||
|
#define TO_BE16(x) x
|
||||||
|
#define FROM_BE32(x) x
|
||||||
|
#define FROM_BE16(x) x
|
||||||
#define TO_BE32X(x) x
|
#define TO_BE32X(x) x
|
||||||
|
|
||||||
#else
|
#else
|
||||||
# define TO_LE32(x) x
|
|
||||||
# define TO_LE16(x) x
|
|
||||||
#define TO_BE32X(x) BSWAP32(x)
|
|
||||||
static uint32 FORCEINLINE TO_BE32(uint32 x) { return BSWAP32(x); }
|
static uint32 FORCEINLINE TO_BE32(uint32 x) { return BSWAP32(x); }
|
||||||
static uint16 FORCEINLINE TO_BE16(uint16 x) { return BSWAP16(x); }
|
static uint16 FORCEINLINE TO_BE16(uint16 x) { return BSWAP16(x); }
|
||||||
|
static uint32 FORCEINLINE FROM_BE32(uint32 x) { return BSWAP32(x); }
|
||||||
|
static uint16 FORCEINLINE FROM_BE16(uint16 x) { return BSWAP16(x); }
|
||||||
|
#define TO_LE32(x) x
|
||||||
|
#define TO_LE16(x) x
|
||||||
|
#define TO_BE32X(x) BSWAP32(x)
|
||||||
|
#define FROM_LE32(x) x
|
||||||
|
#define FROM_LE16(x) x
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(GAME_DATA_DIR)
|
#if !defined(GAME_DATA_DIR)
|
||||||
|
|
Loading…
Reference in New Issue