nocpp
[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 id:16;
43         unsigned qr:1; // query:0, response:1
44         unsigned op:4; // query:0, inverse q.:1, status: 2
45         unsigned aa:1; // authoritative answer
46         unsigned tc:1; // message is truncated
47         unsigned rd:1; // recursion desired (client -> server)
48         unsigned ra:1; // recursion available (server -> client)
49         unsigned z:2;  // reserved
50         unsigned a:1;  // answer is signed by server
51         unsigned rcode:4; // 0 No error
52                           // 1 Format error
53                           // 2 Server failure
54                           // 3 Name Error
55                           // 4 Not Implemented
56                           // 5 Refused
57         unsigned qdcount:16; // number of questions
58         unsigned ancount:16; // number of answers
59         unsigned nscount:16; // number of authority-records
60         unsigned arcount:16; // number of additional records
61         unsigned char data[1];
62 };
63
64 struct ip6_pkt {
65         struct pkt_tun tun;
66         struct ip6_hdr hdr;
67         unsigned char data[1];
68 };
69
70 struct ip6_tcp {
71         struct pkt_tun tun;
72         struct ip6_hdr hdr;
73         struct tcp_pkt data;
74 };
75
76 struct ip6_udp {
77         struct pkt_tun tun;
78         struct ip6_hdr hdr;
79         struct udp_pkt data;
80 };
81
82 void send_pkt(int fd, struct ip6_pkt* pkt);
83 int recv_ipv6pkt(int fd, struct pkt_tun** pkt);
84 int recv_pkt(int fd, struct pkt_tun** pkt);
85 struct ip6_pkt* parse_ip6(struct pkt_tun* pkt);
86
87 struct ip6_tcp* parse_ip6_tcp(struct ip6_pkt*);
88 struct ip6_udp* parse_ip6_udp(struct ip6_pkt*);
89
90 short payload(struct ip6_hdr* pkt);
91
92 #endif