(trunk libutp) #4260 "uTP not working on embedded device" -- use __attribute__ ((__packed__)) on gcc compilers as suggested by KyleK

This commit is contained in:
Jordan Lee 2011-05-28 00:50:11 +00:00
parent a2432f17e4
commit 2492ac63e5
2 changed files with 27 additions and 13 deletions

View File

@ -35,7 +35,12 @@ template <typename T> static inline T clamp(T v, T mi, T ma)
return v;
}
#pragma pack(push,1)
#ifdef __GNUC__
#define PACKED_ATTRIBUTE __attribute__((__packed__))
#else
#define PACKED_ATTRIBUTE
#pragma pack(push,1)
#endif
namespace aux
{
@ -48,7 +53,7 @@ namespace aux
}
template <class T>
struct big_endian
struct PACKED_ATTRIBUTE big_endian
{
T operator=(T i) { m_integer = aux::host_to_network(i); return i; }
operator T() const { return aux::network_to_host(m_integer); }
@ -60,7 +65,9 @@ typedef big_endian<int32> int32_big;
typedef big_endian<uint32> uint32_big;
typedef big_endian<uint16> uint16_big;
#pragma pack(pop)
#ifndef __GNUC__
#pragma pack(pop)
#endif
template<typename T> static inline void zeromem(T *a, size_t count = 1) { memset(a, 0, count * sizeof(T)); }

View File

@ -92,9 +92,14 @@ char addrbuf[65];
char addrbuf2[65];
#define addrfmt(x, s) x.fmt(s, sizeof(s))
#pragma pack(push,1)
#ifdef __GNUC__
#define PACKED_ATTRIBUTE __attribute__((__packed__))
#else
#define PACKED_ATTRIBUTE
#pragma pack(push,1)
#endif
struct PackedSockAddr {
struct PACKED_ATTRIBUTE PackedSockAddr {
// The values are always stored here in network byte order
union {
@ -192,7 +197,7 @@ struct PackedSockAddr {
}
};
struct RST_Info {
struct PACKED_ATTRIBUTE RST_Info {
PackedSockAddr addr;
uint32 connid;
uint32 timestamp;
@ -211,7 +216,7 @@ struct RST_Info {
#define PACKET_SIZE_BIG 1400
#define PACKET_SIZE_HUGE_BUCKET 4
struct PacketFormat {
struct PACKED_ATTRIBUTE PacketFormat {
// connection ID
uint32_big connid;
uint32_big tv_sec;
@ -229,21 +234,21 @@ struct PacketFormat {
uint16_big ack_nr;
};
struct PacketFormatAck {
struct PACKED_ATTRIBUTE PacketFormatAck {
PacketFormat pf;
byte ext_next;
byte ext_len;
byte acks[4];
};
struct PacketFormatExtensions {
struct PACKED_ATTRIBUTE PacketFormatExtensions {
PacketFormat pf;
byte ext_next;
byte ext_len;
byte extensions[8];
};
struct PacketFormatV1 {
struct PACKED_ATTRIBUTE PacketFormatV1 {
// packet_type (4 high bits)
// protocol version (4 low bits)
byte ver_type;
@ -266,21 +271,23 @@ struct PacketFormatV1 {
uint16_big ack_nr;
};
struct PacketFormatAckV1 {
struct PACKED_ATTRIBUTE PacketFormatAckV1 {
PacketFormatV1 pf;
byte ext_next;
byte ext_len;
byte acks[4];
};
struct PacketFormatExtensionsV1 {
struct PACKED_ATTRIBUTE PacketFormatExtensionsV1 {
PacketFormatV1 pf;
byte ext_next;
byte ext_len;
byte extensions[8];
};
#pragma pack(pop)
#ifndef __GNUC__
#pragma pack(pop)
#endif
enum {
ST_DATA = 0, // Data packet.