This bitfield-stuff does not work as I expect
[oweals/gnunet.git] / src / vpn / gnunet-vpn-packet.h
1 #ifndef _GNTUN_PACKET_H_
2 #define _GNTUN_PACKET_H_
3
4 #include "gnunet-vpn-helper-p.h"
5 #include "gnunet_common.h"
6
7 // Headers
8 struct pkt_tun {
9         unsigned flags:16 GNUNET_PACKED;
10         unsigned type:16 GNUNET_PACKED;
11 };
12
13 struct ip6_hdr {
14         unsigned tclass_h:4 GNUNET_PACKED;
15         unsigned version:4 GNUNET_PACKED;
16         unsigned tclass_l:4 GNUNET_PACKED;
17         unsigned flowlbl:20 GNUNET_PACKED;
18         unsigned paylgth:16 GNUNET_PACKED;
19         unsigned nxthdr:8 GNUNET_PACKED;
20         unsigned hoplmt:8 GNUNET_PACKED;
21         unsigned char sadr[16];
22         unsigned char dadr[16];
23 };
24
25 struct ip_hdr {
26         unsigned hdr_lngth:4 GNUNET_PACKED;
27         unsigned version:4 GNUNET_PACKED;
28
29         unsigned diff_serv:8 GNUNET_PACKED;
30         unsigned tot_lngth:16 GNUNET_PACKED;
31
32         unsigned ident:16 GNUNET_PACKED;
33         unsigned flags:3 GNUNET_PACKED;
34         unsigned frag_off:13 GNUNET_PACKED;
35
36         unsigned ttl:8 GNUNET_PACKED;
37         unsigned proto:8 GNUNET_PACKED;
38         unsigned chks:16 GNUNET_PACKED;
39
40         unsigned sadr:32 GNUNET_PACKED;
41         unsigned dadr:32 GNUNET_PACKED;
42 };
43
44 struct tcp_pkt {
45         unsigned spt:16 GNUNET_PACKED;
46         unsigned dpt:16 GNUNET_PACKED;
47         unsigned seq:32 GNUNET_PACKED;
48         unsigned ack:32 GNUNET_PACKED;
49         unsigned off:4 GNUNET_PACKED;
50         unsigned rsv:4 GNUNET_PACKED;
51         unsigned flg:8 GNUNET_PACKED;
52         unsigned wsz:16 GNUNET_PACKED;
53         unsigned crc:16 GNUNET_PACKED;
54         unsigned urg:16 GNUNET_PACKED;
55 };
56
57 struct udp_pkt {
58         unsigned spt:16 GNUNET_PACKED;
59         unsigned dpt:16 GNUNET_PACKED;
60         unsigned len:16 GNUNET_PACKED;
61         unsigned crc:16 GNUNET_PACKED;
62 };
63
64 // DNS-Stuff
65 struct dns_static {
66         unsigned short id GNUNET_PACKED;
67
68         unsigned rd:1 GNUNET_PACKED; // recursion desired (client -> server)
69         unsigned tc:1 GNUNET_PACKED; // message is truncated
70         unsigned aa:1 GNUNET_PACKED; // authoritative answer
71         unsigned op:4 GNUNET_PACKED; // query:0, inverse q.:1, status: 2
72         unsigned qr:1 GNUNET_PACKED; // query:0, response:1
73
74         unsigned rcode:4 GNUNET_PACKED; // 0 No error
75                           // 1 Format error
76                           // 2 Server failure
77                           // 3 Name Error
78                           // 4 Not Implemented
79                           // 5 Refused
80         unsigned z:3 GNUNET_PACKED;  // reserved
81         unsigned ra:1 GNUNET_PACKED; // recursion available (server -> client)
82
83         unsigned short qdcount GNUNET_PACKED; // number of questions
84         unsigned short ancount GNUNET_PACKED; // number of answers
85         unsigned short nscount GNUNET_PACKED; // number of authority-records
86         unsigned short arcount GNUNET_PACKED; // number of additional records
87 };
88
89 struct dns_pkt {
90         struct dns_static s;
91         unsigned char data[1];
92 };
93
94 struct dns_pkt_parsed {
95         struct dns_static s;
96         struct dns_query** queries;
97         struct dns_record** answers;
98         struct dns_record** nameservers;
99         struct dns_record** additional;
100 };
101
102 struct dns_query_line {
103     unsigned short type;
104     unsigned short class;
105 };
106
107 struct dns_query {
108         char* name;
109         unsigned char namelen;
110         unsigned short qtype;
111         unsigned short qclass;
112 };
113
114 struct dns_record_line {
115     unsigned short type;
116     unsigned short class;
117     unsigned int ttl;
118     unsigned short data_len;
119     unsigned char data;
120 };
121
122 struct dns_record {
123         char* name;
124         unsigned char namelen;
125         unsigned short type;
126         unsigned short class;
127         unsigned int ttl;
128         unsigned short data_len;
129         unsigned char* data;
130 };
131
132 struct udp_dns {
133         struct udp_pkt udp_hdr;
134         struct dns_pkt data;
135 };
136
137 // Complete Packets
138 struct tun_pkt {
139         struct GNUNET_MessageHeader shdr;
140         struct pkt_tun tun;
141 };
142
143 struct ip6_pkt {
144         struct GNUNET_MessageHeader shdr;
145         struct pkt_tun tun;
146         struct ip6_hdr ip6_hdr;
147         unsigned char data[1];
148 };
149
150 struct ip6_tcp {
151         struct GNUNET_MessageHeader shdr;
152         struct pkt_tun tun;
153         struct ip6_hdr ip6_hdr;
154         struct tcp_pkt tcp_hdr;
155         unsigned char data[1];
156 };
157
158 struct ip6_udp {
159         struct GNUNET_MessageHeader shdr;
160         struct pkt_tun tun;
161         struct ip6_hdr ip6_hdr;
162         struct udp_pkt udp_hdr;
163         unsigned char data[1];
164 };
165
166 struct ip6_udp_dns {
167         struct GNUNET_MessageHeader shdr;
168         struct pkt_tun tun;
169         struct ip6_hdr ip6_hdr;
170         struct udp_dns udp_dns;
171 };
172
173 struct ip_pkt {
174         struct GNUNET_MessageHeader shdr;
175         struct pkt_tun tun;
176         struct ip_hdr ip_hdr;
177         unsigned char data[1];
178 };
179
180 struct ip_udp {
181         struct GNUNET_MessageHeader shdr;
182         struct pkt_tun tun;
183         struct ip_hdr ip_hdr;
184         struct udp_pkt udp_hdr;
185         unsigned char data[1];
186 };
187 struct ip_udp_dns {
188         struct GNUNET_MessageHeader shdr;
189         struct pkt_tun tun;
190         struct ip_hdr ip_hdr;
191         struct udp_dns udp_dns;
192 };
193
194 #endif