GNUnet  0.18.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_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
 

Functions

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

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 49 of file gnunet_tun_lib.h.

◆ ETH_P_IPV6

#define ETH_P_IPV6   0x86DD

Number for IPv6.

Definition at line 56 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 67 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 76 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_TCP_FLAGS_FIN

#define GNUNET_TUN_TCP_FLAGS_FIN   1

TCP flags.

Definition at line 202 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_TCP_FLAGS_SYN

#define GNUNET_TUN_TCP_FLAGS_SYN   2

Definition at line 203 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_TCP_FLAGS_RST

#define GNUNET_TUN_TCP_FLAGS_RST   4

Definition at line 204 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_TCP_FLAGS_PSH

#define GNUNET_TUN_TCP_FLAGS_PSH   8

Definition at line 205 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_TCP_FLAGS_ACK

#define GNUNET_TUN_TCP_FLAGS_ACK   16

Definition at line 206 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_TCP_FLAGS_URG

#define GNUNET_TUN_TCP_FLAGS_URG   32

Definition at line 207 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_TCP_FLAGS_ECE

#define GNUNET_TUN_TCP_FLAGS_ECE   64

Definition at line 208 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_TCP_FLAGS_CWR

#define GNUNET_TUN_TCP_FLAGS_CWR   128

Definition at line 209 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 310 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_DNS_CLASS_CHAOS

#define GNUNET_TUN_DNS_CLASS_CHAOS   3

Definition at line 311 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_DNS_CLASS_HESIOD

#define GNUNET_TUN_DNS_CLASS_HESIOD   4

Definition at line 312 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_DNS_OPCODE_QUERY

#define GNUNET_TUN_DNS_OPCODE_QUERY   0

Definition at line 314 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_DNS_OPCODE_INVERSE_QUERY

#define GNUNET_TUN_DNS_OPCODE_INVERSE_QUERY   1

Definition at line 315 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_DNS_OPCODE_STATUS

#define GNUNET_TUN_DNS_OPCODE_STATUS   2

Definition at line 316 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 322 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 323 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 324 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 325 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 326 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_DNS_RETURN_CODE_REFUSED

#define GNUNET_TUN_DNS_RETURN_CODE_REFUSED   5

Definition at line 327 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 332 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_DNS_RETURN_CODE_YXRRSET

#define GNUNET_TUN_DNS_RETURN_CODE_YXRRSET   7

Definition at line 333 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_DNS_RETURN_CODE_NXRRSET

#define GNUNET_TUN_DNS_RETURN_CODE_NXRRSET   8

Definition at line 334 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 335 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 336 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_ICMPTYPE_ECHO_REPLY

#define GNUNET_TUN_ICMPTYPE_ECHO_REPLY   0

Definition at line 684 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_ICMPTYPE_DESTINATION_UNREACHABLE

#define GNUNET_TUN_ICMPTYPE_DESTINATION_UNREACHABLE   3

Definition at line 685 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_ICMPTYPE_SOURCE_QUENCH

#define GNUNET_TUN_ICMPTYPE_SOURCE_QUENCH   4

Definition at line 686 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_ICMPTYPE_REDIRECT_MESSAGE

#define GNUNET_TUN_ICMPTYPE_REDIRECT_MESSAGE   5

Definition at line 687 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_ICMPTYPE_ECHO_REQUEST

#define GNUNET_TUN_ICMPTYPE_ECHO_REQUEST   8

Definition at line 688 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_ICMPTYPE_ROUTER_ADVERTISEMENT

#define GNUNET_TUN_ICMPTYPE_ROUTER_ADVERTISEMENT   9

Definition at line 689 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_ICMPTYPE_ROUTER_SOLICITATION

#define GNUNET_TUN_ICMPTYPE_ROUTER_SOLICITATION   10

Definition at line 690 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_ICMPTYPE_TIME_EXCEEDED

#define GNUNET_TUN_ICMPTYPE_TIME_EXCEEDED   11

Definition at line 691 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_ICMPTYPE6_DESTINATION_UNREACHABLE

#define GNUNET_TUN_ICMPTYPE6_DESTINATION_UNREACHABLE   1

Definition at line 693 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_ICMPTYPE6_PACKET_TOO_BIG

#define GNUNET_TUN_ICMPTYPE6_PACKET_TOO_BIG   2

Definition at line 694 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_ICMPTYPE6_TIME_EXCEEDED

#define GNUNET_TUN_ICMPTYPE6_TIME_EXCEEDED   3

Definition at line 695 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_ICMPTYPE6_PARAMETER_PROBLEM

#define GNUNET_TUN_ICMPTYPE6_PARAMETER_PROBLEM   4

Definition at line 696 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_ICMPTYPE6_ECHO_REQUEST

#define GNUNET_TUN_ICMPTYPE6_ECHO_REQUEST   128

Definition at line 697 of file gnunet_tun_lib.h.

◆ GNUNET_TUN_ICMPTYPE6_ECHO_REPLY

#define GNUNET_TUN_ICMPTYPE6_ECHO_REPLY   129

Definition at line 698 of file gnunet_tun_lib.h.

Function Documentation

◆ GNUNET_TUN_initialize_ipv4_header()

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 46 of file tun.c.

