fixing 2012: network structure alignment now forced to be correct even on W32 using...
[oweals/gnunet.git] / src / vpn / gnunet-vpn-packet.h
1 #ifndef _GNTUN_PACKET_H_
2 #define _GNTUN_PACKET_H_
3
4 #include "platform.h"
5 #include "gnunet_common.h"
6
7 GNUNET_NETWORK_STRUCT_BEGIN
8
9 // Headers
10 struct pkt_tun
11 {
12   unsigned flags:16 GNUNET_PACKED;
13   unsigned type:16 GNUNET_PACKED;
14 };
15
16 struct ip6_hdr
17 {
18   unsigned tclass_h:4 GNUNET_PACKED;
19   unsigned version:4 GNUNET_PACKED;
20   unsigned tclass_l:4 GNUNET_PACKED;
21   unsigned flowlbl:20 GNUNET_PACKED;
22   unsigned paylgth:16 GNUNET_PACKED;
23   unsigned nxthdr:8 GNUNET_PACKED;
24   unsigned hoplmt:8 GNUNET_PACKED;
25   unsigned char sadr[16];
26   unsigned char dadr[16];
27 };
28
29 struct ip_hdr
30 {
31   unsigned hdr_lngth:4 GNUNET_PACKED;
32   unsigned version:4 GNUNET_PACKED;
33
34   unsigned diff_serv:8 GNUNET_PACKED;
35   unsigned tot_lngth:16 GNUNET_PACKED;
36
37   unsigned ident:16 GNUNET_PACKED;
38   unsigned flags:3 GNUNET_PACKED;
39   unsigned frag_off:13 GNUNET_PACKED;
40
41   unsigned ttl:8 GNUNET_PACKED;
42   unsigned proto:8 GNUNET_PACKED;
43   unsigned chks:16 GNUNET_PACKED;
44
45   uint32_t sadr GNUNET_PACKED;
46   uint32_t dadr GNUNET_PACKED;
47 };
48
49 #define TCP_FLAG_SYN 2
50
51 struct tcp_pkt
52 {
53   unsigned spt:16 GNUNET_PACKED;
54   unsigned dpt:16 GNUNET_PACKED;
55   unsigned seq:32 GNUNET_PACKED;
56   unsigned ack:32 GNUNET_PACKED;
57   unsigned off:4 GNUNET_PACKED;
58   unsigned rsv:4 GNUNET_PACKED;
59   unsigned flg:8 GNUNET_PACKED;
60   unsigned wsz:16 GNUNET_PACKED;
61   unsigned crc:16 GNUNET_PACKED;
62   unsigned urg:16 GNUNET_PACKED;
63 };
64
65 struct udp_pkt
66 {
67   unsigned spt:16 GNUNET_PACKED;
68   unsigned dpt:16 GNUNET_PACKED;
69   unsigned len:16 GNUNET_PACKED;
70   unsigned crc:16 GNUNET_PACKED;
71 };
72
73 struct icmp_hdr
74 {
75   unsigned type:8 GNUNET_PACKED;
76   unsigned code:8 GNUNET_PACKED;
77   unsigned chks:16 GNUNET_PACKED;
78 };
79
80 // DNS-Stuff
81 struct dns_static
82 {
83   uint16_t id GNUNET_PACKED;
84
85   unsigned rd:1 GNUNET_PACKED;  // recursion desired (client -> server)
86   unsigned tc:1 GNUNET_PACKED;  // message is truncated
87   unsigned aa:1 GNUNET_PACKED;  // authoritative answer
88   unsigned op:4 GNUNET_PACKED;  // query:0, inverse q.:1, status: 2
89   unsigned qr:1 GNUNET_PACKED;  // query:0, response:1
90
91   unsigned rcode:4 GNUNET_PACKED;       // 0 No error
92   // 1 Format error
93   // 2 Server failure
94   // 3 Name Error
95   // 4 Not Implemented
96   // 5 Refused
97   unsigned z:3 GNUNET_PACKED;   // reserved
98   unsigned ra:1 GNUNET_PACKED;  // recursion available (server -> client)
99
100   uint16_t qdcount GNUNET_PACKED;       // number of questions
101   uint16_t ancount GNUNET_PACKED;       // number of answers
102   uint16_t nscount GNUNET_PACKED;       // number of authority-records
103   uint16_t arcount GNUNET_PACKED;       // number of additional records
104 };
105 GNUNET_NETWORK_STRUCT_END
106
107 struct dns_pkt
108 {
109   struct dns_static s;
110   unsigned char data[1];
111 };
112
113 struct dns_pkt_parsed
114 {
115   struct dns_static s;
116   struct dns_query **queries;
117   struct dns_record **answers;
118   struct dns_record **nameservers;
119   struct dns_record **additional;
120 };
121
122 struct dns_query_line
123 {
124   unsigned short type;
125   unsigned short class;
126 };
127
128 struct dns_query
129 {
130   char *name;
131   unsigned char namelen;
132   unsigned short qtype;
133   unsigned short qclass;
134 };
135
136 struct dns_record_line
137 {
138   unsigned short type;
139   unsigned short class;
140   unsigned int ttl;
141   unsigned short data_len;
142   unsigned char data;
143 };
144
145 struct dns_record
146 {
147   char *name;
148   unsigned char namelen;
149   unsigned short type;
150   unsigned short class;
151   unsigned int ttl;
152   unsigned short data_len;
153   unsigned char *data;
154 };
155
156 struct udp_dns
157 {
158   struct udp_pkt udp_hdr;
159   struct dns_pkt data;
160 };
161
162 GNUNET_NETWORK_STRUCT_BEGIN
163
164 // Complete Packets
165 struct tun_pkt
166 {
167   struct GNUNET_MessageHeader shdr;
168   struct pkt_tun tun;
169 };
170
171 struct ip6_pkt
172 {
173   struct GNUNET_MessageHeader shdr;
174   struct pkt_tun tun;
175   struct ip6_hdr ip6_hdr;
176   unsigned char data[1];
177 };
178
179 struct ip6_tcp
180 {
181   struct GNUNET_MessageHeader shdr;
182   struct pkt_tun tun;
183   struct ip6_hdr ip6_hdr;
184   struct tcp_pkt tcp_hdr;
185   unsigned char data[1];
186 };
187
188 struct ip6_icmp
189 {
190   struct GNUNET_MessageHeader shdr;
191   struct pkt_tun tun;
192   struct ip6_hdr ip6_hdr;
193   struct icmp_hdr icmp_hdr;
194 };
195
196 struct ip6_udp
197 {
198   struct GNUNET_MessageHeader shdr;
199   struct pkt_tun tun;
200   struct ip6_hdr ip6_hdr;
201   struct udp_pkt udp_hdr;
202   unsigned char data[1];
203 };
204
205 struct ip6_udp_dns
206 {
207   struct GNUNET_MessageHeader shdr;
208   struct pkt_tun tun;
209   struct ip6_hdr ip6_hdr;
210   struct udp_dns udp_dns;
211 };
212
213 struct ip_pkt
214 {
215   struct GNUNET_MessageHeader shdr;
216   struct pkt_tun tun;
217   struct ip_hdr ip_hdr;
218   unsigned char data[1];
219 };
220
221 struct ip_udp
222 {
223   struct GNUNET_MessageHeader shdr;
224   struct pkt_tun tun;
225   struct ip_hdr ip_hdr;
226   struct udp_pkt udp_hdr;
227   unsigned char data[1];
228 };
229
230 struct ip_udp_dns
231 {
232   struct GNUNET_MessageHeader shdr;
233   struct pkt_tun tun;
234   struct ip_hdr ip_hdr;
235   struct udp_dns udp_dns;
236 };
237
238 struct ip_tcp
239 {
240   struct GNUNET_MessageHeader shdr;
241   struct pkt_tun tun;
242   struct ip_hdr ip_hdr;
243   struct tcp_pkt tcp_hdr;
244   unsigned char data[1];
245 };
246
247 struct ip_icmp
248 {
249   struct GNUNET_MessageHeader shdr;
250   struct pkt_tun tun;
251   struct ip_hdr ip_hdr;
252   struct icmp_hdr icmp_hdr;
253 };
254 GNUNET_NETWORK_STRUCT_END
255
256 #endif