Pack the network-structs
[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 version:4 GNUNET_PACKED;
15         unsigned tclass:8 GNUNET_PACKED;
16         unsigned flowlbl:20 GNUNET_PACKED;
17         unsigned paylgth:16 GNUNET_PACKED;
18         unsigned nxthdr:8 GNUNET_PACKED;
19         unsigned hoplmt:8 GNUNET_PACKED;
20         unsigned char sadr[16];
21         unsigned char dadr[16];
22 };
23
24 struct tcp_pkt {
25         unsigned spt:16 GNUNET_PACKED;
26         unsigned dpt:16 GNUNET_PACKED;
27         unsigned seq:32 GNUNET_PACKED;
28         unsigned ack:32 GNUNET_PACKED;
29         unsigned off:4 GNUNET_PACKED;
30         unsigned rsv:4 GNUNET_PACKED;
31         unsigned flg:8 GNUNET_PACKED;
32         unsigned wsz:16 GNUNET_PACKED;
33         unsigned crc:16 GNUNET_PACKED;
34         unsigned urg:16 GNUNET_PACKED;
35 };
36
37 struct udp_pkt {
38         unsigned spt:16 GNUNET_PACKED;
39         unsigned dpt:16 GNUNET_PACKED;
40         unsigned len:16 GNUNET_PACKED;
41         unsigned crc:16 GNUNET_PACKED;
42 };
43
44 // DNS-Stuff
45 struct dns_pkt {
46         unsigned short id GNUNET_PACKED;
47
48         unsigned rd:1 GNUNET_PACKED; // recursion desired (client -> server)
49         unsigned tc:1 GNUNET_PACKED; // message is truncated
50         unsigned aa:1 GNUNET_PACKED; // authoritative answer
51         unsigned op:4 GNUNET_PACKED; // query:0, inverse q.:1, status: 2
52         unsigned qr:1 GNUNET_PACKED; // query:0, response:1
53
54         unsigned rcode:4 GNUNET_PACKED; // 0 No error
55                           // 1 Format error
56                           // 2 Server failure
57                           // 3 Name Error
58                           // 4 Not Implemented
59                           // 5 Refused
60         unsigned z:3 GNUNET_PACKED;  // reserved
61         unsigned ra:1 GNUNET_PACKED; // recursion available (server -> client)
62
63         unsigned short qdcount GNUNET_PACKED; // number of questions
64         unsigned short ancount GNUNET_PACKED; // number of answers
65         unsigned short nscount GNUNET_PACKED; // number of authority-records
66         unsigned short arcount GNUNET_PACKED; // number of additional records
67         unsigned char data[1];
68 };
69
70 struct dns_query {
71         unsigned char* name;
72         unsigned short qtype;
73         unsigned short qclass;
74 };
75
76 struct dns_record {
77         unsigned char* name;
78         unsigned short type;
79         unsigned short class;
80         unsigned int ttl;
81         unsigned short data_len;
82         unsigned char* data;
83 };
84
85 // Complete Packets
86 struct ip6_pkt {
87         struct GNUNET_MessageHeader shdr;
88         struct pkt_tun tun;
89         struct ip6_hdr ip6_hdr;
90         unsigned char data[1];
91 };
92
93 struct ip6_tcp {
94         struct GNUNET_MessageHeader shdr;
95         struct pkt_tun tun;
96         struct ip6_hdr ip6_hdr;
97         struct tcp_pkt tcp_hdr;
98         unsigned char data[1];
99 };
100
101 struct ip6_udp {
102         struct GNUNET_MessageHeader shdr;
103         struct pkt_tun tun;
104         struct ip6_hdr ip6_hdr;
105         struct udp_pkt udp_hdr;
106         unsigned char data[1];
107 };
108
109 struct ip6_udp_dns {
110         struct GNUNET_MessageHeader shdr;
111         struct pkt_tun tun;
112         struct ip6_hdr ip6_hdr;
113         struct udp_pkt udp_hdr;
114         struct dns_pkt data;
115 };
116
117 #endif