GNUnet 0.22.2

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_REGEX_ipv4toregexsearch. More...
 
#define GNUNET_TUN_IPV6_REGEXLEN   40
 Maximum regex string length for use with GNUNET_REGEX_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_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_REGEX_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_REGEX_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 243 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 80 of file tun.c.

85{
86 GNUNET_assert (20 == sizeof(struct GNUNET_TUN_IPv4Header));
87 GNUNET_assert (payload_length <=
88 UINT16_MAX - sizeof(struct GNUNET_TUN_IPv4Header));
89 memset (ip, 0, sizeof(struct GNUNET_TUN_IPv4Header));
90 ip->header_length = sizeof(struct GNUNET_TUN_IPv4Header) / 4;
91 ip->version = 4;
92 ip->total_length =
93 htons (sizeof(struct GNUNET_TUN_IPv4Header) + payload_length);
94 ip->identification =
96 ip->ttl = FRESH_TTL;
97 ip->protocol = protocol;
98 ip->source_address = *src;
99 ip->destination_address = *dst;
100 ip->checksum =
101 GNUNET_CRYPTO_crc16_n (ip, sizeof(struct GNUNET_TUN_IPv4Header));
102}
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 115 of file tun.c.

120{
121 GNUNET_assert (40 == sizeof(struct GNUNET_TUN_IPv6Header));
122 GNUNET_assert (payload_length <=
123 UINT16_MAX - sizeof(struct GNUNET_TUN_IPv6Header));
124 memset (ip, 0, sizeof(struct GNUNET_TUN_IPv6Header));
125 ip->version = 6;
126 ip->next_header = protocol;
127 ip->payload_length = htons ((uint16_t) payload_length);
128 ip->hop_limit = FRESH_TTL;
129 ip->destination_address = *dst;
130 ip->source_address = *src;
131}
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 135 of file tun.c.

139{
140 uint32_t sum;
141 uint16_t tmp;
142
143 GNUNET_assert (20 == sizeof(struct GNUNET_TUN_TcpHeader));
144 GNUNET_assert (payload_length + sizeof(struct GNUNET_TUN_IPv4Header)
145 + sizeof(struct GNUNET_TUN_TcpHeader) ==
146 ntohs (ip->total_length));
147 GNUNET_assert (IPPROTO_TCP == ip->protocol);
148
149 tcp->crc = 0;
151 &ip->source_address,
152 sizeof(struct in_addr) * 2);
153 tmp = htons (IPPROTO_TCP);
154 sum = GNUNET_CRYPTO_crc16_step (sum, &tmp, sizeof(uint16_t));
155 tmp = htons (payload_length + sizeof(struct GNUNET_TUN_TcpHeader));
156 sum = GNUNET_CRYPTO_crc16_step (sum, &tmp, sizeof(uint16_t));
157 sum =
159 sum = GNUNET_CRYPTO_crc16_step (sum, payload, payload_length);
161}
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 165 of file tun.c.

169{
170 uint32_t sum;
171 uint32_t tmp;
172
173 GNUNET_assert (20 == sizeof(struct GNUNET_TUN_TcpHeader));
174 GNUNET_assert (payload_length + sizeof(struct GNUNET_TUN_TcpHeader) ==
175 ntohs (ip->payload_length));
176 GNUNET_assert (IPPROTO_TCP == ip->next_header);
177 tcp->crc = 0;
179 &ip->source_address,
180 2 * sizeof(struct in6_addr));
181 tmp = htonl (sizeof(struct GNUNET_TUN_TcpHeader) + payload_length);
182 sum = GNUNET_CRYPTO_crc16_step (sum, &tmp, sizeof(uint32_t));
183 tmp = htonl (IPPROTO_TCP);
184 sum = GNUNET_CRYPTO_crc16_step (sum, &tmp, sizeof(uint32_t));
185 sum =
187 sum = GNUNET_CRYPTO_crc16_step (sum, payload, payload_length);
189}

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

