mirror of
https://github.com/coop-deluxe/sm64coopdx.git
synced 2025-10-30 08:01:01 +00:00
Added checksums to packets
This commit is contained in:
parent
1f1753e469
commit
d7a5a151d0
5 changed files with 35 additions and 1 deletions
|
|
@ -71,6 +71,7 @@
|
||||||
<PropertyGroup Label="UserMacros" />
|
<PropertyGroup Label="UserMacros" />
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
<LinkIncremental>true</LinkIncremental>
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
<IncludePath>../;../include/;../src/;$(IncludePath)</IncludePath>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
<LinkIncremental>true</LinkIncremental>
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
|
@ -3953,6 +3954,7 @@
|
||||||
<ClCompile Include="..\src\pc\network\packets\packet_read_write.c" />
|
<ClCompile Include="..\src\pc\network\packets\packet_read_write.c" />
|
||||||
<ClCompile Include="..\src\pc\network\packets\packet_reliable.c" />
|
<ClCompile Include="..\src\pc\network\packets\packet_reliable.c" />
|
||||||
<ClCompile Include="..\src\pc\network\packets\packet_spawn_objects.c" />
|
<ClCompile Include="..\src\pc\network\packets\packet_spawn_objects.c" />
|
||||||
|
<ClCompile Include="..\src\pc\network\packets\packet_spawn_star.c" />
|
||||||
<ClCompile Include="..\src\pc\pc_main.c" />
|
<ClCompile Include="..\src\pc\pc_main.c" />
|
||||||
<ClCompile Include="..\src\pc\platform.c" />
|
<ClCompile Include="..\src\pc\platform.c" />
|
||||||
<ClCompile Include="..\src\pc\ultra_reimplementation.c" />
|
<ClCompile Include="..\src\pc\ultra_reimplementation.c" />
|
||||||
|
|
|
||||||
|
|
@ -14970,6 +14970,9 @@
|
||||||
<ClCompile Include="..\src\pc\network\packets\packet_spawn_objects.c">
|
<ClCompile Include="..\src\pc\network\packets\packet_spawn_objects.c">
|
||||||
<Filter>Source Files\src\pc\network\packets</Filter>
|
<Filter>Source Files\src\pc\network\packets</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\src\pc\network\packets\packet_spawn_star.c">
|
||||||
|
<Filter>Source Files\src\pc\network\packets</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="..\actors\common0.h">
|
<ClCompile Include="..\actors\common0.h">
|
||||||
|
|
|
||||||
|
|
@ -68,7 +68,9 @@ void network_send(struct Packet* p) {
|
||||||
|
|
||||||
network_remember_reliable(p);
|
network_remember_reliable(p);
|
||||||
|
|
||||||
int rc = sendto(gSocket, p->buffer, p->cursor, 0, (SOCKADDR *)& txAddr, sizeof(txAddr));
|
u32 hash = packet_hash(p);
|
||||||
|
memcpy(&p->buffer[p->dataLength], &hash, sizeof(u32));
|
||||||
|
int rc = sendto(gSocket, p->buffer, p->cursor + sizeof(u32), 0, (SOCKADDR *)& txAddr, sizeof(txAddr));
|
||||||
if (rc == SOCKET_ERROR) {
|
if (rc == SOCKET_ERROR) {
|
||||||
wprintf(L"%s sendto failed with error: %d\n", NETWORKTYPESTR, WSAGetLastError());
|
wprintf(L"%s sendto failed with error: %d\n", NETWORKTYPESTR, WSAGetLastError());
|
||||||
return;
|
return;
|
||||||
|
|
@ -104,6 +106,11 @@ void network_update(void) {
|
||||||
}
|
}
|
||||||
if (rc == 0) { break; }
|
if (rc == 0) { break; }
|
||||||
|
|
||||||
|
p.dataLength = rc - sizeof(u32);
|
||||||
|
if (!packet_check_hash(&p)) {
|
||||||
|
printf("Invalid packet!\n");
|
||||||
|
}
|
||||||
|
|
||||||
switch (p.buffer[0]) {
|
switch (p.buffer[0]) {
|
||||||
case PACKET_ACK: network_receive_ack(&p); break;
|
case PACKET_ACK: network_receive_ack(&p); break;
|
||||||
case PACKET_PLAYER: network_receive_player(&p); break;
|
case PACKET_PLAYER: network_receive_player(&p); break;
|
||||||
|
|
|
||||||
|
|
@ -27,6 +27,7 @@ enum PacketType {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Packet {
|
struct Packet {
|
||||||
|
int dataLength;
|
||||||
int cursor;
|
int cursor;
|
||||||
bool error;
|
bool error;
|
||||||
bool reliable;
|
bool reliable;
|
||||||
|
|
@ -67,6 +68,8 @@ void network_shutdown(void);
|
||||||
void packet_init(struct Packet* packet, enum PacketType packetType, bool reliable);
|
void packet_init(struct Packet* packet, enum PacketType packetType, bool reliable);
|
||||||
void packet_write(struct Packet* packet, void* data, int length);
|
void packet_write(struct Packet* packet, void* data, int length);
|
||||||
void packet_read(struct Packet* packet, void* data, int length);
|
void packet_read(struct Packet* packet, void* data, int length);
|
||||||
|
u32 packet_hash(struct Packet* packet);
|
||||||
|
bool packet_check_hash(struct Packet* packet);
|
||||||
|
|
||||||
// packet headers
|
// packet headers
|
||||||
void network_send_ack(struct Packet* p);
|
void network_send_ack(struct Packet* p);
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@ void packet_init(struct Packet* packet, enum PacketType packetType, bool reliabl
|
||||||
nextSeqNum++;
|
nextSeqNum++;
|
||||||
if (nextSeqNum == 0) { nextSeqNum++; }
|
if (nextSeqNum == 0) { nextSeqNum++; }
|
||||||
}
|
}
|
||||||
|
packet->dataLength = 3;
|
||||||
packet->cursor = 3;
|
packet->cursor = 3;
|
||||||
packet->error = false;
|
packet->error = false;
|
||||||
packet->reliable = reliable;
|
packet->reliable = reliable;
|
||||||
|
|
@ -19,6 +20,7 @@ void packet_init(struct Packet* packet, enum PacketType packetType, bool reliabl
|
||||||
void packet_write(struct Packet* packet, void* data, int length) {
|
void packet_write(struct Packet* packet, void* data, int length) {
|
||||||
if (data == NULL) { packet->error = true; return; }
|
if (data == NULL) { packet->error = true; return; }
|
||||||
memcpy(&packet->buffer[packet->cursor], data, length);
|
memcpy(&packet->buffer[packet->cursor], data, length);
|
||||||
|
packet->dataLength += length;
|
||||||
packet->cursor += length;
|
packet->cursor += length;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -28,3 +30,20 @@ void packet_read(struct Packet* packet, void* data, int length) {
|
||||||
memcpy(data, &packet->buffer[cursor], length);
|
memcpy(data, &packet->buffer[cursor], length);
|
||||||
packet->cursor = cursor + length;
|
packet->cursor = cursor + length;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
u32 packet_hash(struct Packet* packet) {
|
||||||
|
u32 hash = 0;
|
||||||
|
int byte = 0;
|
||||||
|
for (int i = 0; i < packet->dataLength; i++) {
|
||||||
|
hash ^= ((u32)packet->buffer[i]) << (8 * byte);
|
||||||
|
byte = (byte + 1) % sizeof(u32);
|
||||||
|
}
|
||||||
|
return hash;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool packet_check_hash(struct Packet* packet) {
|
||||||
|
u32 localHash = packet_hash(packet);
|
||||||
|
u32 packetHash = 0;
|
||||||
|
memcpy(&packetHash, &packet->buffer[packet->dataLength], sizeof(u32));
|
||||||
|
return localHash == packetHash;
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue