GNUnet 0.21.1

Standard TCP/IP network structs and IP checksum calculations for TUN interaction. More...

Collaboration diagram for TUN library:

Data Structures

struct  GNUNET_TUN_Layer2PacketHeader
 Header from Linux TUN interface. More...
 
struct  GNUNET_TUN_IPv4Header
 Standard IPv4 header. More...
 
struct  GNUNET_TUN_IPv6Header
 Standard IPv6 header. More...
 
struct  GNUNET_TUN_TcpHeader
 TCP packet header. More...
 
struct  GNUNET_TUN_UdpHeader
 UDP packet header. More...
 
struct  GNUNET_TUN_DnsFlags
 DNS flags (largely RFC 1035 / RFC 2136). More...
 
struct  GNUNET_TUN_DnsHeader
 DNS header. More...
 
struct  GNUNET_TUN_DnsSoaRecord
 Payload of DNS SOA record (header). More...
 
struct  GNUNET_TUN_DnsSrvRecord
 Payload of DNS SRV record (header). More...
 
struct  GNUNET_TUN_DnsUriRecord
 Payload of DNS URI record (header). More...
 
struct  GNUNET_TUN_DnsCertRecord
 Payload of DNS CERT record. More...
 
struct  GNUNET_TUN_DnsTlsaRecord
 Payload of DNSSEC TLSA record. More...
 
struct  GNUNET_TUN_GnsVpnRecord
 Payload of GNS VPN record. More...
 
struct  GNUNET_TUN_DnsQueryLine
 DNS query prefix. More...
 
struct  GNUNET_TUN_DnsRecordLine
 General DNS record prefix. More...
 
struct  GNUNET_TUN_IcmpHeader
 ICMP header. More...
 

Macros

#define ETH_P_IPV4   0x0800
 Number for IPv4. More...
 
#define ETH_P_IPV6   0x86DD
 Number for IPv6. More...
 
#define GNUNET_TUN_IPV4_REGEXLEN   16
 Maximum regex string length for use with GNUNET_TUN_ipv4toregexsearch. More...
 
#define GNUNET_TUN_IPV6_REGEXLEN   40
 Maximum regex string length for use with GNUNET_TUN_ipv6toregexsearch. More...
 
#define GNUNET_TUN_TCP_FLAGS_FIN   1
 TCP flags. More...
 
#define GNUNET_TUN_TCP_FLAGS_SYN   2
 
#define GNUNET_TUN_TCP_FLAGS_RST   4
 
#define GNUNET_TUN_TCP_FLAGS_PSH   8
 
#define GNUNET_TUN_TCP_FLAGS_ACK   16
 
#define GNUNET_TUN_TCP_FLAGS_URG   32
 
#define GNUNET_TUN_TCP_FLAGS_ECE   64
 
#define GNUNET_TUN_TCP_FLAGS_CWR   128
 
#define GNUNET_TUN_DNS_CLASS_INTERNET   1
 A few common DNS classes (ok, only one is common, but I list a couple more to make it clear what we're talking about here). More...
 
#define GNUNET_TUN_DNS_CLASS_CHAOS   3
 
#define GNUNET_TUN_DNS_CLASS_HESIOD   4
 
#define GNUNET_TUN_DNS_OPCODE_QUERY   0
 
#define GNUNET_TUN_DNS_OPCODE_INVERSE_QUERY   1
 
#define GNUNET_TUN_DNS_OPCODE_STATUS   2
 
#define GNUNET_TUN_DNS_RETURN_CODE_NO_ERROR   0
 RFC 1035 codes. More...
 
#define GNUNET_TUN_DNS_RETURN_CODE_FORMAT_ERROR   1
 
#define GNUNET_TUN_DNS_RETURN_CODE_SERVER_FAILURE   2
 
#define GNUNET_TUN_DNS_RETURN_CODE_NAME_ERROR   3
 
#define GNUNET_TUN_DNS_RETURN_CODE_NOT_IMPLEMENTED   4
 
#define GNUNET_TUN_DNS_RETURN_CODE_REFUSED   5
 
#define GNUNET_TUN_DNS_RETURN_CODE_YXDOMAIN   6
 RFC 2136 codes. More...
 
#define GNUNET_TUN_DNS_RETURN_CODE_YXRRSET   7
 
#define GNUNET_TUN_DNS_RETURN_CODE_NXRRSET   8
 
#define GNUNET_TUN_DNS_RETURN_CODE_NOT_AUTH   9
 
#define GNUNET_TUN_DNS_RETURN_CODE_NOT_ZONE   10
 
#define GNUNET_TUN_ICMPTYPE_ECHO_REPLY   0
 
#define GNUNET_TUN_ICMPTYPE_DESTINATION_UNREACHABLE   3
 
#define GNUNET_TUN_ICMPTYPE_SOURCE_QUENCH   4
 
#define GNUNET_TUN_ICMPTYPE_REDIRECT_MESSAGE   5
 
#define GNUNET_TUN_ICMPTYPE_ECHO_REQUEST   8
 
#define GNUNET_TUN_ICMPTYPE_ROUTER_ADVERTISEMENT   9
 
#define GNUNET_TUN_ICMPTYPE_ROUTER_SOLICITATION   10
 
#define GNUNET_TUN_ICMPTYPE_TIME_EXCEEDED   11
 
#define GNUNET_TUN_ICMPTYPE6_DESTINATION_UNREACHABLE   1
 
#define GNUNET_TUN_ICMPTYPE6_PACKET_TOO_BIG   2
 
#define GNUNET_TUN_ICMPTYPE6_TIME_EXCEEDED   3
 
#define GNUNET_TUN_ICMPTYPE6_PARAMETER_PROBLEM   4
 
#define GNUNET_TUN_ICMPTYPE6_ECHO_REQUEST   128
 
#define GNUNET_TUN_ICMPTYPE6_ECHO_REPLY   129
 
#define GNUNET_GCC_STRUCT_LAYOUT
 gcc-ism to get gcc bitfield layout when compiling with -mms-bitfields More...
 

Functions

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. More...
 
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. More...
 
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. More...
 
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. More...
 
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. More...
 
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. More...
 
void GNUNET_TUN_calculate_icmp_checksum (struct GNUNET_TUN_IcmpHeader *icmp, const void *payload, uint16_t payload_length)
 Calculate ICMP checksum. More...
 
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. More...
 
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. More...
 
char * GNUNET_TUN_ipv6policy2regex (const char *policy)
 Convert an exit policy to a regular expression. More...
 
char * GNUNET_TUN_ipv4policy2regex (const char *policy)
 Convert an exit policy to a regular expression. More...
 
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 the network. More...
 
int GNUNET_TUN_sockaddr_cmp (const struct sockaddr *sa, const struct sockaddr *sb, int include_port)
 Check if two sockaddrs are equal. More...
 
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 a TCP/UDP port ip_port. More...
 

Variables

struct GNUNET_TUN_IPv4Header GNUNET_GCC_STRUCT_LAYOUT
 

Detailed Description

Standard TCP/IP network structs and IP checksum calculations for TUN interaction.

Macro Definition Documentation

◆ ETH_P_IPV4

#define ETH_P_IPV4   0x0800

Number for IPv4.

Definition at line 50 of file gnunet_tun_lib.h.

◆ ETH_P_IPV6

#define ETH_P_IPV6   0x86DD

Number for IPv6.

Definition at line 57 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_IPV4_REGEXLEN

#define GNUNET_TUN_IPV4_REGEXLEN   16

Maximum regex string length for use with GNUNET_TUN_ipv4toregexsearch.

8 bytes for IPv4, 4 bytes for port, 1 byte for "4", 2 bytes for "-", one byte for 0-termination.

Definition at line 68 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_IPV6_REGEXLEN

#define GNUNET_TUN_IPV6_REGEXLEN   40

Maximum regex string length for use with GNUNET_TUN_ipv6toregexsearch.

32 bytes for IPv4, 4 bytes for port, 1 byte for "4", 2 bytes for "-", one byte for 0-termination.

Definition at line 77 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_TCP_FLAGS_FIN

#define GNUNET_TUN_TCP_FLAGS_FIN   1

TCP flags.

Definition at line 203 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_TCP_FLAGS_SYN

#define GNUNET_TUN_TCP_FLAGS_SYN   2

Definition at line 204 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_TCP_FLAGS_RST

#define GNUNET_TUN_TCP_FLAGS_RST   4

Definition at line 205 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_TCP_FLAGS_PSH

#define GNUNET_TUN_TCP_FLAGS_PSH   8

Definition at line 206 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_TCP_FLAGS_ACK

#define GNUNET_TUN_TCP_FLAGS_ACK   16

Definition at line 207 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_TCP_FLAGS_URG

#define GNUNET_TUN_TCP_FLAGS_URG   32

Definition at line 208 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_TCP_FLAGS_ECE

#define GNUNET_TUN_TCP_FLAGS_ECE   64

Definition at line 209 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_TCP_FLAGS_CWR

#define GNUNET_TUN_TCP_FLAGS_CWR   128

Definition at line 210 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_DNS_CLASS_INTERNET

#define GNUNET_TUN_DNS_CLASS_INTERNET   1

A few common DNS classes (ok, only one is common, but I list a couple more to make it clear what we're talking about here).

Definition at line 311 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_DNS_CLASS_CHAOS

#define GNUNET_TUN_DNS_CLASS_CHAOS   3

Definition at line 312 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_DNS_CLASS_HESIOD

#define GNUNET_TUN_DNS_CLASS_HESIOD   4

Definition at line 313 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_DNS_OPCODE_QUERY

#define GNUNET_TUN_DNS_OPCODE_QUERY   0

Definition at line 315 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_DNS_OPCODE_INVERSE_QUERY

#define GNUNET_TUN_DNS_OPCODE_INVERSE_QUERY   1

Definition at line 316 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_DNS_OPCODE_STATUS

#define GNUNET_TUN_DNS_OPCODE_STATUS   2

Definition at line 317 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_DNS_RETURN_CODE_NO_ERROR

#define GNUNET_TUN_DNS_RETURN_CODE_NO_ERROR   0

RFC 1035 codes.

Definition at line 323 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_DNS_RETURN_CODE_FORMAT_ERROR

#define GNUNET_TUN_DNS_RETURN_CODE_FORMAT_ERROR   1

Definition at line 324 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_DNS_RETURN_CODE_SERVER_FAILURE

#define GNUNET_TUN_DNS_RETURN_CODE_SERVER_FAILURE   2

Definition at line 325 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_DNS_RETURN_CODE_NAME_ERROR

#define GNUNET_TUN_DNS_RETURN_CODE_NAME_ERROR   3

Definition at line 326 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_DNS_RETURN_CODE_NOT_IMPLEMENTED

#define GNUNET_TUN_DNS_RETURN_CODE_NOT_IMPLEMENTED   4

Definition at line 327 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_DNS_RETURN_CODE_REFUSED

#define GNUNET_TUN_DNS_RETURN_CODE_REFUSED   5

Definition at line 328 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_DNS_RETURN_CODE_YXDOMAIN

#define GNUNET_TUN_DNS_RETURN_CODE_YXDOMAIN   6

RFC 2136 codes.

Definition at line 333 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_DNS_RETURN_CODE_YXRRSET

#define GNUNET_TUN_DNS_RETURN_CODE_YXRRSET   7

Definition at line 334 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_DNS_RETURN_CODE_NXRRSET

#define GNUNET_TUN_DNS_RETURN_CODE_NXRRSET   8

Definition at line 335 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_DNS_RETURN_CODE_NOT_AUTH

#define GNUNET_TUN_DNS_RETURN_CODE_NOT_AUTH   9

Definition at line 336 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_DNS_RETURN_CODE_NOT_ZONE

#define GNUNET_TUN_DNS_RETURN_CODE_NOT_ZONE   10

Definition at line 337 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_ICMPTYPE_ECHO_REPLY

#define GNUNET_TUN_ICMPTYPE_ECHO_REPLY   0

Definition at line 708 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_ICMPTYPE_DESTINATION_UNREACHABLE

#define GNUNET_TUN_ICMPTYPE_DESTINATION_UNREACHABLE   3

Definition at line 709 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_ICMPTYPE_SOURCE_QUENCH

#define GNUNET_TUN_ICMPTYPE_SOURCE_QUENCH   4

Definition at line 710 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_ICMPTYPE_REDIRECT_MESSAGE

#define GNUNET_TUN_ICMPTYPE_REDIRECT_MESSAGE   5

Definition at line 711 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_ICMPTYPE_ECHO_REQUEST

#define GNUNET_TUN_ICMPTYPE_ECHO_REQUEST   8

Definition at line 712 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_ICMPTYPE_ROUTER_ADVERTISEMENT

#define GNUNET_TUN_ICMPTYPE_ROUTER_ADVERTISEMENT   9

Definition at line 713 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_ICMPTYPE_ROUTER_SOLICITATION

#define GNUNET_TUN_ICMPTYPE_ROUTER_SOLICITATION   10

Definition at line 714 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_ICMPTYPE_TIME_EXCEEDED

#define GNUNET_TUN_ICMPTYPE_TIME_EXCEEDED   11

Definition at line 715 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_ICMPTYPE6_DESTINATION_UNREACHABLE

#define GNUNET_TUN_ICMPTYPE6_DESTINATION_UNREACHABLE   1

Definition at line 717 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_ICMPTYPE6_PACKET_TOO_BIG

#define GNUNET_TUN_ICMPTYPE6_PACKET_TOO_BIG   2

Definition at line 718 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_ICMPTYPE6_TIME_EXCEEDED

#define GNUNET_TUN_ICMPTYPE6_TIME_EXCEEDED   3

Definition at line 719 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_ICMPTYPE6_PARAMETER_PROBLEM

#define GNUNET_TUN_ICMPTYPE6_PARAMETER_PROBLEM   4

Definition at line 720 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_ICMPTYPE6_ECHO_REQUEST

#define GNUNET_TUN_ICMPTYPE6_ECHO_REQUEST   128

Definition at line 721 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_ICMPTYPE6_ECHO_REPLY

#define GNUNET_TUN_ICMPTYPE6_ECHO_REPLY   129

Definition at line 722 of file gnunet_tun_lib.h.

◆ GNUNET_GCC_STRUCT_LAYOUT

struct GNUNET_TUN_DnsFlags GNUNET_GCC_STRUCT_LAYOUT

gcc-ism to get gcc bitfield layout when compiling with -mms-bitfields

Definition at line 237 of file gnunet_common.h.

Function Documentation

◆ GNUNET_TUN_initialize_ipv4_header()

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.

Parameters
ipheader to initialize
protocolprotocol to use (e.g. IPPROTO_UDP)
payload_lengthnumber of bytes of payload that follow (excluding IPv4 header)
srcsource IP address to use
dstdestination IP address to use

Definition at line 47 of file tun.c.

52{
53 GNUNET_assert (20 == sizeof(struct GNUNET_TUN_IPv4Header));
54 GNUNET_assert (payload_length <=
55 UINT16_MAX - sizeof(struct GNUNET_TUN_IPv4Header));
56 memset (ip, 0, sizeof(struct GNUNET_TUN_IPv4Header));
57 ip->header_length = sizeof(struct GNUNET_TUN_IPv4Header) / 4;
58 ip->version = 4;
59 ip->total_length =
60 htons (sizeof(struct GNUNET_TUN_IPv4Header) + payload_length);
61 ip->identification =
63 ip->ttl = FRESH_TTL;
64 ip->protocol = protocol;
65 ip->source_address = *src;
66 ip->destination_address = *dst;
67 ip->checksum =
69}
uint32_t GNUNET_CRYPTO_random_u32(enum GNUNET_CRYPTO_Quality mode, uint32_t i)
Produce a random value.
@ GNUNET_CRYPTO_QUALITY_WEAK
No good quality of the operation is needed (i.e., random numbers can be pseudo-random).
uint16_t GNUNET_CRYPTO_crc16_n(const void *buf, size_t len)
Calculate the checksum of a buffer in one step.
Definition: crypto_crc.c:133
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
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.
struct in_addr source_address
Origin of the packet.
struct in_addr destination_address
Destination of the packet.
unsigned int header_length
#define FRESH_TTL
IP TTL we use for packets that we assemble (8 bit unsigned integer)
Definition: tun.c:34

References GNUNET_TUN_IPv4Header::checksum, GNUNET_TUN_IPv4Header::destination_address, FRESH_TTL, GNUNET_assert, GNUNET_CRYPTO_crc16_n(), GNUNET_CRYPTO_QUALITY_WEAK, GNUNET_CRYPTO_random_u32(), GNUNET_TUN_IPv4Header::header_length, GNUNET_TUN_IPv4Header::identification, GNUNET_TUN_IPv4Header::protocol, GNUNET_TUN_IPv4Header::source_address, GNUNET_TUN_IPv4Header::total_length, GNUNET_TUN_IPv4Header::ttl, and GNUNET_TUN_IPv4Header::version.

Referenced by handle_icmp_back(), handle_tcp_back(), handle_udp_back(), make_up_icmpv4_payload(), prepare_ipv4_packet(), request_done(), and send_icmp_packet_via_tun().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_TUN_initialize_ipv6_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.

Parameters
ipheader to initialize
protocolprotocol to use (e.g. IPPROTO_UDP)
payload_lengthnumber of bytes of payload that follow (excluding IPv4 header)
srcsource IP address to use
dstdestination IP address to use
ipheader to initialize
protocolprotocol to use (e.g. IPPROTO_UDP), technically "next_header" for IPv6
payload_lengthnumber of bytes of payload that follow (excluding IPv6 header)
srcsource IP address to use
dstdestination IP address to use

Definition at line 82 of file tun.c.

87{
88 GNUNET_assert (40 == sizeof(struct GNUNET_TUN_IPv6Header));
89 GNUNET_assert (payload_length <=
90 UINT16_MAX - sizeof(struct GNUNET_TUN_IPv6Header));
91 memset (ip, 0, sizeof(struct GNUNET_TUN_IPv6Header));
92 ip->version = 6;
93 ip->next_header = protocol;
94 ip->payload_length = htons ((uint16_t) payload_length);
95 ip->hop_limit = FRESH_TTL;
96 ip->destination_address = *dst;
97 ip->source_address = *src;
98}
Standard IPv6 header.
struct in6_addr source_address
Origin of the packet.
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.

References GNUNET_TUN_IPv6Header::destination_address, FRESH_TTL, GNUNET_assert, GNUNET_TUN_IPv6Header::hop_limit, GNUNET_TUN_IPv6Header::next_header, GNUNET_TUN_IPv6Header::payload_length, GNUNET_TUN_IPv4Header::protocol, GNUNET_TUN_IPv6Header::source_address, and GNUNET_TUN_IPv6Header::version.

Referenced by handle_icmp_back(), handle_tcp_back(), handle_udp_back(), make_up_icmpv6_payload(), prepare_ipv6_packet(), request_done(), and send_icmp_packet_via_tun().

Here is the caller graph for this function:

◆ GNUNET_TUN_calculate_tcp4_checksum()

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.

Parameters
ipipv4 header fully initialized
tcpTCP header (initialized except for CRC)
payloadthe TCP payload
payload_lengthnumber of bytes of TCP payload

Definition at line 102 of file tun.c.

106{
107 uint32_t sum;
108 uint16_t tmp;
109
110 GNUNET_assert (20 == sizeof(struct GNUNET_TUN_TcpHeader));
111 GNUNET_assert (payload_length + sizeof(struct GNUNET_TUN_IPv4Header)
112 + sizeof(struct GNUNET_TUN_TcpHeader) ==
113 ntohs (ip->total_length));
114 GNUNET_assert (IPPROTO_TCP == ip->protocol);
115
116 tcp->crc = 0;
118 &ip->source_address,
119 sizeof(struct in_addr) * 2);
120 tmp = htons (IPPROTO_TCP);
121 sum = GNUNET_CRYPTO_crc16_step (sum, &tmp, sizeof(uint16_t));
122 tmp = htons (payload_length + sizeof(struct GNUNET_TUN_TcpHeader));
123 sum = GNUNET_CRYPTO_crc16_step (sum, &tmp, sizeof(uint16_t));
124 sum =
126 sum = GNUNET_CRYPTO_crc16_step (sum, payload, payload_length);
128}
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:70
uint16_t GNUNET_CRYPTO_crc16_finish(uint32_t sum)
Convert results from GNUNET_CRYPTO_crc16_step to final crc16.
Definition: crypto_crc.c:123
uint32_t GNUNET_CRYPTO_crc16_step(uint32_t sum, const void *buf, size_t len)
Perform an incremental step in a CRC16 (for TCP/IP) calculation.
Definition: crypto_crc.c:110
TCP packet header.

References GNUNET_assert, GNUNET_CRYPTO_crc16_finish(), GNUNET_CRYPTO_crc16_step(), payload, GNUNET_TUN_IPv4Header::protocol, GNUNET_TUN_IPv4Header::source_address, consensus-simulation::sum, tcp, and GNUNET_TUN_IPv4Header::total_length.

Referenced by handle_tcp_back(), and prepare_ipv4_packet().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_TUN_calculate_tcp6_checksum()

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.

Parameters
ipipv6 header fully initialized
tcpTCP header (initialized except for CRC)
payloadthe TCP payload
payload_lengthnumber of bytes of TCP payload

Definition at line 132 of file tun.c.

136{
137 uint32_t sum;
138 uint32_t tmp;
139
140 GNUNET_assert (20 == sizeof(struct GNUNET_TUN_TcpHeader));
141 GNUNET_assert (payload_length + sizeof(struct GNUNET_TUN_TcpHeader) ==
142 ntohs (ip->payload_length));
143 GNUNET_assert (IPPROTO_TCP == ip->next_header);
144 tcp->crc = 0;
146 &ip->source_address,
147 2 * sizeof(struct in6_addr));
148 tmp = htonl (sizeof(struct GNUNET_TUN_TcpHeader) + payload_length);
149 sum = GNUNET_CRYPTO_crc16_step (sum, &tmp, sizeof(uint32_t));
150 tmp = htonl (IPPROTO_TCP);
151 sum = GNUNET_CRYPTO_crc16_step (sum, &tmp, sizeof(uint32_t));
152 sum =
154 sum = GNUNET_CRYPTO_crc16_step (sum, payload, payload_length);
156}

