aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPablo Neira Ayuso <pablo@gnumonks.org>2014-03-19 22:55:29 +0100
committerPablo Neira Ayuso <pablo@netfilter.org>2014-03-20 14:11:25 +0100
commit0674f0b56ce666bc6e4a8448ff1ad4e46163eb83 (patch)
tree532caa680c8e2e612bf9743ea78854188874e7d1
parent0382996e101fa33c7f9fb7b875c65d0ff0138d9f (diff)
gtp: fix wrong binary layout for struct gtp0_header in x86_64
struct gtp0_header needs __attribute__((packed)) to make sure that gcc doesn't add a hole of 4 bytes to align the 64-bits teid, resulting in 24 bytes instead of 20 bytes. This was breaking gtpv0 in my gprs testbed with my x86_64 laptop. While at it, add also attribute packed to other headers just to make sure that gcc doesn't pad the structures with holes.
-rw-r--r--gtp/gtp.h6
1 files changed, 3 insertions, 3 deletions
diff --git a/gtp/gtp.h b/gtp/gtp.h
index 54af96e..39a902f 100644
--- a/gtp/gtp.h
+++ b/gtp/gtp.h
@@ -161,7 +161,7 @@ struct gtp0_header { /* Descriptions from 3GPP 09.60 */
uint8_t spare2; /* 11 Spare */
uint8_t spare3; /* 12 Spare */
uint64_t tid; /* 13 Tunnel ID */
-}; /* 20 */
+} __attribute__((packed)); /* 20 */
struct gtp1_header_short { /* Descriptions from 3GPP 29060 */
uint8_t flags; /* 01 bitfield, with typical values */
@@ -174,7 +174,7 @@ struct gtp1_header_short { /* Descriptions from 3GPP 29060 */
uint8_t type; /* 02 Message type. T-PDU = 0xff */
uint16_t length; /* 03 Length (of IP packet or signalling) */
uint32_t tei; /* 05 - 08 Tunnel Endpoint ID */
-};
+} __attribute__((packed));
struct gtp1_header_long { /* Descriptions from 3GPP 29060 */
uint8_t flags; /* 01 bitfield, with typical values */
@@ -190,7 +190,7 @@ struct gtp1_header_long { /* Descriptions from 3GPP 29060 */
uint16_t seq; /* 10 Sequence Number */
uint8_t npdu; /* 11 N-PDU Number */
uint8_t next; /* 12 Next extension header type. Empty = 0 */
-};
+} __attribute__((packed));
struct gtp0_packet {
struct gtp0_header h;