--- /dev/null
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/uio.h>
+
+#include <linux/if_tun.h>
+
+#include "debug.h"
+#include "packet.h"
+#include "arpa/inet.h"
+
+short payload(struct ip6_hdr* hdr) {{{
+ return ntohs(hdr->paylgth);
+}}}
+
+void send_pkt(int fd, struct ip6_pkt* pkt) {{{
+ int sz = payload(&(pkt->hdr));
+ int w = 0;
+ char* buf = (char*)pkt;
+
+ w = 0;
+ while ( w > 0) {
+ int t = write(fd, buf+w, (sz + 40) - w);
+ if (t < 0)
+ debug(1, 0, "packet: write : %s\n", strerror(errno));
+ else
+ w+=t;
+ }
+
+ free(buf);
+}}}
+
+int recv_pkt(int fd, struct pkt_tun** pkt) {{{
+ int size = 1504;
+ unsigned char data[size];
+
+ debug(1, 0, "beginning to read...\n");
+
+ int r = read(fd, data, size);
+ debug(1, 0, "read %d bytes\n", r);
+
+ *pkt = (struct pkt_tun*)malloc(r);
+
+ memcpy(*pkt, data, r);
+ struct pkt_tun *_pkt = *pkt;
+
+ debug(1, 0, "read the flags: %04x\n", ntohs(_pkt->flags));
+ debug(1, 0, "read the type: %04x\n", ntohs(_pkt->type));
+
+ switch(ntohs(_pkt->type)) {
+ case 0x86dd:
+ debug(1, 0, "reading an ipv6-packet\n");
+ struct ip6_pkt * pkt6 = (struct ip6_pkt*) *pkt;
+ size = payload(&(pkt6->hdr));
+ // TODO: size might be greater than r!
+ debug(1, 0, "read the size: %d\n", size);
+ return size;
+ break;
+ case 0x0800:
+ debug(1, 0, "unknown pkt-type: IPv4\n");
+ //IPv4 TODO
+ break;
+ default:
+ debug(1, 0, "unknown pkt-type: 0x%02x\n", 0x800);
+ //Whatever TODO
+ break;
+ }
+ return -1;
+}}}
+
+struct ip6_pkt* parse_ip6(struct pkt_tun* pkt) {{{
+ struct ip6_pkt* pkt6 = (struct ip6_pkt*)pkt;
+
+ return pkt6;
+}}}
+
+struct ip6_tcp* parse_ip6_tcp(struct ip6_pkt* pkt) {{{
+ struct ip6_tcp* res = (struct ip6_tcp*) pkt;
+
+ return res;
+}}}
+
+struct ip6_udp* parse_ip6_udp(struct ip6_pkt* pkt) {{{
+ struct ip6_udp* res = (struct ip6_udp*) pkt;
+
+ return res;
+}}}
--- /dev/null
+#ifndef _GNTUN_PACKET_H_
+#define _GNTUN_PACKET_H_
+
+struct pkt_tun {
+ unsigned flags:16;
+ unsigned type:16;
+};
+
+struct ip6_hdr {
+ unsigned version:4;
+ unsigned tclass:8;
+ unsigned flowlbl:20;
+ unsigned paylgth:16;
+ unsigned nxthdr:8;
+ unsigned hoplmt:8;
+ unsigned char sadr[16];
+ unsigned char dadr[16];
+};
+
+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];
+};
+
+struct udp_pkt {
+ unsigned spt:16;
+ unsigned dpt:16;
+ unsigned len:16;
+ unsigned crc:16;
+};
+
+struct dns_pkt {
+ unsigned short id;
+
+ 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 rcode:4; // 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 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 char data[1];
+};
+
+struct dns_query {
+ unsigned char* name;
+ unsigned short qtype;
+ unsigned short qclass;
+};
+
+struct dns_record {
+ unsigned char* name;
+ unsigned short type;
+ unsigned short class;
+ unsigned int ttl;
+ unsigned short data_len;
+ unsigned char* data;
+};
+
+struct ip6_pkt {
+ struct pkt_tun tun;
+ struct ip6_hdr hdr;
+ unsigned char data[1];
+};
+
+struct ip6_tcp {
+ struct pkt_tun tun;
+ struct ip6_hdr hdr;
+ struct tcp_pkt data;
+};
+
+struct ip6_udp {
+ struct pkt_tun tun;
+ struct ip6_hdr hdr;
+ struct udp_pkt data;
+};
+
+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 ip6_tcp* parse_ip6_tcp(struct ip6_pkt*);
+struct ip6_udp* parse_ip6_udp(struct ip6_pkt*);
+
+short payload(struct ip6_hdr* pkt);
+
+#endif
+++ /dev/null
-#include <errno.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <sys/uio.h>
-
-#include <linux/if_tun.h>
-
-#include "debug.h"
-#include "packet.h"
-#include "arpa/inet.h"
-
-short payload(struct ip6_hdr* hdr) {{{
- return ntohs(hdr->paylgth);
-}}}
-
-void send_pkt(int fd, struct ip6_pkt* pkt) {{{
- int sz = payload(&(pkt->hdr));
- int w = 0;
- char* buf = (char*)pkt;
-
- w = 0;
- while ( w > 0) {
- int t = write(fd, buf+w, (sz + 40) - w);
- if (t < 0)
- debug(1, 0, "packet: write : %s\n", strerror(errno));
- else
- w+=t;
- }
-
- free(buf);
-}}}
-
-int recv_pkt(int fd, struct pkt_tun** pkt) {{{
- int size = 1504;
- unsigned char data[size];
-
- debug(1, 0, "beginning to read...\n");
-
- int r = read(fd, data, size);
- debug(1, 0, "read %d bytes\n", r);
-
- *pkt = (struct pkt_tun*)malloc(r);
-
- memcpy(*pkt, data, r);
- struct pkt_tun *_pkt = *pkt;
-
- debug(1, 0, "read the flags: %04x\n", ntohs(_pkt->flags));
- debug(1, 0, "read the type: %04x\n", ntohs(_pkt->type));
-
- switch(ntohs(_pkt->type)) {
- case 0x86dd:
- debug(1, 0, "reading an ipv6-packet\n");
- struct ip6_pkt * pkt6 = (struct ip6_pkt*) *pkt;
- size = payload(&(pkt6->hdr));
- // TODO: size might be greater than r!
- debug(1, 0, "read the size: %d\n", size);
- return size;
- break;
- case 0x0800:
- debug(1, 0, "unknown pkt-type: IPv4\n");
- //IPv4 TODO
- break;
- default:
- debug(1, 0, "unknown pkt-type: 0x%02x\n", 0x800);
- //Whatever TODO
- break;
- }
- return -1;
-}}}
-
-struct ip6_pkt* parse_ip6(struct pkt_tun* pkt) {{{
- struct ip6_pkt* pkt6 = (struct ip6_pkt*)pkt;
-
- return pkt6;
-}}}
-
-struct ip6_tcp* parse_ip6_tcp(struct ip6_pkt* pkt) {{{
- struct ip6_tcp* res = (struct ip6_tcp*) pkt;
-
- return res;
-}}}
-
-struct ip6_udp* parse_ip6_udp(struct ip6_pkt* pkt) {{{
- struct ip6_udp* res = (struct ip6_udp*) pkt;
-
- return res;
-}}}
+++ /dev/null
-#ifndef _GNTUN_PACKET_H_
-#define _GNTUN_PACKET_H_
-
-struct pkt_tun {
- unsigned flags:16;
- unsigned type:16;
-};
-
-struct ip6_hdr {
- unsigned version:4;
- unsigned tclass:8;
- unsigned flowlbl:20;
- unsigned paylgth:16;
- unsigned nxthdr:8;
- unsigned hoplmt:8;
- unsigned char sadr[16];
- unsigned char dadr[16];
-};
-
-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];
-};
-
-struct udp_pkt {
- unsigned spt:16;
- unsigned dpt:16;
- unsigned len:16;
- unsigned crc:16;
-};
-
-struct dns_pkt {
- unsigned short id;
-
- 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 rcode:4; // 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 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 char data[1];
-};
-
-struct dns_query {
- unsigned char* name;
- unsigned short qtype;
- unsigned short qclass;
-};
-
-struct dns_record {
- unsigned char* name;
- unsigned short type;
- unsigned short class;
- unsigned int ttl;
- unsigned short data_len;
- unsigned char* data;
-};
-
-struct ip6_pkt {
- struct pkt_tun tun;
- struct ip6_hdr hdr;
- unsigned char data[1];
-};
-
-struct ip6_tcp {
- struct pkt_tun tun;
- struct ip6_hdr hdr;
- struct tcp_pkt data;
-};
-
-struct ip6_udp {
- struct pkt_tun tun;
- struct ip6_hdr hdr;
- struct udp_pkt data;
-};
-
-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 ip6_tcp* parse_ip6_tcp(struct ip6_pkt*);
-struct ip6_udp* parse_ip6_udp(struct ip6_pkt*);
-
-short payload(struct ip6_hdr* pkt);
-
-#endif