2 This file is part of GNUnet.
3 (C) 2010, 2011, 2012 Christian Grothoff
5 GNUnet is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published
7 by the Free Software Foundation; either version 3, or (at your
8 option) any later version.
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with GNUnet; see the file COPYING. If not, write to the
17 Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA.
22 * @file include/gnunet_tun_lib.h
23 * @brief standard TCP/IP network structs and IP checksum calculations for TUN interaction
24 * @author Philipp Toelke
25 * @author Christian Grothoff
27 #ifndef GNUNET_TUN_LIB_H
28 #define GNUNET_TUN_LIB_H
30 #include "gnunet_util_lib.h"
33 /* see http://www.iana.org/assignments/ethernet-numbers */
38 #define ETH_P_IPV4 0x0800
45 #define ETH_P_IPV6 0x86DD
49 GNUNET_NETWORK_STRUCT_BEGIN
52 * Header from Linux TUN interface.
54 struct GNUNET_TUN_Layer2PacketHeader
57 * Some flags (unused).
59 uint16_t flags GNUNET_PACKED;
62 * Here we get an ETH_P_-number.
64 uint16_t proto GNUNET_PACKED;
69 * Standard IPv4 header.
71 struct GNUNET_TUN_IPv4Header
73 unsigned header_length:4 GNUNET_PACKED;
74 unsigned version:4 GNUNET_PACKED;
76 uint16_t total_length GNUNET_PACKED;
77 uint16_t identification GNUNET_PACKED;
78 unsigned flags:3 GNUNET_PACKED;
79 unsigned fragmentation_offset:13 GNUNET_PACKED;
82 uint16_t checksum GNUNET_PACKED;
83 struct in_addr source_address GNUNET_PACKED;
84 struct in_addr destination_address GNUNET_PACKED;
89 * Standard IPv6 header.
91 struct GNUNET_TUN_IPv6Header
93 unsigned traffic_class_h:4 GNUNET_PACKED;
94 unsigned version:4 GNUNET_PACKED;
95 unsigned traffic_class_l:4 GNUNET_PACKED;
96 unsigned flow_label:20 GNUNET_PACKED;
97 uint16_t payload_length GNUNET_PACKED;
100 struct in6_addr source_address GNUNET_PACKED;
101 struct in6_addr destination_address GNUNET_PACKED;
106 * TCP packet header (FIXME: rename!)
108 struct GNUNET_TUN_TcpHeader
110 unsigned spt:16 GNUNET_PACKED;
111 unsigned dpt:16 GNUNET_PACKED;
112 unsigned seq:32 GNUNET_PACKED;
113 unsigned ack:32 GNUNET_PACKED;
117 unsigned rsv:4 GNUNET_PACKED;
119 * Number of 32-bit words in TCP header.
121 unsigned off:4 GNUNET_PACKED;
122 unsigned flg:8 GNUNET_PACKED;
126 unsigned wsz:16 GNUNET_PACKED;
127 unsigned crc:16 GNUNET_PACKED;
131 unsigned urg:16 GNUNET_PACKED;
136 * UDP packet header (FIXME: rename!)
138 struct GNUNET_TUN_UdpHeader
140 uint16_t spt GNUNET_PACKED;
141 uint16_t dpt GNUNET_PACKED;
142 uint16_t len GNUNET_PACKED;
143 uint16_t crc GNUNET_PACKED;
150 struct GNUNET_TUN_DnsHeader
152 uint16_t id GNUNET_PACKED;
153 uint16_t flags GNUNET_PACKED;
154 uint16_t qdcount GNUNET_PACKED;
155 uint16_t ancount GNUNET_PACKED;
156 uint16_t nscount GNUNET_PACKED;
157 uint16_t arcount GNUNET_PACKED;
160 #define GNUNET_TUN_ICMPTYPE_ECHO_REPLY 0
161 #define GNUNET_TUN_ICMPTYPE_DESTINATION_UNREACHABLE 3
162 #define GNUNET_TUN_ICMPTYPE_SOURCE_QUENCH 4
163 #define GNUNET_TUN_ICMPTYPE_REDIRECT_MESSAGE 5
164 #define GNUNET_TUN_ICMPTYPE_ECHO_REQUEST 8
165 #define GNUNET_TUN_ICMPTYPE_ROUTER_ADVERTISEMENT 9
166 #define GNUNET_TUN_ICMPTYPE_ROUTER_SOLICITATION 10
167 #define GNUNET_TUN_ICMPTYPE_TIME_EXCEEDED 11
169 #define GNUNET_TUN_ICMPTYPE6_DESTINATION_UNREACHABLE 1
170 #define GNUNET_TUN_ICMPTYPE6_PACKET_TOO_BIG 2
171 #define GNUNET_TUN_ICMPTYPE6_TIME_EXCEEDED 3
172 #define GNUNET_TUN_ICMPTYPE6_PARAMETER_PROBLEM 4
173 #define GNUNET_TUN_ICMPTYPE6_ECHO_REQUEST 128
174 #define GNUNET_TUN_ICMPTYPE6_ECHO_REPLY 129
179 struct GNUNET_TUN_IcmpHeader {
182 uint16_t crc GNUNET_PACKED;
186 * ICMP Echo (request/reply)
189 uint16_t identifier GNUNET_PACKED;
190 uint16_t sequence_number GNUNET_PACKED;
194 * ICMP Destination Unreachable (RFC 1191)
197 uint16_t empty GNUNET_PACKED;
198 uint16_t next_hop_mtu GNUNET_PACKED;
199 /* followed by original IP header + first 8 bytes of original IP datagram */
200 } destination_unreachable;
205 struct in_addr redirect_gateway_address GNUNET_PACKED;
208 * MTU for packets that are too big (IPv6).
210 uint32_t packet_too_big_mtu GNUNET_PACKED;
217 GNUNET_NETWORK_STRUCT_END
221 * Initialize an IPv4 header.
223 * @param ip header to initialize
224 * @param protocol protocol to use (i.e. IPPROTO_UDP)
225 * @param payload_length number of bytes of payload that follow (excluding IPv4 header)
226 * @param src source IP address to use
227 * @param dst destination IP address to use
230 GNUNET_TUN_initialize_ipv4_header (struct GNUNET_TUN_IPv4Header *ip,
232 uint16_t payload_length,
233 const struct in_addr *src,
234 const struct in_addr *dst);
238 * Initialize an IPv6 header.
240 * @param ip header to initialize
241 * @param protocol protocol to use (i.e. IPPROTO_UDP)
242 * @param payload_length number of bytes of payload that follow (excluding IPv4 header)
243 * @param src source IP address to use
244 * @param dst destination IP address to use
247 GNUNET_TUN_initialize_ipv6_header (struct GNUNET_TUN_IPv6Header *ip,
249 uint16_t payload_length,
250 const struct in6_addr *src,
251 const struct in6_addr *dst);
254 * Calculate IPv4 TCP checksum.
256 * @param ip ipv4 header fully initialized
257 * @param tcp TCP header (initialized except for CRC)
258 * @param payload the TCP payload
259 * @param payload_length number of bytes of TCP payload
262 GNUNET_TUN_calculate_tcp4_checksum (const struct GNUNET_TUN_IPv4Header *ip,
263 struct GNUNET_TUN_TcpHeader *tcp,
265 uint16_t payload_length);
268 * Calculate IPv6 TCP checksum.
270 * @param ip ipv6 header fully initialized
271 * @param tcp TCP header (initialized except for CRC)
272 * @param payload the TCP payload
273 * @param payload_length number of bytes of TCP payload
276 GNUNET_TUN_calculate_tcp6_checksum (const struct GNUNET_TUN_IPv6Header *ip,
277 struct GNUNET_TUN_TcpHeader *tcp,
279 uint16_t payload_length);
282 * Calculate IPv4 UDP checksum.
284 * @param ip ipv4 header fully initialized
285 * @param udp UDP header (initialized except for CRC)
286 * @param payload the UDP payload
287 * @param payload_length number of bytes of UDP payload
290 GNUNET_TUN_calculate_udp4_checksum (const struct GNUNET_TUN_IPv4Header *ip,
291 struct GNUNET_TUN_UdpHeader *udp,
293 uint16_t payload_length);
297 * Calculate IPv6 UDP checksum.
299 * @param ip ipv6 header fully initialized
300 * @param udp UDP header (initialized except for CRC)
301 * @param payload the UDP payload
302 * @param payload_length number of bytes of UDP payload
305 GNUNET_TUN_calculate_udp6_checksum (const struct GNUNET_TUN_IPv6Header *ip,
306 struct GNUNET_TUN_UdpHeader *udp,
308 uint16_t payload_length);
312 * Calculate ICMP checksum.
314 * @param icmp IMCP header (initialized except for CRC)
315 * @param payload the ICMP payload
316 * @param payload_length number of bytes of ICMP payload
319 GNUNET_TUN_calculate_icmp_checksum (struct GNUNET_TUN_IcmpHeader *icmp,
321 uint16_t payload_length);