for w32 port
[oweals/gnunet.git] / src / vpn / gnunet-vpn-packet.h
index c19e7a101a2df175754ff85950206e78fe06a9cb..3df33a3f1ed0cacf3508a40328ecca13d9b155a3 100644 (file)
 #ifndef _GNTUN_PACKET_H_
 #define _GNTUN_PACKET_H_
 
+#include "gnunet-vpn-helper-p.h"
+#include "gnunet_common.h"
+
+// Headers
 struct pkt_tun {
-       unsigned flags:16;
-       unsigned type:16;
+       unsigned flags:16 GNUNET_PACKED;
+       unsigned type:16 GNUNET_PACKED;
 };
 
 struct ip6_hdr {
-       unsigned version:4;
-       unsigned tclass:8;
-       unsigned flowlbl:20;
-       unsigned paylgth:16;
-       unsigned nxthdr:8;
-       unsigned hoplmt:8;
+       unsigned version:4 GNUNET_PACKED;
+       unsigned tclass:8 GNUNET_PACKED;
+       unsigned flowlbl:20 GNUNET_PACKED;
+       unsigned paylgth:16 GNUNET_PACKED;
+       unsigned nxthdr:8 GNUNET_PACKED;
+       unsigned hoplmt:8 GNUNET_PACKED;
        unsigned char sadr[16];
        unsigned char dadr[16];
 };
 
+struct ip_hdr {
+       unsigned hdr_lngth:4 GNUNET_PACKED;
+       unsigned version:4 GNUNET_PACKED;
+
+       unsigned diff_serv:8 GNUNET_PACKED;
+       unsigned tot_lngth:16 GNUNET_PACKED;
+
+       unsigned ident:16 GNUNET_PACKED;
+       unsigned flags:3 GNUNET_PACKED;
+       unsigned frag_off:13 GNUNET_PACKED;
+
+       unsigned ttl:8 GNUNET_PACKED;
+       unsigned proto:8 GNUNET_PACKED;
+       unsigned chks:16 GNUNET_PACKED;
+
+       unsigned sadr:32 GNUNET_PACKED;
+       unsigned dadr:32 GNUNET_PACKED;
+};
+
 struct tcp_pkt {
-       unsigned spt:16;
-       unsigned dpt:16;
-       unsigned seq:32;
-       unsigned ack:32;
-       unsigned off:4;
-       unsigned rsv:4;
-       unsigned flg:8;
-       unsigned wsz:16;
-       unsigned crc:16;
-       unsigned urg:16;
-       unsigned char data[1];
+       unsigned spt:16 GNUNET_PACKED;
+       unsigned dpt:16 GNUNET_PACKED;
+       unsigned seq:32 GNUNET_PACKED;
+       unsigned ack:32 GNUNET_PACKED;
+       unsigned off:4 GNUNET_PACKED;
+       unsigned rsv:4 GNUNET_PACKED;
+       unsigned flg:8 GNUNET_PACKED;
+       unsigned wsz:16 GNUNET_PACKED;
+       unsigned crc:16 GNUNET_PACKED;
+       unsigned urg:16 GNUNET_PACKED;
 };
 
 struct udp_pkt {
-       unsigned spt:16;
-       unsigned dpt:16;
-       unsigned len:16;
-       unsigned crc:16;
+       unsigned spt:16 GNUNET_PACKED;
+       unsigned dpt:16 GNUNET_PACKED;
+       unsigned len:16 GNUNET_PACKED;
+       unsigned crc:16 GNUNET_PACKED;
 };
 
-struct dns_pkt {
-       unsigned short id;
+// DNS-Stuff
+struct dns_static {
+       unsigned short id GNUNET_PACKED;
 
-       unsigned rd:1; // recursion desired (client -> server)
-       unsigned tc:1; // message is truncated
-       unsigned aa:1; // authoritative answer
-       unsigned op:4; // query:0, inverse q.:1, status: 2
-       unsigned qr:1; // query:0, response:1
+       unsigned rd:1 GNUNET_PACKED; // recursion desired (client -> server)
+       unsigned tc:1 GNUNET_PACKED; // message is truncated
+       unsigned aa:1 GNUNET_PACKED; // authoritative answer
+       unsigned op:4 GNUNET_PACKED; // query:0, inverse q.:1, status: 2
+       unsigned qr:1 GNUNET_PACKED; // query:0, response:1
 
-       unsigned rcode:4; // 0 No error
+       unsigned rcode:4 GNUNET_PACKED; // 0 No error
                          // 1 Format error
                          // 2 Server failure
                          // 3 Name Error
                          // 4 Not Implemented
                          // 5 Refused
-       unsigned z:3;  // reserved
-       unsigned ra:1; // recursion available (server -> client)
+       unsigned z:3 GNUNET_PACKED;  // reserved
+       unsigned ra:1 GNUNET_PACKED; // recursion available (server -> client)
 
-       unsigned short qdcount; // number of questions
-       unsigned short ancount; // number of answers
-       unsigned short nscount; // number of authority-records
-       unsigned short arcount; // number of additional records
+       unsigned short qdcount GNUNET_PACKED; // number of questions
+       unsigned short ancount GNUNET_PACKED; // number of answers
+       unsigned short nscount GNUNET_PACKED; // number of authority-records
+       unsigned short arcount GNUNET_PACKED; // number of additional records
+};
+
+struct dns_pkt {
+       struct dns_static s;
        unsigned char data[1];
 };
 
+struct dns_pkt_parsed {
+       struct dns_static s;
+       struct dns_query** queries;
+       struct dns_record** answers;
+       struct dns_record** nameservers;
+       struct dns_record** additional;
+};
+
 struct dns_query {
-       unsigned char* name;
+       char* name;
+       unsigned char namelen;
        unsigned short qtype;
        unsigned short qclass;
 };
 
 struct dns_record {
-       unsigned char* name;
+       char* name;
+       unsigned char namelen;
        unsigned short type;
        unsigned short class;
        unsigned int ttl;
@@ -78,37 +115,66 @@ struct dns_record {
        unsigned char* data;
 };
 
+struct udp_dns {
+       struct udp_pkt udp_hdr;
+       struct dns_pkt data;
+};
+
+// Complete Packets
+struct tun_pkt {
+       struct GNUNET_MessageHeader shdr;
+       struct pkt_tun tun;
+};
+
 struct ip6_pkt {
+       struct GNUNET_MessageHeader shdr;
        struct pkt_tun tun;
-       struct ip6_hdr hdr;
+       struct ip6_hdr ip6_hdr;
        unsigned char data[1];
 };
 
 struct ip6_tcp {
+       struct GNUNET_MessageHeader shdr;
        struct pkt_tun tun;
-       struct ip6_hdr hdr;
-       struct tcp_pkt data;
+       struct ip6_hdr ip6_hdr;
+       struct tcp_pkt tcp_hdr;
+       unsigned char data[1];
 };
 
 struct ip6_udp {
+       struct GNUNET_MessageHeader shdr;
        struct pkt_tun tun;
-       struct ip6_hdr hdr;
-       struct udp_pkt data;
+       struct ip6_hdr ip6_hdr;
+       struct udp_pkt udp_hdr;
+       unsigned char data[1];
 };
 
-void send_pkt(int fd, struct ip6_pkt* pkt);
-int recv_ipv6pkt(int fd, struct pkt_tun** pkt);
-int recv_pkt(int fd, struct pkt_tun** pkt);
-struct ip6_pkt* parse_ip6(struct pkt_tun* pkt);
-
 struct ip6_udp_dns {
-       struct ip6_udp hdr;
-       struct dns_pkt data;
+       struct GNUNET_MessageHeader shdr;
+       struct pkt_tun tun;
+       struct ip6_hdr ip6_hdr;
+       struct udp_dns udp_dns;
 };
 
-struct ip6_tcp* parse_ip6_tcp(struct ip6_pkt*);
-struct ip6_udp* parse_ip6_udp(struct ip6_pkt*);
+struct ip_pkt {
+       struct GNUNET_MessageHeader shdr;
+       struct pkt_tun tun;
+       struct ip_hdr ip_hdr;
+       unsigned char data[1];
+};
 
-short payload(struct ip6_hdr* pkt);
+struct ip_udp {
+       struct GNUNET_MessageHeader shdr;
+       struct pkt_tun tun;
+       struct ip_hdr ip_hdr;
+       struct udp_pkt udp_hdr;
+       unsigned char data[1];
+};
+struct ip_udp_dns {
+       struct GNUNET_MessageHeader shdr;
+       struct pkt_tun tun;
+       struct ip_hdr ip_hdr;
+       struct udp_dns udp_dns;
+};
 
 #endif