References GNUNET_assert, GNUNET_CRYPTO_crc16_finish(), GNUNET_CRYPTO_crc16_step(), GNUNET_TUN_IPv6Header::next_header, payload, GNUNET_TUN_IPv6Header::payload_length, GNUNET_TUN_IPv6Header::source_address, consensus-simulation::sum, and tcp.

Referenced by handle_tcp_back(), and prepare_ipv6_packet().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_TUN_calculate_udp4_checksum()

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.

Parameters
ipipv4 header fully initialized
udpUDP header (initialized except for CRC)
payloadthe UDP payload
payload_lengthnumber of bytes of UDP payload

Definition at line 160 of file tun.c.

164{
165 uint32_t sum;
166 uint16_t tmp;
167
168 GNUNET_assert (8 == sizeof(struct GNUNET_TUN_UdpHeader));
169 GNUNET_assert (payload_length + sizeof(struct GNUNET_TUN_IPv4Header)
170 + sizeof(struct GNUNET_TUN_UdpHeader) ==
171 ntohs (ip->total_length));
172 GNUNET_assert (IPPROTO_UDP == ip->protocol);
173
174 udp->crc =
175 0; /* technically optional, but we calculate it anyway, just to be sure */
177 &ip->source_address,
178 sizeof(struct in_addr) * 2);
179 tmp = htons (IPPROTO_UDP);
180 sum = GNUNET_CRYPTO_crc16_step (sum, &tmp, sizeof(uint16_t));
181 tmp = htons (sizeof(struct GNUNET_TUN_UdpHeader) + payload_length);
182 sum = GNUNET_CRYPTO_crc16_step (sum, &tmp, sizeof(uint16_t));
183 sum =
185 sum = GNUNET_CRYPTO_crc16_step (sum, payload, payload_length);
187}
static int udp
Option -u: UDP requested.
Definition: gnunet-vpn.c:75
UDP packet header.

References GNUNET_assert, GNUNET_CRYPTO_crc16_finish(), GNUNET_CRYPTO_crc16_step(), payload, GNUNET_TUN_IPv4Header::protocol, GNUNET_TUN_IPv4Header::source_address, consensus-simulation::sum, GNUNET_TUN_IPv4Header::total_length, and udp.

Referenced by handle_udp_back(), prepare_ipv4_packet(), and request_done().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_TUN_calculate_udp6_checksum()

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.

Parameters
ipipv6 header fully initialized
udpUDP header (initialized except for CRC)
payloadthe UDP payload
payload_lengthnumber of bytes of payload

Definition at line 191 of file tun.c.

195{
196 uint32_t sum;
197 uint32_t tmp;
198
199 GNUNET_assert (payload_length + sizeof(struct GNUNET_TUN_UdpHeader) ==
200 ntohs (ip->payload_length));
201 GNUNET_assert (payload_length + sizeof(struct GNUNET_TUN_UdpHeader) ==
202 ntohs (udp->len));
203 GNUNET_assert (IPPROTO_UDP == ip->next_header);
204
205 udp->crc = 0;
207 &ip->source_address,
208 sizeof(struct in6_addr) * 2);
209 tmp = htons (sizeof(struct GNUNET_TUN_UdpHeader)
210 + payload_length); /* aka udp->len */
211 sum = GNUNET_CRYPTO_crc16_step (sum, &tmp, sizeof(uint32_t));
212 tmp = htons (ip->next_header);
213 sum = GNUNET_CRYPTO_crc16_step (sum, &tmp, sizeof(uint32_t));
214 sum =
216 sum = GNUNET_CRYPTO_crc16_step (sum, payload, payload_length);
218}

