GNUnet  0.10.x
gnunet_tun_lib.h
Go to the documentation of this file.
1 /*
2  This file is part of GNUnet.
3  Copyright (C) 2010-2013 Christian Grothoff
4 
5  GNUnet is free software: you can redistribute it and/or modify it
6  under the terms of the GNU Affero General Public License as published
7  by the Free Software Foundation, either version 3 of the License,
8  or (at your option) any later version.
9 
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  Affero General Public License for more details.
14 
15  You should have received a copy of the GNU Affero General Public License
16  along with this program. If not, see <http://www.gnu.org/licenses/>.
17 
18  SPDX-License-Identifier: AGPL3.0-or-later
19  */
20 
34 #ifndef GNUNET_TUN_LIB_H
35 #define GNUNET_TUN_LIB_H
36 
37 #include "gnunet_common.h"
38 #include "gnunet_crypto_lib.h"
39 
40 
41 /* see http://www.iana.org/assignments/ethernet-numbers */
42 #ifndef ETH_P_IPV4
43 
46 #define ETH_P_IPV4 0x0800
47 #endif
48 
49 #ifndef ETH_P_IPV6
50 
53 #define ETH_P_IPV6 0x86DD
54 #endif
55 
56 
64 #define GNUNET_TUN_IPV4_REGEXLEN 16
65 
66 
73 #define GNUNET_TUN_IPV6_REGEXLEN 40
74 
75 
77 
85  uint16_t flags GNUNET_PACKED;
86 
90  uint16_t proto GNUNET_PACKED;
91 };
92 
93 
98 #if __BYTE_ORDER == __LITTLE_ENDIAN
99  unsigned int header_length : 4 GNUNET_PACKED;
100  unsigned int version : 4 GNUNET_PACKED;
101 #elif __BYTE_ORDER == __BIG_ENDIAN
102  unsigned int version : 4 GNUNET_PACKED;
103  unsigned int header_length : 4 GNUNET_PACKED;
104 #else
105 #error byteorder undefined
106 #endif
107  uint8_t diff_serv;
108 
112  uint16_t total_length GNUNET_PACKED;
113 
117  uint16_t identification GNUNET_PACKED;
118 
119  unsigned int flags : 3 GNUNET_PACKED;
120 
122 
126  uint8_t ttl;
127 
131  uint8_t protocol;
132 
136  uint16_t checksum GNUNET_PACKED;
137 
141  struct in_addr source_address;
142 
146  struct in_addr destination_address;
148 
149 
154 #if __BYTE_ORDER == __LITTLE_ENDIAN
155  unsigned int traffic_class_h : 4 GNUNET_PACKED;
156  unsigned int version : 4 GNUNET_PACKED;
157  unsigned int traffic_class_l : 4 GNUNET_PACKED;
158  unsigned int flow_label : 20 GNUNET_PACKED;
159 #elif __BYTE_ORDER == __BIG_ENDIAN
160  unsigned int version : 4 GNUNET_PACKED;
161  unsigned int traffic_class : 8 GNUNET_PACKED;
162  unsigned int flow_label : 20 GNUNET_PACKED;
163 #else
164 #error byteorder undefined
165 #endif
166 
169  uint16_t payload_length GNUNET_PACKED;
170 
174  uint8_t next_header;
175 
179  uint8_t hop_limit;
180 
184  struct in6_addr source_address GNUNET_PACKED;
185 
189  struct in6_addr destination_address GNUNET_PACKED;
191 
192 
196 #define GNUNET_TUN_TCP_FLAGS_FIN 1
197 #define GNUNET_TUN_TCP_FLAGS_SYN 2
198 #define GNUNET_TUN_TCP_FLAGS_RST 4
199 #define GNUNET_TUN_TCP_FLAGS_PSH 8
200 #define GNUNET_TUN_TCP_FLAGS_ACK 16
201 #define GNUNET_TUN_TCP_FLAGS_URG 32
202 #define GNUNET_TUN_TCP_FLAGS_ECE 64
203 #define GNUNET_TUN_TCP_FLAGS_CWR 128
204 
212  uint16_t source_port GNUNET_PACKED;
213 
217  uint16_t destination_port GNUNET_PACKED;
218 
222  uint32_t seq GNUNET_PACKED;
223 
227  uint32_t ack GNUNET_PACKED;
228 #if __BYTE_ORDER == __LITTLE_ENDIAN
229 
232  unsigned int reserved : 4 GNUNET_PACKED;
236  unsigned int off : 4 GNUNET_PACKED;
237 #elif __BYTE_ORDER == __BIG_ENDIAN
238 
241  unsigned int off : 4 GNUNET_PACKED;
245  unsigned int reserved : 4 GNUNET_PACKED;
246 #else
247 #error byteorder undefined
248 #endif
249 
253  uint8_t flags;
254 
258  uint16_t window_size GNUNET_PACKED;
259 
263  uint16_t crc GNUNET_PACKED;
264 
268  uint16_t urgent_pointer GNUNET_PACKED;
270 
271 
279  uint16_t source_port GNUNET_PACKED;
280 
284  uint16_t destination_port GNUNET_PACKED;
285 
289  uint16_t len GNUNET_PACKED;
290 
294  uint16_t crc GNUNET_PACKED;
295 };
296 
297 
302 #define GNUNET_TUN_DNS_CLASS_INTERNET 1
303 #define GNUNET_TUN_DNS_CLASS_CHAOS 3
304 #define GNUNET_TUN_DNS_CLASS_HESIOD 4
305 
306 #define GNUNET_TUN_DNS_OPCODE_QUERY 0
307 #define GNUNET_TUN_DNS_OPCODE_INVERSE_QUERY 1
308 #define GNUNET_TUN_DNS_OPCODE_STATUS 2
309 
310 
314 #define GNUNET_TUN_DNS_RETURN_CODE_NO_ERROR 0
315 #define GNUNET_TUN_DNS_RETURN_CODE_FORMAT_ERROR 1
316 #define GNUNET_TUN_DNS_RETURN_CODE_SERVER_FAILURE 2
317 #define GNUNET_TUN_DNS_RETURN_CODE_NAME_ERROR 3
318 #define GNUNET_TUN_DNS_RETURN_CODE_NOT_IMPLEMENTED 4
319 #define GNUNET_TUN_DNS_RETURN_CODE_REFUSED 5
320 
324 #define GNUNET_TUN_DNS_RETURN_CODE_YXDOMAIN 6
325 #define GNUNET_TUN_DNS_RETURN_CODE_YXRRSET 7
326 #define GNUNET_TUN_DNS_RETURN_CODE_NXRRSET 8
327 #define GNUNET_TUN_DNS_RETURN_CODE_NOT_AUTH 9
328 #define GNUNET_TUN_DNS_RETURN_CODE_NOT_ZONE 10
329 
330 
335 #if __BYTE_ORDER == __LITTLE_ENDIAN
336 
340 
345 
350 
354  unsigned int opcode : 4 GNUNET_PACKED;
355 
360 
364  unsigned int return_code : 4 GNUNET_PACKED;
365 
370 
375 
379  unsigned int zero : 1 GNUNET_PACKED;
380 
385 #elif __BYTE_ORDER == __BIG_ENDIAN
386 
389  unsigned int query_or_response : 1 GNUNET_PACKED;
390 
394  unsigned int opcode : 4 GNUNET_PACKED;
395 
399  unsigned int authoritative_answer : 1 GNUNET_PACKED;
400 
404  unsigned int message_truncated : 1 GNUNET_PACKED;
405 
409  unsigned int recursion_desired : 1 GNUNET_PACKED;
410 
411 
415  unsigned int recursion_available : 1 GNUNET_PACKED;
416 
420  unsigned int zero : 1 GNUNET_PACKED;
421 
425  unsigned int authenticated_data : 1 GNUNET_PACKED;
426 
430  unsigned int checking_disabled : 1 GNUNET_PACKED;
431 
435  unsigned int return_code : 4 GNUNET_PACKED;
436 #else
437 #error byteorder undefined
438 #endif
440 
441 
449  uint16_t id GNUNET_PACKED;
450 
455 
459  uint16_t query_count GNUNET_PACKED;
460 
464  uint16_t answer_rcount GNUNET_PACKED;
465 
469  uint16_t authority_rcount GNUNET_PACKED;
470 
474  uint16_t additional_rcount GNUNET_PACKED;
475 };
476 
477 
485  uint32_t serial GNUNET_PACKED;
486 
490  uint32_t refresh GNUNET_PACKED;
491 
496  uint32_t retry GNUNET_PACKED;
497 
503 
508  uint32_t minimum GNUNET_PACKED;
509 };
510 
511 
521  uint16_t prio GNUNET_PACKED;
522 
528  uint16_t weight GNUNET_PACKED;
529 
533  uint16_t port GNUNET_PACKED;
534 
535  /* followed by 'target' name */
536 };
537 
538 
546  uint16_t cert_type;
547 
551  uint16_t cert_tag;
552 
556  uint8_t algorithm;
557 
558  /* Followed by the certificate */
559 };
560 
561 
574  uint8_t usage;
575 
583  uint8_t selector;
584 
591  uint8_t matching_type;
592 
604 };
605 
606 
615 
619  uint16_t proto;
620 
621  /* followed by the servicename */
622 };
623 
624 
632  uint16_t type GNUNET_PACKED;
633 
637  uint16_t dns_traffic_class GNUNET_PACKED;
638 };
639 
640 
648  uint16_t type GNUNET_PACKED;
649 
653  uint16_t dns_traffic_class GNUNET_PACKED;
654 
658  uint32_t ttl GNUNET_PACKED;
659 
663  uint16_t data_len GNUNET_PACKED;
664 };
665 
666 
667 #define GNUNET_TUN_ICMPTYPE_ECHO_REPLY 0
668 #define GNUNET_TUN_ICMPTYPE_DESTINATION_UNREACHABLE 3
669 #define GNUNET_TUN_ICMPTYPE_SOURCE_QUENCH 4
670 #define GNUNET_TUN_ICMPTYPE_REDIRECT_MESSAGE 5
671 #define GNUNET_TUN_ICMPTYPE_ECHO_REQUEST 8
672 #define GNUNET_TUN_ICMPTYPE_ROUTER_ADVERTISEMENT 9
673 #define GNUNET_TUN_ICMPTYPE_ROUTER_SOLICITATION 10
674 #define GNUNET_TUN_ICMPTYPE_TIME_EXCEEDED 11
675 
676 #define GNUNET_TUN_ICMPTYPE6_DESTINATION_UNREACHABLE 1
677 #define GNUNET_TUN_ICMPTYPE6_PACKET_TOO_BIG 2
678 #define GNUNET_TUN_ICMPTYPE6_TIME_EXCEEDED 3
679 #define GNUNET_TUN_ICMPTYPE6_PARAMETER_PROBLEM 4
680 #define GNUNET_TUN_ICMPTYPE6_ECHO_REQUEST 128
681 #define GNUNET_TUN_ICMPTYPE6_ECHO_REPLY 129
682 
683 
688  uint8_t type;
689  uint8_t code;
690  uint16_t crc GNUNET_PACKED;
691 
692  union {
696  struct {
697  uint16_t identifier GNUNET_PACKED;
698  uint16_t sequence_number GNUNET_PACKED;
699  } echo;
700 
704  struct ih_pmtu {
705  uint16_t empty GNUNET_PACKED;
706  uint16_t next_hop_mtu GNUNET_PACKED;
707  /* followed by original IP header + first 8 bytes of original IP datagram
708  */
709  } destination_unreachable;
710 
714  struct in_addr redirect_gateway_address;
715 
719  uint32_t packet_too_big_mtu GNUNET_PACKED;
720  } quench;
721 };
722 
723 
725 
726 
737 void
739  uint8_t protocol,
740  uint16_t payload_length,
741  const struct in_addr *src,
742  const struct in_addr *dst);
743 
744 
755 void
757  uint8_t protocol,
758  uint16_t payload_length,
759  const struct in6_addr *src,
760  const struct in6_addr *dst);
761 
770 void
772  struct GNUNET_TUN_TcpHeader *tcp,
773  const void *payload,
774  uint16_t payload_length);
775 
784 void
786  struct GNUNET_TUN_TcpHeader *tcp,
787  const void *payload,
788  uint16_t payload_length);
789 
798 void
800  struct GNUNET_TUN_UdpHeader *udp,
801  const void *payload,
802  uint16_t payload_length);
803 
804 
813 void
815  struct GNUNET_TUN_UdpHeader *udp,
816  const void *payload,
817  uint16_t payload_length);
818 
819 
827 void
829  const void *payload,
830  uint16_t payload_length);
831 
832 
841 void
842 GNUNET_TUN_ipv4toregexsearch(const struct in_addr *ip,
843  uint16_t port,
844  char *rxstr);
845 
846 
855 void
856 GNUNET_TUN_ipv6toregexsearch(const struct in6_addr *ipv6,
857  uint16_t port,
858  char *rxstr);
859 
860 
870 char *
871 GNUNET_TUN_ipv6policy2regex(const char *policy);
872 
873 
883 char *
884 GNUNET_TUN_ipv4policy2regex(const char *policy);
885 
886 
895 void
897  struct GNUNET_HashCode *hc);
898 
899 
908 int
909 GNUNET_TUN_sockaddr_cmp(const struct sockaddr *sa,
910  const struct sockaddr *sb,
911  int include_port);
912 
913 
923 void
925  uint16_t ip_port,
926  struct GNUNET_HashCode *cadet_port);
927 
928 #endif
929  /* end of group */
static const struct GNUNET_CRYPTO_EcdsaPrivateKey zero
Public key of all zeros.
unsigned int header_length
unsigned int zero
Always zero.
Payload of GNS VPN record.
static int udp
Option -u: UDP requested.
Definition: gnunet-vpn.c:76
#define GNUNET_GCC_STRUCT_LAYOUT
gcc-ism to get gcc bitfield layout when compiling with -mms-bitfields
DNS flags (largely RFC 1035 / RFC 2136).
unsigned int traffic_class_l
char * GNUNET_TUN_ipv4policy2regex(const char *policy)
Convert an exit policy to a regular expression.
Definition: regex.c:707
uint16_t proto
Here we get an ETH_P_-number.
uint8_t flags
Flags (SYN, FIN, ACK, etc.)
uint8_t ttl
How many more hops can this packet be forwarded?
unsigned int return_code
See GNUNET_TUN_DNS_RETURN_CODE_ defines.
static void expire(void *cls)
Expire a PooledConnection object.
static int echo
Request echo service.
Definition: gnunet-cadet.c:67
void GNUNET_TUN_ipv4toregexsearch(const struct in_addr *ip, uint16_t port, char *rxstr)
Create a regex in rxstr from the given ip and port.
Definition: regex.c:45
DNS query prefix.
UDP packet header.
Standard IPv4 header.
Payload of DNS CERT record.
uint8_t usage
Certificate usage 0: CA cert 1: Entity cert 2: Trust anchor 3: domain-issued cert.
uint16_t flags
Some flags (unused).
void GNUNET_TUN_calculate_udp4_checksum(const struct GNUNET_TUN_IPv4Header *ip, struct GNUNET_TUN_UdpHeader *udp, const void *payload, uint16_t payload_length)
Calculate IPv4 UDP checksum.
Definition: tun.c:183
uint8_t hop_limit
How many more hops can this packet be forwarded?
void GNUNET_TUN_calculate_tcp6_checksum(const struct GNUNET_TUN_IPv6Header *ip, struct GNUNET_TUN_TcpHeader *tcp, const void *payload, uint16_t payload_length)
Calculate IPv6 TCP checksum.
Definition: tun.c:147
unsigned int recursion_available
Set to 1 if recursion is available (server -> client)
void GNUNET_TUN_initialize_ipv4_header(struct GNUNET_TUN_IPv4Header *ip, uint8_t protocol, uint16_t payload_length, const struct in_addr *src, const struct in_addr *dst)
Initialize an IPv4 header.
Definition: tun.c:46
void GNUNET_TUN_calculate_udp6_checksum(const struct GNUNET_TUN_IPv6Header *ip, struct GNUNET_TUN_UdpHeader *udp, const void *payload, uint16_t payload_length)
Calculate IPv6 UDP checksum.
Definition: tun.c:222
#define GNUNET_NETWORK_STRUCT_BEGIN
Define as empty, GNUNET_PACKED should suffice, but this won&#39;t work on W32.
unsigned int authoritative_answer
Set to 1 if this is an authoritative answer.
General DNS record prefix.
cryptographic primitives for GNUnet
unsigned int authenticated_data
Response has been cryptographically verified, RFC 4035.
unsigned int query_or_response
query:0, response:1
void GNUNET_TUN_calculate_tcp4_checksum(const struct GNUNET_TUN_IPv4Header *ip, struct GNUNET_TUN_TcpHeader *tcp, const void *payload, uint16_t payload_length)
Calculate IPv4 TCP checksum.
Definition: tun.c:109
uint16_t cert_tag
Certificate KeyTag.
uint8_t algorithm
Algorithm.
Payload of DNSSEC TLSA record.
static char * service_name
Option -s: service name (hash to get service descriptor)
Definition: gnunet-vpn.c:51
unsigned int fragmentation_offset
unsigned int recursion_desired
Set to 1 if recursion is desired (client -> server)
void GNUNET_TUN_service_name_to_hash(const char *service_name, struct GNUNET_HashCode *hc)
Hash the service name of a hosted service to the hash code that is used to identify the service on th...
Definition: regex.c:812
unsigned int message_truncated
Set to 1 if message is truncated.
unsigned int opcode
See GNUNET_TUN_DNS_OPCODE_ defines.
A 512-bit hashcode.
Header from Linux TUN interface.
uint8_t next_header
For example, IPPROTO_UDP or IPPROTO_TCP.
void GNUNET_TUN_ipv6toregexsearch(const struct in6_addr *ipv6, uint16_t port, char *rxstr)
Create a regex in rxstr from the given ipv6 and port.
Definition: regex.c:66
int GNUNET_TUN_sockaddr_cmp(const struct sockaddr *sa, const struct sockaddr *sb, int include_port)
Check if two sockaddrs are equal.
Definition: tun.c:284
unsigned int reserved
Reserved.
void GNUNET_TUN_compute_service_cadet_port(const struct GNUNET_HashCode *desc, uint16_t ip_port, struct GNUNET_HashCode *cadet_port)
Compute the CADET port given a service descriptor (returned from GNUNET_TUN_service_name_to_hash) and...
Definition: regex.c:831
uint16_t proto
The protocol to use.
struct GNUNET_TESTBED_Peer * peer
The peer associated with this model.
uint16_t cert_type
Certificate type.
uint8_t matching_type
Matching type (of selected content) 0: exact match 1: SHA-256 hash 2: SHA-512 hash.
void GNUNET_TUN_calculate_icmp_checksum(struct GNUNET_TUN_IcmpHeader *icmp, const void *payload, uint16_t payload_length)
Calculate ICMP checksum.
Definition: tun.c:260
TCP packet header.
static unsigned long long payload
How much data are we currently storing in the database?
static int tcp
Option -t: TCP requested.
Definition: gnunet-vpn.c:71
Standard IPv6 header.
uint8_t protocol
L4-protocol, for example, IPPROTO_UDP or IPPROTO_TCP.
#define GNUNET_NETWORK_STRUCT_END
Define as empty, GNUNET_PACKED should suffice, but this won&#39;t work on W32;.
uint8_t selector
Selector What part will be matched against the cert presented by server 0: Full cert (in binary) 1: F...
Payload of DNS SRV record (header).
The identity of the host (wraps the signing key of the peer).
#define GNUNET_PACKED
gcc-ism to get packed structs.
static uint16_t port
Port number.
Definition: gnunet-bcd.c:81
unsigned int traffic_class_h
char * GNUNET_TUN_ipv6policy2regex(const char *policy)
Convert an exit policy to a regular expression.
Definition: regex.c:759
static struct GNUNET_CADET_Port * cadet_port
Listen port for incoming requests.
Payload of DNS SOA record (header).
enum GNUNET_TESTBED_UnderlayLinkModelType type
the type of this model
commonly used definitions; globals in this file are exempt from the rule that the module name ("commo...
static unsigned long long reserved
How much space have we currently reserved?
unsigned int off
Number of 32-bit words in TCP header.
void GNUNET_TUN_initialize_ipv6_header(struct GNUNET_TUN_IPv6Header *ip, uint8_t protocol, uint16_t payload_length, const struct in6_addr *src, const struct in6_addr *dst)
Initialize an IPv6 header.
Definition: tun.c:81
unsigned int checking_disabled
See RFC 4035.
uint16_t len
length of data (which is always a uint32_t, but presumably this can be used to specify that fewer byt...
static int ipv6
Option -6: IPv6 requested.
Definition: gnunet-vpn.c:66