*/
struct GNUNET_TUN_IPv4Header
{
- unsigned header_length:4 GNUNET_PACKED;
- unsigned version:4 GNUNET_PACKED;
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+ unsigned int header_length:4 GNUNET_PACKED;
+ unsigned int version:4 GNUNET_PACKED;
+#elif __BYTE_ORDER == __BIG_ENDIAN
+ unsigned int version:4 GNUNET_PACKED;
+ unsigned int header_length:4 GNUNET_PACKED;
+#else
+ #error byteorder undefined
+#endif
uint8_t diff_serv;
+
+ /**
+ * Length of the packet, including this header.
+ */
uint16_t total_length GNUNET_PACKED;
+
+ /**
+ * Unique random ID for matching up fragments.
+ */
uint16_t identification GNUNET_PACKED;
- unsigned flags:3 GNUNET_PACKED;
- unsigned fragmentation_offset:13 GNUNET_PACKED;
+
+ unsigned int flags:3 GNUNET_PACKED;
+
+ unsigned int fragmentation_offset:13 GNUNET_PACKED;
+
+ /**
+ * How many more hops can this packet be forwarded?
+ */
uint8_t ttl;
+
+ /**
+ * L4-protocol, for example, IPPROTO_UDP or IPPROTO_TCP.
+ */
uint8_t protocol;
+
+ /**
+ * Checksum.
+ */
uint16_t checksum GNUNET_PACKED;
+
+ /**
+ * Origin of the packet.
+ */
struct in_addr source_address GNUNET_PACKED;
+
+ /**
+ * Destination of the packet.
+ */
struct in_addr destination_address GNUNET_PACKED;
-};
+} GNUNET_GCC_STRUCT_LAYOUT;
/**
*/
struct GNUNET_TUN_IPv6Header
{
- unsigned traffic_class_h:4 GNUNET_PACKED;
- unsigned version:4 GNUNET_PACKED;
- unsigned traffic_class_l:4 GNUNET_PACKED;
- unsigned flow_label:20 GNUNET_PACKED;
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+ unsigned int traffic_class_h:4 GNUNET_PACKED;
+ unsigned int version:4 GNUNET_PACKED;
+ unsigned int traffic_class_l:4 GNUNET_PACKED;
+ unsigned int flow_label:20 GNUNET_PACKED;
+#elif __BYTE_ORDER == __BIG_ENDIAN
+ unsigned int version:4 GNUNET_PACKED;
+ unsigned int traffic_class:8 GNUNET_PACKED;
+ unsigned int flow_label:20 GNUNET_PACKED;
+#else
+ #error byteorder undefined
+#endif
+ /**
+ * Length of the payload, excluding this header.
+ */
uint16_t payload_length GNUNET_PACKED;
+
+ /**
+ * For example, IPPROTO_UDP or IPPROTO_TCP.
+ */
uint8_t next_header;
+
+ /**
+ * How many more hops can this packet be forwarded?
+ */
uint8_t hop_limit;
+
+ /**
+ * Origin of the packet.
+ */
struct in6_addr source_address GNUNET_PACKED;
+
+ /**
+ * Destination of the packet.
+ */
struct in6_addr destination_address GNUNET_PACKED;
-};
+} GNUNET_GCC_STRUCT_LAYOUT;
/**
- * TCP packet header (FIXME: rename!)
+ * TCP packet header.
*/
struct GNUNET_TUN_TcpHeader
{
- unsigned spt:16 GNUNET_PACKED;
- unsigned dpt:16 GNUNET_PACKED;
- unsigned seq:32 GNUNET_PACKED;
- unsigned ack:32 GNUNET_PACKED;
+ uint16_t source_port GNUNET_PACKED;
+ uint16_t destination_port GNUNET_PACKED;
+
+ /**
+ * Sequence number.
+ */
+ uint32_t seq GNUNET_PACKED;
+
+ /**
+ * Acknowledgement number.
+ */
+ uint32_t ack GNUNET_PACKED;
+#if __BYTE_ORDER == __LITTLE_ENDIAN
/**
- * Reserved.
+ * Reserved. Must be zero.
*/
- unsigned rsv:4 GNUNET_PACKED;
+ unsigned int reserved : 4 GNUNET_PACKED;
/**
* Number of 32-bit words in TCP header.
*/
- unsigned off:4 GNUNET_PACKED;
- unsigned flg:8 GNUNET_PACKED;
+ unsigned int off : 4 GNUNET_PACKED;
+#elif __BYTE_ORDER == __BIG_ENDIAN
+ /**
+ * Number of 32-bit words in TCP header.
+ */
+ unsigned int off : 4 GNUNET_PACKED;
+ /**
+ * Reserved. Must be zero.
+ */
+ unsigned int reserved : 4 GNUNET_PACKED;
+#else
+ #error byteorder undefined
+#endif
+
+ /**
+ * Flags (SYN, FIN, ACK, etc.)
+ */
+ uint8_t flags;
+
/**
* Window size.
*/
- unsigned wsz:16 GNUNET_PACKED;
- unsigned crc:16 GNUNET_PACKED;
+ uint16_t window_size GNUNET_PACKED;
+
+ /**
+ * Checksum.
+ */
+ uint16_t crc GNUNET_PACKED;
+
/**
* Urgent pointer.
*/
- unsigned urg:16 GNUNET_PACKED;
-};
+ uint16_t urgent_pointer GNUNET_PACKED;
+} GNUNET_GCC_STRUCT_LAYOUT;
/**
- * UDP packet header (FIXME: rename!)
+ * UDP packet header.
*/
struct GNUNET_TUN_UdpHeader
{
- uint16_t spt GNUNET_PACKED;
- uint16_t dpt GNUNET_PACKED;
+ uint16_t source_port GNUNET_PACKED;
+ uint16_t destination_port GNUNET_PACKED;
uint16_t len GNUNET_PACKED;
uint16_t crc GNUNET_PACKED;
};
#define GNUNET_TUN_ICMPTYPE6_ECHO_REQUEST 128
#define GNUNET_TUN_ICMPTYPE6_ECHO_REPLY 129
+
/**
* ICMP header.
*/