GNUnet  0.11.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
46 #define ETH_P_IPV4 0x0800
47 #endif
48 
49 #ifndef ETH_P_IPV6
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 
82 {
86  uint16_t flags GNUNET_PACKED;
87 
91  uint16_t proto GNUNET_PACKED;
92 };
93 
94 
99 {
100 #if __BYTE_ORDER == __LITTLE_ENDIAN
101  unsigned int header_length : 4 GNUNET_PACKED;
102  unsigned int version : 4 GNUNET_PACKED;
103 #elif __BYTE_ORDER == __BIG_ENDIAN
104  unsigned int version : 4 GNUNET_PACKED;
105  unsigned int header_length : 4 GNUNET_PACKED;
106 #else
107 #error byteorder undefined
108 #endif
109  uint8_t diff_serv;
110 
115 
120 
121  unsigned int flags : 3 GNUNET_PACKED;
122 
124 
128  uint8_t ttl;
129 
133  uint8_t protocol;
134 
139 
143  struct in_addr source_address;
144 
148  struct in_addr destination_address;
150 
151 
156 {
157 #if __BYTE_ORDER == __LITTLE_ENDIAN
158  unsigned int traffic_class_h : 4 GNUNET_PACKED;
159  unsigned int version : 4 GNUNET_PACKED;
160  unsigned int traffic_class_l : 4 GNUNET_PACKED;
161  unsigned int flow_label : 20 GNUNET_PACKED;
162 #elif __BYTE_ORDER == __BIG_ENDIAN
163  unsigned int version : 4 GNUNET_PACKED;
164  unsigned int traffic_class : 8 GNUNET_PACKED;
165  unsigned int flow_label : 20 GNUNET_PACKED;
166 #else
167 #error byteorder undefined
168 #endif
173 
177  uint8_t next_header;
178 
182  uint8_t hop_limit;
183 
187  struct in6_addr source_address GNUNET_PACKED;
188 
192  struct in6_addr destination_address GNUNET_PACKED;
194 
195 
199 #define GNUNET_TUN_TCP_FLAGS_FIN 1
200 #define GNUNET_TUN_TCP_FLAGS_SYN 2
201 #define GNUNET_TUN_TCP_FLAGS_RST 4
202 #define GNUNET_TUN_TCP_FLAGS_PSH 8
203 #define GNUNET_TUN_TCP_FLAGS_ACK 16
204 #define GNUNET_TUN_TCP_FLAGS_URG 32
205 #define GNUNET_TUN_TCP_FLAGS_ECE 64
206 #define GNUNET_TUN_TCP_FLAGS_CWR 128
207 
212 {
217 
222 
226  uint32_t seq GNUNET_PACKED;
227 
231  uint32_t ack GNUNET_PACKED;
232 #if __BYTE_ORDER == __LITTLE_ENDIAN
236  unsigned int reserved : 4 GNUNET_PACKED;
240  unsigned int off : 4 GNUNET_PACKED;
241 #elif __BYTE_ORDER == __BIG_ENDIAN
245  unsigned int off : 4 GNUNET_PACKED;
249  unsigned int reserved : 4 GNUNET_PACKED;
250 #else
251 #error byteorder undefined
252 #endif
253 
257  uint8_t flags;
258 
263 
267  uint16_t crc GNUNET_PACKED;
268 
274 
275 
280 {
285 
290 
294  uint16_t len GNUNET_PACKED;
295 
299  uint16_t crc GNUNET_PACKED;
300 };
301 
302 
307 #define GNUNET_TUN_DNS_CLASS_INTERNET 1
308 #define GNUNET_TUN_DNS_CLASS_CHAOS 3
309 #define GNUNET_TUN_DNS_CLASS_HESIOD 4
310 
311 #define GNUNET_TUN_DNS_OPCODE_QUERY 0
312 #define GNUNET_TUN_DNS_OPCODE_INVERSE_QUERY 1
313 #define GNUNET_TUN_DNS_OPCODE_STATUS 2
314 
315 
319 #define GNUNET_TUN_DNS_RETURN_CODE_NO_ERROR 0
320 #define GNUNET_TUN_DNS_RETURN_CODE_FORMAT_ERROR 1
321 #define GNUNET_TUN_DNS_RETURN_CODE_SERVER_FAILURE 2
322 #define GNUNET_TUN_DNS_RETURN_CODE_NAME_ERROR 3
323 #define GNUNET_TUN_DNS_RETURN_CODE_NOT_IMPLEMENTED 4
324 #define GNUNET_TUN_DNS_RETURN_CODE_REFUSED 5
325 
329 #define GNUNET_TUN_DNS_RETURN_CODE_YXDOMAIN 6
330 #define GNUNET_TUN_DNS_RETURN_CODE_YXRRSET 7
331 #define GNUNET_TUN_DNS_RETURN_CODE_NXRRSET 8
332 #define GNUNET_TUN_DNS_RETURN_CODE_NOT_AUTH 9
333 #define GNUNET_TUN_DNS_RETURN_CODE_NOT_ZONE 10
334 
335 
340 {
341 #if __BYTE_ORDER == __LITTLE_ENDIAN
346 
351 
356 
360  unsigned int opcode : 4 GNUNET_PACKED;
361 
366 
370  unsigned int return_code : 4 GNUNET_PACKED;
371 
376 
381 
385  unsigned int zero : 1 GNUNET_PACKED;
386 
391 #elif __BYTE_ORDER == __BIG_ENDIAN
395  unsigned int query_or_response : 1 GNUNET_PACKED;
396 
400  unsigned int opcode : 4 GNUNET_PACKED;
401 
405  unsigned int authoritative_answer : 1 GNUNET_PACKED;
406 
410  unsigned int message_truncated : 1 GNUNET_PACKED;
411 
415  unsigned int recursion_desired : 1 GNUNET_PACKED;
416 
417 
421  unsigned int recursion_available : 1 GNUNET_PACKED;
422 
426  unsigned int zero : 1 GNUNET_PACKED;
427 
431  unsigned int authenticated_data : 1 GNUNET_PACKED;
432 
436  unsigned int checking_disabled : 1 GNUNET_PACKED;
437 
441  unsigned int return_code : 4 GNUNET_PACKED;
442 #else
443 #error byteorder undefined
444 #endif
446 
447 
452 {
456  uint16_t id GNUNET_PACKED;
457 
461  struct GNUNET_TUN_DnsFlags flags;
462 
467 
472 
477 
482 };
483 
484 
489 {
494 
499 
505 
511 
517 };
518 
519 
524 {
530  uint16_t prio GNUNET_PACKED;
531 
538 
542  uint16_t port GNUNET_PACKED;
543 
544  /* followed by 'target' name */
545 };
546 
547 
552 {
556  uint16_t cert_type;
557 
561  uint16_t cert_tag;
562 
566  uint8_t algorithm;
567 
568  /* Followed by the certificate */
569 };
570 
571 
577 {
585  uint8_t usage;
586 
594  uint8_t selector;
595 
602  uint8_t matching_type;
603 
615 };
616 
617 
622 {
626  struct GNUNET_PeerIdentity peer;
627 
631  uint16_t proto;
632 
633  /* followed by the servicename */
634 };
635 
636 
641 {
645  uint16_t type GNUNET_PACKED;
646 
651 };
652 
653 
658 {
662  uint16_t type GNUNET_PACKED;
663 
668 
672  uint32_t ttl GNUNET_PACKED;
673 
678 };
679 
680 
681 #define GNUNET_TUN_ICMPTYPE_ECHO_REPLY 0
682 #define GNUNET_TUN_ICMPTYPE_DESTINATION_UNREACHABLE 3
683 #define GNUNET_TUN_ICMPTYPE_SOURCE_QUENCH 4
684 #define GNUNET_TUN_ICMPTYPE_REDIRECT_MESSAGE 5
685 #define GNUNET_TUN_ICMPTYPE_ECHO_REQUEST 8
686 #define GNUNET_TUN_ICMPTYPE_ROUTER_ADVERTISEMENT 9
687 #define GNUNET_TUN_ICMPTYPE_ROUTER_SOLICITATION 10
688 #define GNUNET_TUN_ICMPTYPE_TIME_EXCEEDED 11
689 
690 #define GNUNET_TUN_ICMPTYPE6_DESTINATION_UNREACHABLE 1
691 #define GNUNET_TUN_ICMPTYPE6_PACKET_TOO_BIG 2
692 #define GNUNET_TUN_ICMPTYPE6_TIME_EXCEEDED 3
693 #define GNUNET_TUN_ICMPTYPE6_PARAMETER_PROBLEM 4
694 #define GNUNET_TUN_ICMPTYPE6_ECHO_REQUEST 128
695 #define GNUNET_TUN_ICMPTYPE6_ECHO_REPLY 129
696 
697 
702 {
703  uint8_t type;
704  uint8_t code;
705  uint16_t crc GNUNET_PACKED;
706 
707  union
708  {
712  struct
713  {
716  } echo;
717 
721  struct ih_pmtu
722  {
725  /* followed by original IP header + first 8 bytes of original IP datagram
726  */
728 
732  struct in_addr redirect_gateway_address;
733 
739 };
740 
741 
743 
744 
755 void
757  uint8_t protocol,
758  uint16_t payload_length,
759  const struct in_addr *src,
760  const struct in_addr *dst);
761 
762 
773 void
775  uint8_t protocol,
776  uint16_t payload_length,
777  const struct in6_addr *src,
778  const struct in6_addr *dst);
779 
788 void
790  struct GNUNET_TUN_TcpHeader *tcp,
791  const void *payload,
792  uint16_t payload_length);
793 
802 void
804  struct GNUNET_TUN_TcpHeader *tcp,
805  const void *payload,
806  uint16_t payload_length);
807 
816 void
818  struct GNUNET_TUN_UdpHeader *udp,
819  const void *payload,
820  uint16_t payload_length);
821 
822 
831 void
833  struct GNUNET_TUN_UdpHeader *udp,
834  const void *payload,
835  uint16_t payload_length);
836 
837 
845 void
847  const void *payload,
848  uint16_t payload_length);
849 
850 
859 void
860 GNUNET_TUN_ipv4toregexsearch (const struct in_addr *ip,
861  uint16_t port,
862  char *rxstr);
863 
864 
873 void
874 GNUNET_TUN_ipv6toregexsearch (const struct in6_addr *ipv6,
875  uint16_t port,
876  char *rxstr);
877 
878 
888 char *
889 GNUNET_TUN_ipv6policy2regex (const char *policy);
890 
891 
901 char *
902 GNUNET_TUN_ipv4policy2regex (const char *policy);
903 
904 
913 void
915  struct GNUNET_HashCode *hc);
916 
917 
926 int
927 GNUNET_TUN_sockaddr_cmp (const struct sockaddr *sa,
928  const struct sockaddr *sb,
929  int include_port);
930 
931 
941 void
943  uint16_t ip_port,
944  struct GNUNET_HashCode *cadet_port);
945 
946 #endif
947  /* end of group */
static uint16_t port
Port number.
Definition: gnunet-bcd.c:83
static unsigned long long payload
How much data are we currently storing in the database?
static struct GNUNET_CADET_Port * cadet_port
Listen port for incoming requests.
static char * service_name
Option -s: service name (hash to get service descriptor)
Definition: gnunet-vpn.c:51
static int udp
Option -u: UDP requested.
Definition: gnunet-vpn.c:76
static int ipv6
Option -6: IPv6 requested.
Definition: gnunet-vpn.c:66
static int tcp
Option -t: TCP requested.
Definition: gnunet-vpn.c:71
commonly used definitions; globals in this file are exempt from the rule that the module name ("commo...
#define GNUNET_NETWORK_STRUCT_BEGIN
Define as empty, GNUNET_PACKED should suffice, but this won't work on W32.
#define GNUNET_GCC_STRUCT_LAYOUT
gcc-ism to get gcc bitfield layout when compiling with -mms-bitfields
#define GNUNET_NETWORK_STRUCT_END
Define as empty, GNUNET_PACKED should suffice, but this won't work on W32;.
#define GNUNET_PACKED
gcc-ism to get packed structs.
cryptographic primitives for GNUnet
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
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
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
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
char * GNUNET_TUN_ipv4policy2regex(const char *policy)
Convert an exit policy to a regular expression.
Definition: regex.c:707
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:833
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
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_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:814
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
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
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
char * GNUNET_TUN_ipv6policy2regex(const char *policy)
Convert an exit policy to a regular expression.
Definition: regex.c:759
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
A 512-bit hashcode.
The identity of the host (wraps the signing key of the peer).
Payload of DNS CERT record.
uint16_t cert_type
Certificate type.
uint16_t cert_tag
Certificate KeyTag.
uint8_t algorithm
Algorithm.
DNS flags (largely RFC 1035 / RFC 2136).
unsigned int checking_disabled
See RFC 4035.
unsigned int zero
Always zero.
unsigned int message_truncated
Set to 1 if message is truncated.
unsigned int query_or_response
query:0, response:1
unsigned int return_code
See GNUNET_TUN_DNS_RETURN_CODE_ defines.
unsigned int recursion_available
Set to 1 if recursion is available (server -> client)
unsigned int opcode
See GNUNET_TUN_DNS_OPCODE_ defines.
unsigned int recursion_desired
Set to 1 if recursion is desired (client -> server)
unsigned int authenticated_data
Response has been cryptographically verified, RFC 4035.
unsigned int authoritative_answer
Set to 1 if this is an authoritative answer.
struct GNUNET_TUN_DnsFlags flags
Flags.
uint16_t query_count
Number of queries.
uint16_t authority_rcount
Number of authoritative answers.
uint16_t additional_rcount
Number of additional records.
uint16_t answer_rcount
Number of answers.
DNS query prefix.
uint16_t type
Desired type (GNUNET_DNSPARSER_TYPE_XXX).
uint16_t dns_traffic_class
Desired class (usually GNUNET_TUN_DNS_CLASS_INTERNET).
General DNS record prefix.
uint32_t ttl
Expiration for the record (in seconds).
uint16_t dns_traffic_class
Record class (usually GNUNET_TUN_DNS_CLASS_INTERNET).
uint16_t type
Record type (GNUNET_DNSPARSER_TYPE_XXX).
uint16_t data_len
Number of bytes of data that follow.
Payload of DNS SOA record (header).
uint32_t minimum
The bit minimum TTL field that should be exported with any RR from this zone.
uint32_t expire
Time value that specifies the upper limit on the time interval that can elapse before the zone is no ...
uint32_t refresh
Time interval before the zone should be refreshed.
uint32_t serial
The version number of the original copy of the zone.
uint32_t retry
Time interval that should elapse before a failed refresh should be retried.
Payload of DNS SRV record (header).
uint16_t prio
Preference for this entry (lower value is higher preference).
uint16_t weight
Relative weight for records with the same priority.
uint16_t port
TCP or UDP port of the service.
Payload of DNSSEC TLSA record.
uint8_t selector
Selector What part will be matched against the cert presented by server 0: Full cert (in binary) 1: F...
uint8_t matching_type
Matching type (of selected content) 0: exact match 1: SHA-256 hash 2: SHA-512 hash.
uint8_t usage
Certificate usage 0: CA cert 1: Entity cert 2: Trust anchor 3: domain-issued cert.
Payload of GNS VPN record.
struct GNUNET_PeerIdentity peer
The peer to contact.
uint16_t proto
The protocol to use.
Standard IPv4 header.
uint16_t total_length
Length of the packet, including this header.
uint8_t ttl
How many more hops can this packet be forwarded?
uint8_t protocol
L4-protocol, for example, IPPROTO_UDP or IPPROTO_TCP.
uint16_t checksum
Checksum.
uint16_t identification
Unique random ID for matching up fragments.
unsigned int fragmentation_offset
struct in_addr source_address
Origin of the packet.
struct in_addr destination_address
Destination of the packet.
unsigned int header_length
Standard IPv6 header.
unsigned int traffic_class_h
struct in6_addr source_address
Origin of the packet.
unsigned int traffic_class_l
uint8_t next_header
For example, IPPROTO_UDP or IPPROTO_TCP.
uint8_t hop_limit
How many more hops can this packet be forwarded?
struct in6_addr destination_address
Destination of the packet.
uint16_t payload_length
Length of the payload, excluding this header.
union GNUNET_TUN_IcmpHeader::@50 quench
uint32_t packet_too_big_mtu
MTU for packets that are too big (IPv6).
struct in_addr redirect_gateway_address
ICMP Redirect.
struct GNUNET_TUN_IcmpHeader::@50::ih_pmtu destination_unreachable
struct GNUNET_TUN_IcmpHeader::@50::@51 echo
ICMP Echo (request/reply)
Header from Linux TUN interface.
uint16_t proto
Here we get an ETH_P_-number.
uint16_t flags
Some flags (unused).
TCP packet header.
uint32_t seq
Sequence number.
uint16_t source_port
Source port (in NBO).
unsigned int reserved
Reserved.
uint16_t window_size
Window size.
uint16_t crc
Checksum.
uint32_t ack
Acknowledgement number.
uint16_t urgent_pointer
Urgent pointer.
unsigned int off
Number of 32-bit words in TCP header.
uint16_t destination_port
Destination port (in NBO).
uint8_t flags
Flags (SYN, FIN, ACK, etc.)
UDP packet header.
uint16_t len
Number of bytes of payload.
uint16_t crc
Checksum.
uint16_t destination_port
Destination port (in NBO).
uint16_t source_port
Source port (in NBO).