197{
198 uint32_t sum;
199 uint16_t tmp;
200
201 GNUNET_assert (8 == sizeof(struct GNUNET_TUN_UdpHeader));
202 GNUNET_assert (payload_length + sizeof(struct GNUNET_TUN_IPv4Header)
203 + sizeof(struct GNUNET_TUN_UdpHeader) ==
204 ntohs (ip->total_length));
205 GNUNET_assert (IPPROTO_UDP == ip->protocol);
206
207 udp->crc =
208 0; /* technically optional, but we calculate it anyway, just to be sure */
210 &ip->source_address,
211 sizeof(struct in_addr) * 2);
212 tmp = htons (IPPROTO_UDP);
213 sum = GNUNET_CRYPTO_crc16_step (sum, &tmp, sizeof(uint16_t));
214 tmp = htons (sizeof(struct GNUNET_TUN_UdpHeader) + payload_length);
215 sum = GNUNET_CRYPTO_crc16_step (sum, &tmp, sizeof(uint16_t));
216 sum =
218 sum = GNUNET_CRYPTO_crc16_step (sum, payload, payload_length);
220}
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 224 of file tun.c.

228{
229 uint32_t sum;
230 uint32_t tmp;
231
232 GNUNET_assert (payload_length + sizeof(struct GNUNET_TUN_UdpHeader) ==
233 ntohs (ip->payload_length));
234 GNUNET_assert (payload_length + sizeof(struct GNUNET_TUN_UdpHeader) ==
235 ntohs (udp->len));
236 GNUNET_assert (IPPROTO_UDP == ip->next_header);
237
238 udp->crc = 0;
240 &ip->source_address,
241 sizeof(struct in6_addr) * 2);
242 tmp = htons (sizeof(struct GNUNET_TUN_UdpHeader)
243 + payload_length); /* aka udp->len */
244 sum = GNUNET_CRYPTO_crc16_step (sum, &tmp, sizeof(uint32_t));
245 tmp = htons (ip->next_header);
246 sum = GNUNET_CRYPTO_crc16_step (sum, &tmp, sizeof(uint32_t));
247 sum =
249 sum = GNUNET_CRYPTO_crc16_step (sum, payload, payload_length);
251}

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

258{
259 uint32_t sum;
260
261 GNUNET_assert (8 == sizeof(struct GNUNET_TUN_IcmpHeader));
262 icmp->crc = 0;
263 sum =
264 GNUNET_CRYPTO_crc16_step (0, icmp, sizeof(struct GNUNET_TUN_IcmpHeader));
265 sum = GNUNET_CRYPTO_crc16_step (sum, payload, payload_length);
267}

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

40{
42 strlen (service_name),
43 hc);
44}
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 279 of file tun.c.

282{
283 if (sa->sa_family != sb->sa_family)
284 return GNUNET_NO;
285
286 switch (sa->sa_family)
287 {
288 case AF_INET: {
289 const struct sockaddr_in *sa4 = (const struct sockaddr_in *) sa;
290 const struct sockaddr_in *sb4 = (const struct sockaddr_in *) sb;
291 if ((include_port) && (sa4->sin_port != sb4->sin_port))
292 return GNUNET_NO;
293 return(sa4->sin_addr.s_addr == sb4->sin_addr.s_addr);
294 }
295
296 case AF_INET6: {
297 const struct sockaddr_in6 *sa6 = (const struct sockaddr_in6 *) sa;
298 const struct sockaddr_in6 *sb6 = (const struct sockaddr_in6 *) sb;
299
300 if ((include_port) && (sa6->sin6_port != sb6->sin6_port))
301 return GNUNET_NO;
302 return(
303 0 == memcmp (&sa6->sin6_addr, &sb6->sin6_addr, sizeof(struct
304 in6_addr)));
305 }
306
307 default:
308 GNUNET_break (0);
309 return GNUNET_SYSERR;
310 }
311}
@ 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 57 of file tun.c.

60{
61 uint16_t be_port = htons (ip_port);
62
63 *cadet_port = *desc;
65 &be_port,
66 sizeof(uint16_t));
67}
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