51 {
52  GNUNET_assert (20 == sizeof(struct GNUNET_TUN_IPv4Header));
53  GNUNET_assert (payload_length <=
54  UINT16_MAX - sizeof(struct GNUNET_TUN_IPv4Header));
55  memset (ip, 0, sizeof(struct GNUNET_TUN_IPv4Header));
56  ip->header_length = sizeof(struct GNUNET_TUN_IPv4Header) / 4;
57  ip->version = 4;
58  ip->total_length =
59  htons (sizeof(struct GNUNET_TUN_IPv4Header) + payload_length);
60  ip->identification =
62  ip->ttl = FRESH_TTL;
63  ip->protocol = protocol;
64  ip->source_address = *src;
65  ip->destination_address = *dst;
66  ip->checksum =
67  GNUNET_CRYPTO_crc16_n (ip, sizeof(struct GNUNET_TUN_IPv4Header));
68 }
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:132
#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:33

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 81 of file tun.c.

86 {
87  GNUNET_assert (40 == sizeof(struct GNUNET_TUN_IPv6Header));
88  GNUNET_assert (payload_length <=
89  UINT16_MAX - sizeof(struct GNUNET_TUN_IPv6Header));
90  memset (ip, 0, sizeof(struct GNUNET_TUN_IPv6Header));
91  ip->version = 6;
92  ip->next_header = protocol;
93  ip->payload_length = htons ((uint16_t) payload_length);
94  ip->hop_limit = FRESH_TTL;
95  ip->destination_address = *dst;
96  ip->source_address = *src;
97 }
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 101 of file tun.c.

105 {
106  uint32_t sum;
107  uint16_t tmp;
108 
109  GNUNET_assert (20 == sizeof(struct GNUNET_TUN_TcpHeader));
110  GNUNET_assert (payload_length + sizeof(struct GNUNET_TUN_IPv4Header)
111  + sizeof(struct GNUNET_TUN_TcpHeader) ==
112  ntohs (ip->total_length));
113  GNUNET_assert (IPPROTO_TCP == ip->protocol);
114 
115  tcp->crc = 0;
117  &ip->source_address,
118  sizeof(struct in_addr) * 2);
119  tmp = htons (IPPROTO_TCP);
120  sum = GNUNET_CRYPTO_crc16_step (sum, &tmp, sizeof(uint16_t));
121  tmp = htons (payload_length + sizeof(struct GNUNET_TUN_TcpHeader));
122  sum = GNUNET_CRYPTO_crc16_step (sum, &tmp, sizeof(uint16_t));
123  sum =
125  sum = GNUNET_CRYPTO_crc16_step (sum, payload, payload_length);
127 }
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
uint16_t GNUNET_CRYPTO_crc16_finish(uint32_t sum)
Convert results from GNUNET_CRYPTO_crc16_step to final crc16.
Definition: crypto_crc.c:122
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:109
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 131 of file tun.c.

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

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 159 of file tun.c.

163 {
164  uint32_t sum;
165  uint16_t tmp;
166 
167  GNUNET_assert (8 == sizeof(struct GNUNET_TUN_UdpHeader));
168  GNUNET_assert (payload_length + sizeof(struct GNUNET_TUN_IPv4Header)
169  + sizeof(struct GNUNET_TUN_UdpHeader) ==
170  ntohs (ip->total_length));
171  GNUNET_assert (IPPROTO_UDP == ip->protocol);
172 
173  udp->crc =
174  0; /* technically optional, but we calculate it anyway, just to be sure */
176  &ip->source_address,
177  sizeof(struct in_addr) * 2);
178  tmp = htons (IPPROTO_UDP);
179  sum = GNUNET_CRYPTO_crc16_step (sum, &tmp, sizeof(uint16_t));
180  tmp = htons (sizeof(struct GNUNET_TUN_UdpHeader) + payload_length);
181  sum = GNUNET_CRYPTO_crc16_step (sum, &tmp, sizeof(uint16_t));
182  sum =
184  sum = GNUNET_CRYPTO_crc16_step (sum, payload, payload_length);
186 }
static int udp
Option -u: UDP requested.
Definition: gnunet-vpn.c:76
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 190 of file tun.c.

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

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 221 of file tun.c.

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

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:66
#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 
734  np = GNUNET_STRINGS_parse_ipv6_policy (policy);
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);
760  GNUNET_free (line);
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_IDENTITY_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:1472
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 
690  np = GNUNET_STRINGS_parse_ipv4_policy (policy);
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);
713  GNUNET_free (line);
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:1291
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:51
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 245 of file tun.c.

248 {
249  if (sa->sa_family != sb->sa_family)
250  return GNUNET_NO;
251 
252  switch (sa->sa_family)
253  {
254  case AF_INET: {
255  const struct sockaddr_in *sa4 = (const struct sockaddr_in *) sa;
256  const struct sockaddr_in *sb4 = (const struct sockaddr_in *) sb;
257  if ((include_port) && (sa4->sin_port != sb4->sin_port))
258  return GNUNET_NO;
259  return(sa4->sin_addr.s_addr == sb4->sin_addr.s_addr);
260  }
261 
262  case AF_INET6: {
263  const struct sockaddr_in6 *sa6 = (const struct sockaddr_in6 *) sa;
264  const struct sockaddr_in6 *sb6 = (const struct sockaddr_in6 *) sb;
265 
266  if ((include_port) && (sa6->sin6_port != sb6->sin6_port))
267  return GNUNET_NO;
268  return(
269  0 == memcmp (&sa6->sin6_addr, &sb6->sin6_addr, sizeof(struct
270  in6_addr)));
271  }
272 
273  default:
274  GNUNET_break (0);
275  return GNUNET_SYSERR;
276  }
277 }
@ GNUNET_NO
Definition: gnunet_common.h:98
@ GNUNET_SYSERR
Definition: gnunet_common.h:97
#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: