mirror of
https://github.com/transmission/transmission
synced 2025-02-27 00:12:35 +00:00
(trunk, libutp) #4260 "uTP not working when compiler doesn't honor 'pragma pack'" -- apply alus' revised patch for testing.
This commit is contained in:
parent
0faddf054b
commit
cdb95995e8
2 changed files with 13 additions and 27 deletions
13
third-party/libutp/templates.h
vendored
13
third-party/libutp/templates.h
vendored
|
@ -35,12 +35,7 @@ template <typename T> static inline T clamp(T v, T mi, T ma)
|
||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __GNUC__
|
#pragma pack(push,1)
|
||||||
#define PACKED_ATTRIBUTE __attribute__((__packed__))
|
|
||||||
#else
|
|
||||||
#define PACKED_ATTRIBUTE
|
|
||||||
#pragma pack(push,1)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace aux
|
namespace aux
|
||||||
{
|
{
|
||||||
|
@ -53,7 +48,7 @@ namespace aux
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
struct PACKED_ATTRIBUTE big_endian
|
struct big_endian
|
||||||
{
|
{
|
||||||
T operator=(T i) { m_integer = aux::host_to_network(i); return i; }
|
T operator=(T i) { m_integer = aux::host_to_network(i); return i; }
|
||||||
operator T() const { return aux::network_to_host(m_integer); }
|
operator T() const { return aux::network_to_host(m_integer); }
|
||||||
|
@ -65,9 +60,7 @@ typedef big_endian<int32> int32_big;
|
||||||
typedef big_endian<uint32> uint32_big;
|
typedef big_endian<uint32> uint32_big;
|
||||||
typedef big_endian<uint16> uint16_big;
|
typedef big_endian<uint16> uint16_big;
|
||||||
|
|
||||||
#ifndef __GNUC__
|
#pragma pack(pop)
|
||||||
#pragma pack(pop)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
template<typename T> static inline void zeromem(T *a, size_t count = 1) { memset(a, 0, count * sizeof(T)); }
|
template<typename T> static inline void zeromem(T *a, size_t count = 1) { memset(a, 0, count * sizeof(T)); }
|
||||||
|
|
||||||
|
|
27
third-party/libutp/utp.cpp
vendored
27
third-party/libutp/utp.cpp
vendored
|
@ -92,14 +92,9 @@ char addrbuf[65];
|
||||||
char addrbuf2[65];
|
char addrbuf2[65];
|
||||||
#define addrfmt(x, s) x.fmt(s, sizeof(s))
|
#define addrfmt(x, s) x.fmt(s, sizeof(s))
|
||||||
|
|
||||||
#ifdef __GNUC__
|
#pragma pack(push,1)
|
||||||
#define PACKED_ATTRIBUTE __attribute__((__packed__))
|
|
||||||
#else
|
|
||||||
#define PACKED_ATTRIBUTE
|
|
||||||
#pragma pack(push,1)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
struct PACKED_ATTRIBUTE PackedSockAddr {
|
struct PackedSockAddr {
|
||||||
|
|
||||||
// The values are always stored here in network byte order
|
// The values are always stored here in network byte order
|
||||||
union {
|
union {
|
||||||
|
@ -197,7 +192,7 @@ struct PACKED_ATTRIBUTE PackedSockAddr {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct PACKED_ATTRIBUTE RST_Info {
|
struct RST_Info {
|
||||||
PackedSockAddr addr;
|
PackedSockAddr addr;
|
||||||
uint32 connid;
|
uint32 connid;
|
||||||
uint32 timestamp;
|
uint32 timestamp;
|
||||||
|
@ -216,7 +211,7 @@ struct PACKED_ATTRIBUTE RST_Info {
|
||||||
#define PACKET_SIZE_BIG 1400
|
#define PACKET_SIZE_BIG 1400
|
||||||
#define PACKET_SIZE_HUGE_BUCKET 4
|
#define PACKET_SIZE_HUGE_BUCKET 4
|
||||||
|
|
||||||
struct PACKED_ATTRIBUTE PacketFormat {
|
struct PacketFormat {
|
||||||
// connection ID
|
// connection ID
|
||||||
uint32_big connid;
|
uint32_big connid;
|
||||||
uint32_big tv_sec;
|
uint32_big tv_sec;
|
||||||
|
@ -234,21 +229,21 @@ struct PACKED_ATTRIBUTE PacketFormat {
|
||||||
uint16_big ack_nr;
|
uint16_big ack_nr;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct PACKED_ATTRIBUTE PacketFormatAck {
|
struct PacketFormatAck {
|
||||||
PacketFormat pf;
|
PacketFormat pf;
|
||||||
byte ext_next;
|
byte ext_next;
|
||||||
byte ext_len;
|
byte ext_len;
|
||||||
byte acks[4];
|
byte acks[4];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct PACKED_ATTRIBUTE PacketFormatExtensions {
|
struct PacketFormatExtensions {
|
||||||
PacketFormat pf;
|
PacketFormat pf;
|
||||||
byte ext_next;
|
byte ext_next;
|
||||||
byte ext_len;
|
byte ext_len;
|
||||||
byte extensions[8];
|
byte extensions[8];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct PACKED_ATTRIBUTE PacketFormatV1 {
|
struct PacketFormatV1 {
|
||||||
// packet_type (4 high bits)
|
// packet_type (4 high bits)
|
||||||
// protocol version (4 low bits)
|
// protocol version (4 low bits)
|
||||||
byte ver_type;
|
byte ver_type;
|
||||||
|
@ -271,23 +266,21 @@ struct PACKED_ATTRIBUTE PacketFormatV1 {
|
||||||
uint16_big ack_nr;
|
uint16_big ack_nr;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct PACKED_ATTRIBUTE PacketFormatAckV1 {
|
struct PacketFormatAckV1 {
|
||||||
PacketFormatV1 pf;
|
PacketFormatV1 pf;
|
||||||
byte ext_next;
|
byte ext_next;
|
||||||
byte ext_len;
|
byte ext_len;
|
||||||
byte acks[4];
|
byte acks[4];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct PACKED_ATTRIBUTE PacketFormatExtensionsV1 {
|
struct PacketFormatExtensionsV1 {
|
||||||
PacketFormatV1 pf;
|
PacketFormatV1 pf;
|
||||||
byte ext_next;
|
byte ext_next;
|
||||||
byte ext_len;
|
byte ext_len;
|
||||||
byte extensions[8];
|
byte extensions[8];
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifndef __GNUC__
|
#pragma pack(pop)
|
||||||
#pragma pack(pop)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
ST_DATA = 0, // Data packet.
|
ST_DATA = 0, // Data packet.
|
||||||
|
|
Loading…
Reference in a new issue