References GNUNET_assert, GNUNET_CRYPTO_crc16_finish(), GNUNET_CRYPTO_crc16_step(), GNUNET_TUN_IPv6Header::next_header, payload, GNUNET_TUN_IPv6Header::payload_length, GNUNET_TUN_IPv6Header::source_address, consensus-simulation::sum, and udp.

Referenced by handle_udp_back(), prepare_ipv6_packet(), and request_done().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_TUN_calculate_icmp_checksum()

void GNUNET_TUN_calculate_icmp_checksum ( struct GNUNET_TUN_IcmpHeader icmp,
const void *  payload,
uint16_t  payload_length 
)

Calculate ICMP checksum.

Parameters
icmpIMCP header (initialized except for CRC)
payloadthe ICMP payload
payload_lengthnumber of bytes of payload

Definition at line 222 of file tun.c.

225{
226 uint32_t sum;
227
228 GNUNET_assert (8 == sizeof(struct GNUNET_TUN_IcmpHeader));
229 icmp->crc = 0;
230 sum =
231 GNUNET_CRYPTO_crc16_step (0, icmp, sizeof(struct GNUNET_TUN_IcmpHeader));
232 sum = GNUNET_CRYPTO_crc16_step (sum, payload, payload_length);
234}

References GNUNET_TUN_IcmpHeader::crc, GNUNET_assert, GNUNET_CRYPTO_crc16_finish(), GNUNET_CRYPTO_crc16_step(), payload, and consensus-simulation::sum.

