start the helper from the daemon, end it correctly
[oweals/gnunet.git] / src / vpn / packet.h
1 #ifndef _GNTUN_PACKET_H_
2 #define _GNTUN_PACKET_H_
3
4 struct pkt_tun {
5         unsigned flags:16;
6         unsigned type:16;
7 };
8
9 struct ip6_hdr {
10         unsigned version:4;
11         unsigned tclass:8;
12         unsigned flowlbl:20;
13         unsigned paylgth:16;
14         unsigned nxthdr:8;
15         unsigned hoplmt:8;
16         unsigned char sadr[16];
17         unsigned char dadr[16];
18 };
19
20 struct tcp_pkt {
21         unsigned spt:16;
22         unsigned dpt:16;
23         unsigned seq:32;
24         unsigned ack:32;
25         unsigned off:4;
26         unsigned rsv:4;
27         unsigned flg:8;
28         unsigned wsz:16;
29         unsigned crc:16;
30         unsigned urg:16;
31         unsigned char data[1];
32 };
33
34 struct udp_pkt {
35         unsigned spt:16;
36         unsigned dpt:16;
37         unsigned len:16;
38         unsigned crc:16;
39 };
40
41 struct dns_pkt {
42         unsigned short id;
43
44         unsigned rd:1; // recursion desired (client -> server)
45         unsigned tc:1; // message is truncated
46         unsigned aa:1; // authoritative answer
47         unsigned op:4; // query:0, inverse q.:1, status: 2
48         unsigned qr:1; // query:0, response:1
49
50         unsigned rcode:4; // 0 No error
51                           // 1 Format error
52                           // 2 Server failure
53                           // 3 Name Error
54                           // 4 Not Implemented
55                           // 5 Refused
56         unsigned z:3;  // reserved
57         unsigned ra:1; // recursion available (server -> client)
58
59         unsigned short qdcount; // number of questions
60         unsigned short ancount; // number of answers
61         unsigned short nscount; // number of authority-records
62         unsigned short arcount; // number of additional records
63         unsigned char data[1];
64 };
65
66 struct dns_query {
67         unsigned char* name;
68         unsigned short qtype;
69         unsigned short qclass;
70 };
71
72 struct dns_record {
73         unsigned char* name;
74         unsigned short type;
75         unsigned short class;
76         unsigned int ttl;
77         unsigned short data_len;
78         unsigned char* data;
79 };
80
81 struct ip6_pkt {
82         struct pkt_tun tun;
83         struct ip6_hdr hdr;
84         unsigned char data[1];
85 };
86
87 struct ip6_tcp {
88         struct pkt_tun tun;
89         struct ip6_hdr hdr;
90         struct tcp_pkt data;
91 };
92
93 struct ip6_udp {
94         struct pkt_tun tun;
95         struct ip6_hdr hdr;
96         struct udp_pkt data;
97 };
98
99 void send_pkt(int fd, struct ip6_pkt* pkt);
100 int recv_ipv6pkt(int fd, struct pkt_tun** pkt);
101 int recv_pkt(int fd, struct pkt_tun** pkt);
102 struct ip6_pkt* parse_ip6(struct pkt_tun* pkt);
103
104 struct ip6_udp_dns {
105         struct ip6_udp hdr;
106         struct dns_pkt data;
107 };
108
109 struct ip6_tcp* parse_ip6_tcp(struct ip6_pkt*);
110 struct ip6_udp* parse_ip6_udp(struct ip6_pkt*);
111
112 short payload(struct ip6_hdr* pkt);
113
114 #endif