aboutsummaryrefslogtreecommitdiff
path: root/src/vpn/gnunet-vpn-packet.h
blob: 89b75ba35b379bd6bd7491f675d642d6fdbe5e00 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#ifndef _GNTUN_PACKET_H_
#define _GNTUN_PACKET_H_

#include "gnunet-vpn-helper-p.h"

// Headers
struct pkt_tun {
	unsigned flags:16;
	unsigned type:16;
};

struct ip6_hdr {
	unsigned version:4;
	unsigned tclass:8;
	unsigned flowlbl:20;
	unsigned paylgth:16;
	unsigned nxthdr:8;
	unsigned hoplmt:8;
	unsigned char sadr[16];
	unsigned char dadr[16];
};

struct tcp_pkt {
	unsigned spt:16;
	unsigned dpt:16;
	unsigned seq:32;
	unsigned ack:32;
	unsigned off:4;
	unsigned rsv:4;
	unsigned flg:8;
	unsigned wsz:16;
	unsigned crc:16;
	unsigned urg:16;
};

struct udp_pkt {
	unsigned spt:16;
	unsigned dpt:16;
	unsigned len:16;
	unsigned crc:16;
};

// DNS-Stuff
struct dns_pkt {
	unsigned short id;

	unsigned rd:1; // recursion desired (client -> server)
	unsigned tc:1; // message is truncated
	unsigned aa:1; // authoritative answer
	unsigned op:4; // query:0, inverse q.:1, status: 2
	unsigned qr:1; // query:0, response:1

	unsigned rcode:4; // 0 No error
	                  // 1 Format error
	                  // 2 Server failure
	                  // 3 Name Error
	                  // 4 Not Implemented
	                  // 5 Refused
	unsigned z:3;  // reserved
	unsigned ra:1; // recursion available (server -> client)

	unsigned short qdcount; // number of questions
	unsigned short ancount; // number of answers
	unsigned short nscount; // number of authority-records
	unsigned short arcount; // number of additional records
	unsigned char data[1];
};

struct dns_query {
	unsigned char* name;
	unsigned short qtype;
	unsigned short qclass;
};

struct dns_record {
	unsigned char* name;
	unsigned short type;
	unsigned short class;
	unsigned int ttl;
	unsigned short data_len;
	unsigned char* data;
};

// Complete Packets
struct ip6_pkt {
	struct suid_packet_header shdr;
	struct pkt_tun tun;
	struct ip6_hdr ip6_hdr;
	unsigned char data[1];
};

struct ip6_tcp {
	struct suid_packet_header shdr;
	struct pkt_tun tun;
	struct ip6_hdr ip6_hdr;
	struct tcp_pkt tcp_hdr;
	unsigned char data[1];
};

struct ip6_udp {
	struct suid_packet_header shdr;
	struct pkt_tun tun;
	struct ip6_hdr ip6_hdr;
	struct udp_pkt udp_hdr;
	unsigned char data[1];
};

struct ip6_udp_dns {
	struct suid_packet_header shdr;
	struct pkt_tun tun;
	struct ip6_hdr ip6_hdr;
	struct udp_pkt udp_hdr;
	struct dns_pkt data;
};

#endif