Referenced by handle_icmp_back(), and send_icmp_packet_via_tun().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_TUN_ipv4toregexsearch()

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.

Parameters
ipIPv4 representation.
portdestination port
rxstrgenerated regex, must be at least GNUNET_TUN_IPV4_REGEXLEN bytes long.

Definition at line 37 of file regex.c.

40{
41 GNUNET_snprintf (rxstr,
43 "4-%04X-%08X",
44 (unsigned int) port,
45 ntohl (ip->s_addr));
46}
static uint16_t port
Port number.
Definition: gnunet-bcd.c:147
int GNUNET_snprintf(char *buf, size_t size, const char *format,...) __attribute__((format(printf
Like snprintf, just aborts if the buffer is of insufficient size.
#define GNUNET_TUN_IPV4_REGEXLEN
Maximum regex string length for use with GNUNET_TUN_ipv4toregexsearch.

References GNUNET_snprintf(), GNUNET_TUN_IPV4_REGEXLEN, and port.

Referenced by create_channel_to_destination().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_TUN_ipv6toregexsearch()

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.

Parameters
ipv6IPv6 representation.
portdestination port
rxstrgenerated regex, must be at least GNUNET_TUN_IPV6_REGEXLEN bytes long.

Definition at line 50 of file regex.c.

53{
54 const uint32_t *addr;
55
56 addr = (const uint32_t *) ipv6;
57 GNUNET_snprintf (rxstr,
59 "6-%04X-%08X%08X%08X%08X",
60 (unsigned int) port,
61 ntohl (addr[0]),
62 ntohl (addr[1]),
63 ntohl (addr[2]),
64 ntohl (addr[3]));
65}
static int ipv6
Option -6: IPv6 requested.
Definition: gnunet-vpn.c:65
#define GNUNET_TUN_IPV6_REGEXLEN
Maximum regex string length for use with GNUNET_TUN_ipv6toregexsearch.

References GNUNET_snprintf(), GNUNET_TUN_IPV6_REGEXLEN, ipv6, and port.

Referenced by create_channel_to_destination().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_TUN_ipv6policy2regex()

char * GNUNET_TUN_ipv6policy2regex ( const char *  policy)

Convert an exit policy to a regular expression.

The exit policy specifies a set of subnets this peer is willing to serve as an exit for; the resulting regular expression will match the IPv6 address strings as returned by GNUNET_TUN_ipv6toregexsearch.

Parameters
policyexit policy specification
Returns
regular expression, NULL on error

Definition at line 725 of file regex.c.

726{
727 struct in6_addr zero;
729 char *reg;
730 char *tmp;
731 char *line;
732 unsigned int i;
733
735 if (NULL == np)
736 return NULL;
737 reg = NULL;
738 memset (&zero, 0, sizeof(struct in6_addr));
739 for (i = 0; (0 == i) || (0 != memcmp (&zero, &np[i].network, sizeof(struct
740 in6_addr)));
741 i++)
742 {
743 line = ipv6_to_regex (&np[i]);
744 if (NULL == line)
745 {
746 GNUNET_free (reg);
747 GNUNET_free (np);
748 return NULL;
749 }
750 if (NULL == reg)
751 {
752 reg = line;
753 }
754 else
755 {
756 GNUNET_asprintf (&tmp,
757 "%s|(%s)",
758 reg, line);
759 GNUNET_free (reg);
761 reg = tmp;
762 }
763 if (0 == memcmp (&zero, &np[i].network, sizeof(struct in6_addr)))
764 break;
765 }
766 GNUNET_free (np);
767 return reg;
768}
static char * line
Desired phone line (string to be converted to a hash).
static const struct GNUNET_CRYPTO_PrivateKey zero
Public key of all zeros.
int int GNUNET_asprintf(char **buf, const char *format,...) __attribute__((format(printf
Like asprintf, just portable.
#define GNUNET_free(ptr)
Wrapper around free.
struct GNUNET_STRINGS_IPv6NetworkPolicy * GNUNET_STRINGS_parse_ipv6_policy(const char *routeListX)
Parse an IPv6 network policy.
Definition: strings.c:1473
static char * ipv6_to_regex(const struct GNUNET_STRINGS_IPv6NetworkPolicy *v6)
Convert a single line of an IPv4 policy to a regular expression.
Definition: regex.c:655
network in CIDR notation for IPV6.
struct in6_addr network
IPv6 address.

References GNUNET_asprintf(), GNUNET_free, GNUNET_STRINGS_parse_ipv6_policy(), ipv6_to_regex(), line, GNUNET_STRINGS_IPv6NetworkPolicy::network, and zero.

Referenced by run().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_TUN_ipv4policy2regex()

char * GNUNET_TUN_ipv4policy2regex ( const char *  policy)

Convert an exit policy to a regular expression.

The exit policy specifies a set of subnets this peer is willing to serve as an exit for; the resulting regular expression will match the IPv4 address strings as returned by GNUNET_TUN_ipv4toregexsearch.

Parameters
policyexit policy specification
Returns
regular expression, NULL on error

Definition at line 682 of file regex.c.

683{
685 char *reg;
686 char *tmp;
687 char *line;
688 unsigned int i;
689
691 if (NULL == np)
692 return NULL;
693 reg = NULL;
694 for (i = 0; (0 == i) || (0 != np[i].network.s_addr); i++)
695 {
696 line = ipv4_to_regex (&np[i]);
697 if (NULL == line)
698 {
699 GNUNET_free (reg);
700 GNUNET_free (np);
701 return NULL;
702 }
703 if (NULL == reg)
704 {
705 reg = line;
706 }
707 else
708 {
709 GNUNET_asprintf (&tmp,
710 "%s|(%s)",
711 reg, line);
712 GNUNET_free (reg);
714 reg = tmp;
715 }
716 if (0 == np[i].network.s_addr)
717 break;
718 }
719 GNUNET_free (np);
720 return reg;
721}
struct GNUNET_STRINGS_IPv4NetworkPolicy * GNUNET_STRINGS_parse_ipv4_policy(const char *routeListX)
Parse an IPv4 network policy.
Definition: strings.c:1298
static char * ipv4_to_regex(const struct GNUNET_STRINGS_IPv4NetworkPolicy *v4)
Convert a single line of an IPv4 policy to a regular expression.
Definition: regex.c:622
IPV4 network in CIDR notation.
struct in_addr network
IPv4 address.

References GNUNET_asprintf(), GNUNET_free, GNUNET_STRINGS_parse_ipv4_policy(), ipv4_to_regex(), line, and GNUNET_STRINGS_IPv4NetworkPolicy::network.

Referenced by run().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_TUN_service_name_to_hash()

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 the network.

Parameters
service_namea string
[out]hccorresponding hash

Definition at line 772 of file regex.c.

774{
776 strlen (service_name),
777 hc);
778}
static char * service_name
Option -s: service name (hash to get service descriptor)
Definition: gnunet-vpn.c:50
void GNUNET_CRYPTO_hash(const void *block, size_t size, struct GNUNET_HashCode *ret)
Compute hash of a given block.
Definition: crypto_hash.c:41

References GNUNET_CRYPTO_hash(), and service_name.

Referenced by result_processor(), run(), and store_service().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_TUN_sockaddr_cmp()

int GNUNET_TUN_sockaddr_cmp ( const struct sockaddr *  sa,
const struct sockaddr *  sb,
int  include_port 
)

Check if two sockaddrs are equal.

Parameters
saone address
sbanother address
include_portalso check ports
Returns
GNUNET_YES if they are equal

Definition at line 246 of file tun.c.

249{
250 if (sa->sa_family != sb->sa_family)
251 return GNUNET_NO;
252
253 switch (sa->sa_family)
254 {
255 case AF_INET: {
256 const struct sockaddr_in *sa4 = (const struct sockaddr_in *) sa;
257 const struct sockaddr_in *sb4 = (const struct sockaddr_in *) sb;
258 if ((include_port) && (sa4->sin_port != sb4->sin_port))
259 return GNUNET_NO;
260 return(sa4->sin_addr.s_addr == sb4->sin_addr.s_addr);
261 }
262
263 case AF_INET6: {
264 const struct sockaddr_in6 *sa6 = (const struct sockaddr_in6 *) sa;
265 const struct sockaddr_in6 *sb6 = (const struct sockaddr_in6 *) sb;
266
267 if ((include_port) && (sa6->sin6_port != sb6->sin6_port))
268 return GNUNET_NO;
269 return(
270 0 == memcmp (&sa6->sin6_addr, &sb6->sin6_addr, sizeof(struct
271 in6_addr)));
272 }
273
274 default:
275 GNUNET_break (0);
276 return GNUNET_SYSERR;
277 }
278}
@ GNUNET_NO
@ GNUNET_SYSERR
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur.

References GNUNET_break, GNUNET_NO, and GNUNET_SYSERR.

◆ GNUNET_TUN_compute_service_cadet_port()

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 a TCP/UDP port ip_port.

Parameters
descservice shared secret
ip_portTCP/UDP port, use 0 for ICMP
[out]cadet_portCADET port to use

Definition at line 791 of file regex.c.

794{
795 uint16_t be_port = htons (ip_port);
796
797 *cadet_port = *desc;
799 &be_port,
800 sizeof(uint16_t));
801}
static struct GNUNET_CADET_Port * cadet_port
Listen port for incoming requests.
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.

References cadet_port, and GNUNET_memcpy.

Referenced by create_channel_to_destination(), and store_service().

Here is the caller graph for this function:

Variable Documentation

◆ GNUNET_GCC_STRUCT_LAYOUT

struct GNUNET_TUN_DnsFlags GNUNET_GCC_STRUCT_LAYOUT