GNUnet  0.19.2
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 
21 #if !defined (__GNUNET_UTIL_LIB_H_INSIDE__)
22 #error "Only <gnunet_util_lib.h> can be included directly."
23 #endif
24 
41 #ifndef GNUNET_TUN_LIB_H
42 #define GNUNET_TUN_LIB_H
43 
44 
45 /* see http://www.iana.org/assignments/ethernet-numbers */
46 #ifndef ETH_P_IPV4
50 #define ETH_P_IPV4 0x0800
51 #endif
52 
53 #ifndef ETH_P_IPV6
57 #define ETH_P_IPV6 0x86DD
58 #endif
59 
60 
68 #define GNUNET_TUN_IPV4_REGEXLEN 16
69 
70 
77 #define GNUNET_TUN_IPV6_REGEXLEN 40
78 
79 
81 
86 {
90  uint16_t flags GNUNET_PACKED;
91 
95  uint16_t proto GNUNET_PACKED;
96 };
97 
98 
103 {
104 #if __BYTE_ORDER == __LITTLE_ENDIAN
105  unsigned int header_length : 4 GNUNET_PACKED;
106  unsigned int version : 4 GNUNET_PACKED;
107 #elif __BYTE_ORDER == __BIG_ENDIAN
108  unsigned int version : 4 GNUNET_PACKED;
109  unsigned int header_length : 4 GNUNET_PACKED;
110 #else
111 #error byteorder undefined
112 #endif
113  uint8_t diff_serv;
114 
119 
124 
125  unsigned int flags : 3 GNUNET_PACKED;
126 
128 
132  uint8_t ttl;
133 
137  uint8_t protocol;
138 
143 
147  struct in_addr source_address;
148 
152  struct in_addr destination_address;
154 
155 
160 {
161 #if __BYTE_ORDER == __LITTLE_ENDIAN
162  unsigned int traffic_class_h : 4 GNUNET_PACKED;
163  unsigned int version : 4 GNUNET_PACKED;
164  unsigned int traffic_class_l : 4 GNUNET_PACKED;
165  unsigned int flow_label : 20 GNUNET_PACKED;
166 #elif __BYTE_ORDER == __BIG_ENDIAN
167  unsigned int version : 4 GNUNET_PACKED;
168  unsigned int traffic_class : 8 GNUNET_PACKED;
169  unsigned int flow_label : 20 GNUNET_PACKED;
170 #else
171 #error byteorder undefined
172 #endif
177 
181  uint8_t next_header;
182 
186  uint8_t hop_limit;
187 
191  struct in6_addr source_address GNUNET_PACKED;
192 
196  struct in6_addr destination_address GNUNET_PACKED;
198 
199 
203 #define GNUNET_TUN_TCP_FLAGS_FIN 1
204 #define GNUNET_TUN_TCP_FLAGS_SYN 2
205 #define GNUNET_TUN_TCP_FLAGS_RST 4
206 #define GNUNET_TUN_TCP_FLAGS_PSH 8
207 #define GNUNET_TUN_TCP_FLAGS_ACK 16
208 #define GNUNET_TUN_TCP_FLAGS_URG 32
209 #define GNUNET_TUN_TCP_FLAGS_ECE 64
210 #define GNUNET_TUN_TCP_FLAGS_CWR 128
211 
216 {
221 
226 
230  uint32_t seq GNUNET_PACKED;
231 
235  uint32_t ack GNUNET_PACKED;
236 #if __BYTE_ORDER == __LITTLE_ENDIAN
240  unsigned int reserved : 4 GNUNET_PACKED;
244  unsigned int off : 4 GNUNET_PACKED;
245 #elif __BYTE_ORDER == __BIG_ENDIAN
249  unsigned int off : 4 GNUNET_PACKED;
253  unsigned int reserved : 4 GNUNET_PACKED;
254 #else
255 #error byteorder undefined
256 #endif
257 
261  uint8_t flags;
262 
267 
271  uint16_t crc GNUNET_PACKED;
272 
278 
279 
284 {
289 
294 
298  uint16_t len GNUNET_PACKED;
299 
303  uint16_t crc GNUNET_PACKED;
304 };
305 
306 
311 #define GNUNET_TUN_DNS_CLASS_INTERNET 1
312 #define GNUNET_TUN_DNS_CLASS_CHAOS 3
313 #define GNUNET_TUN_DNS_CLASS_HESIOD 4
314 
315 #define GNUNET_TUN_DNS_OPCODE_QUERY 0
316 #define GNUNET_TUN_DNS_OPCODE_INVERSE_QUERY 1
317 #define GNUNET_TUN_DNS_OPCODE_STATUS 2
318 
319 
323 #define GNUNET_TUN_DNS_RETURN_CODE_NO_ERROR 0
324 #define GNUNET_TUN_DNS_RETURN_CODE_FORMAT_ERROR 1
325 #define GNUNET_TUN_DNS_RETURN_CODE_SERVER_FAILURE 2
326 #define GNUNET_TUN_DNS_RETURN_CODE_NAME_ERROR 3
327 #define GNUNET_TUN_DNS_RETURN_CODE_NOT_IMPLEMENTED 4
328 #define GNUNET_TUN_DNS_RETURN_CODE_REFUSED 5
329 
333 #define GNUNET_TUN_DNS_RETURN_CODE_YXDOMAIN 6
334 #define GNUNET_TUN_DNS_RETURN_CODE_YXRRSET 7
335 #define GNUNET_TUN_DNS_RETURN_CODE_NXRRSET 8
336 #define GNUNET_TUN_DNS_RETURN_CODE_NOT_AUTH 9
337 #define GNUNET_TUN_DNS_RETURN_CODE_NOT_ZONE 10
338 
339 
344 {
345 #if __BYTE_ORDER == __LITTLE_ENDIAN
350 
355 
360 
364  unsigned int opcode : 4 GNUNET_PACKED;
365 
370 
374  unsigned int return_code : 4 GNUNET_PACKED;
375 
380 
385 
389  unsigned int zero : 1 GNUNET_PACKED;
390 
395 #elif __BYTE_ORDER == __BIG_ENDIAN
399  unsigned int query_or_response : 1 GNUNET_PACKED;
400 
404  unsigned int opcode : 4 GNUNET_PACKED;
405 
409  unsigned int authoritative_answer : 1 GNUNET_PACKED;
410 
414  unsigned int message_truncated : 1 GNUNET_PACKED;
415 
419  unsigned int recursion_desired : 1 GNUNET_PACKED;
420 
421 
425  unsigned int recursion_available : 1 GNUNET_PACKED;
426 
430  unsigned int zero : 1 GNUNET_PACKED;
431 
435  unsigned int authenticated_data : 1 GNUNET_PACKED;
436 
440  unsigned int checking_disabled : 1 GNUNET_PACKED;
441 
445  unsigned int return_code : 4 GNUNET_PACKED;
446 #else
447 #error byteorder undefined
448 #endif
450 
451 
456 {
460  uint16_t id GNUNET_PACKED;
461 
465  struct GNUNET_TUN_DnsFlags flags;
466 
471 
476 
481 
486 };
487 
488 
493 {
498 
503 
509 
515 
521 };
522 
523 
528 {
534  uint16_t prio GNUNET_PACKED;
535 
542 
546  uint16_t port GNUNET_PACKED;
547 
548  /* followed by 'target' name */
549 };
550 
551 
556 {
560  uint16_t cert_type;
561 
565  uint16_t cert_tag;
566 
570  uint8_t algorithm;
571 
572  /* Followed by the certificate */
573 };
574 
575 
581 {
589  uint8_t usage;
590 
598  uint8_t selector;
599 
606  uint8_t matching_type;
607 
619 };
620 
621 
626 {
630  struct GNUNET_PeerIdentity peer;
631 
635  uint16_t proto;
636 
637  /* followed by the servicename */
638 };
639 
640 
645 {
649  uint16_t type GNUNET_PACKED;
650 
655 };
656 
657 
662 {
666  uint16_t type GNUNET_PACKED;
667 
672 
676  uint32_t ttl GNUNET_PACKED;
677 
682 };
683 
684 
685 #define GNUNET_TUN_ICMPTYPE_ECHO_REPLY 0
686 #define GNUNET_TUN_ICMPTYPE_DESTINATION_UNREACHABLE 3
687 #define GNUNET_TUN_ICMPTYPE_SOURCE_QUENCH 4
688 #define GNUNET_TUN_ICMPTYPE_REDIRECT_MESSAGE 5
689 #define GNUNET_TUN_ICMPTYPE_ECHO_REQUEST 8
690 #define GNUNET_TUN_ICMPTYPE_ROUTER_ADVERTISEMENT 9
691 #define GNUNET_TUN_ICMPTYPE_ROUTER_SOLICITATION 10
692 #define GNUNET_TUN_ICMPTYPE_TIME_EXCEEDED 11
693 
694 #define GNUNET_TUN_ICMPTYPE6_DESTINATION_UNREACHABLE 1
695 #define GNUNET_TUN_ICMPTYPE6_PACKET_TOO_BIG 2
696 #define GNUNET_TUN_ICMPTYPE6_TIME_EXCEEDED 3
697 #define GNUNET_TUN_ICMPTYPE6_PARAMETER_PROBLEM 4
698 #define GNUNET_TUN_ICMPTYPE6_ECHO_REQUEST 128
699 #define GNUNET_TUN_ICMPTYPE6_ECHO_REPLY 129
700 
701 
706 {
707  uint8_t type;
708  uint8_t code;
709  uint16_t crc GNUNET_PACKED;
710 
711  union
712  {
716  struct
717  {
720  } echo;
721 
725  struct ih_pmtu
726  {
729  /* followed by original IP header + first 8 bytes of original IP datagram
730  */
732 
736  struct in_addr redirect_gateway_address;
737 
743 };
744 
745 
747 
748 
759 void
761  uint8_t protocol,
762  uint16_t payload_length,
763  const struct in_addr *src,
764  const struct in_addr *dst);
765 
766 
777 void
779  uint8_t protocol,
780  uint16_t payload_length,
781  const struct in6_addr *src,
782  const struct in6_addr *dst);
783 
792 void
794  struct GNUNET_TUN_TcpHeader *tcp,
795  const void *payload,
796  uint16_t payload_length);
797 
806 void
808  struct GNUNET_TUN_TcpHeader *tcp,
809  const void *payload,
810  uint16_t payload_length);
811 
820 void
822  struct GNUNET_TUN_UdpHeader *udp,
823  const void *payload,
824  uint16_t payload_length);
825 
826 
835 void
837  struct GNUNET_TUN_UdpHeader *udp,
838  const void *payload,
839  uint16_t payload_length);
840 
841 
849 void
851  const void *payload,
852  uint16_t payload_length);
853 
854 
863 void
864 GNUNET_TUN_ipv4toregexsearch (const struct in_addr *ip,
865  uint16_t port,
866  char *rxstr);
867 
868 
877 void
878 GNUNET_TUN_ipv6toregexsearch (const struct in6_addr *ipv6,
879  uint16_t port,
880  char *rxstr);
881 
882 
892 char *
893 GNUNET_TUN_ipv6policy2regex (const char *policy);
894 
895 
905 char *
906 GNUNET_TUN_ipv4policy2regex (const char *policy);
907 
908 
917 void
919  struct GNUNET_HashCode *hc);
920 
921 
930 int
931 GNUNET_TUN_sockaddr_cmp (const struct sockaddr *sa,
932  const struct sockaddr *sb,
933  int include_port);
934 
935 
945 void
947  uint16_t ip_port,
948  struct GNUNET_HashCode *cadet_port);
949 
950 #endif
951  /* end of group */
953  /* end of group addition */
static uint16_t port
Port number.
Definition: gnunet-bcd.c:147
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:50
static int udp
Option -u: UDP requested.
Definition: gnunet-vpn.c:75
static int ipv6
Option -6: IPv6 requested.
Definition: gnunet-vpn.c:65
static int tcp
Option -t: TCP requested.
Definition: gnunet-vpn.c:70
#define GNUNET_NETWORK_STRUCT_BEGIN
Define as empty, GNUNET_PACKED should suffice, but this won't work on W32.
#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.
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:82
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:50
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:160
GNUNET_NETWORK_STRUCT_END 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:47
void GNUNET_TUN_calculate_icmp_checksum(struct GNUNET_TUN_IcmpHeader *icmp, const void *payload, uint16_t payload_length)
Calculate ICMP checksum.
Definition: tun.c:222
char * GNUNET_TUN_ipv4policy2regex(const char *policy)
Convert an exit policy to a regular expression.
Definition: regex.c:682
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:791
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:132
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:772
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:246
struct GNUNET_TUN_IPv4Header GNUNET_GCC_STRUCT_LAYOUT
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:102
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:37
char * GNUNET_TUN_ipv6policy2regex(const char *policy)
Convert an exit policy to a regular expression.
Definition: regex.c:725
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:191
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).