mirror of
https://github.com/yarrick/iodine.git
synced 2024-11-23 18:15:13 +00:00
cleanup in the tunnelcode, now sending the frameheader
This commit is contained in:
parent
20789ac53d
commit
5696b3c869
11
dns.c
11
dns.c
@ -326,14 +326,15 @@ dns_read(int fd, char *buf, int buflen)
|
|||||||
char name[255];
|
char name[255];
|
||||||
char rdata[4*1024];
|
char rdata[4*1024];
|
||||||
HEADER *header;
|
HEADER *header;
|
||||||
|
socklen_t addrlen;
|
||||||
char packet[64*1024];
|
char packet[64*1024];
|
||||||
|
struct sockaddr_in from;
|
||||||
|
|
||||||
r = recv(fd, packet, sizeof(packet), 0);
|
addrlen = sizeof(struct sockaddr);
|
||||||
|
r = recvfrom(fd, packet, sizeof(packet), 0, (struct sockaddr*)&from, &addrlen);
|
||||||
//printf("Read %d bytes DNS reply\n", r);
|
|
||||||
|
|
||||||
if(r == -1) {
|
if(r == -1) {
|
||||||
perror("recv");
|
perror("recvfrom");
|
||||||
} else {
|
} else {
|
||||||
header = (HEADER*)packet;
|
header = (HEADER*)packet;
|
||||||
|
|
||||||
@ -571,8 +572,6 @@ dnsd_read(int fd, char *buf, int buflen)
|
|||||||
addrlen = sizeof(struct sockaddr);
|
addrlen = sizeof(struct sockaddr);
|
||||||
r = recvfrom(fd, packet, sizeof(packet), 0, (struct sockaddr*)&from, &addrlen);
|
r = recvfrom(fd, packet, sizeof(packet), 0, (struct sockaddr*)&from, &addrlen);
|
||||||
|
|
||||||
//printf("Read %d bytes DNS query from %s\n", r, inet_ntoa(from.sin_addr));
|
|
||||||
|
|
||||||
if(r == -1) {
|
if(r == -1) {
|
||||||
perror("recvfrom");
|
perror("recvfrom");
|
||||||
} else {
|
} else {
|
||||||
|
60
iodine.c
60
iodine.c
@ -35,8 +35,6 @@
|
|||||||
#define MAX(a,b) ((a)>(b)?(a):(b))
|
#define MAX(a,b) ((a)>(b)?(a):(b))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define FRAMESIZE (64*1024)
|
|
||||||
|
|
||||||
int running = 1;
|
int running = 1;
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -51,11 +49,9 @@ tunnel(int tun_fd, int dns_fd)
|
|||||||
int read;
|
int read;
|
||||||
fd_set fds;
|
fd_set fds;
|
||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
struct tun_frame *frame;
|
char in[64*1024];
|
||||||
long buflen;
|
long outlen;
|
||||||
char buf[64*1024];
|
char out[64*1024];
|
||||||
|
|
||||||
frame = malloc(FRAMESIZE);
|
|
||||||
|
|
||||||
while (running) {
|
while (running) {
|
||||||
tv.tv_sec = 1;
|
tv.tv_sec = 1;
|
||||||
@ -79,37 +75,29 @@ tunnel(int tun_fd, int dns_fd)
|
|||||||
dns_ping(dns_fd);
|
dns_ping(dns_fd);
|
||||||
} else {
|
} else {
|
||||||
if(FD_ISSET(tun_fd, &fds)) {
|
if(FD_ISSET(tun_fd, &fds)) {
|
||||||
read = read_tun(tun_fd, frame, FRAMESIZE);
|
read = read_tun(tun_fd, in, sizeof(in));
|
||||||
if (read > 0) {
|
if(read <= 0)
|
||||||
buflen = sizeof(buf);
|
continue;
|
||||||
compress2(buf, &buflen, frame->data, read - 4, 9);
|
|
||||||
dns_handle_tun(dns_fd, buf, buflen);
|
outlen = sizeof(out);
|
||||||
}
|
compress2(out, &outlen, in, read, 9);
|
||||||
|
dns_handle_tun(dns_fd, out, outlen);
|
||||||
}
|
}
|
||||||
if(FD_ISSET(dns_fd, &fds)) {
|
if(FD_ISSET(dns_fd, &fds)) {
|
||||||
read = dns_read(dns_fd, buf, FRAMESIZE-4);
|
read = dns_read(dns_fd, in, sizeof(in));
|
||||||
if (read > 0) {
|
if (read <= 0)
|
||||||
buflen = 64*1024-4;
|
continue;
|
||||||
uncompress(frame->data, &buflen, buf, read);
|
|
||||||
|
|
||||||
frame->flags = htons(0x0000);
|
outlen = sizeof(out);
|
||||||
#ifdef LINUX
|
uncompress(out, &outlen, in, read);
|
||||||
frame->proto = htons(0x0800); // Linux wants ETH_P_IP
|
|
||||||
#else
|
write_tun(tun_fd, out, outlen);
|
||||||
frame->proto = htons(0x0002); // BSD wants AF_INET as long word
|
if (!dns_sending())
|
||||||
#endif
|
dns_ping(dns_fd);
|
||||||
|
|
||||||
write_tun(tun_fd, frame, buflen + 4);
|
|
||||||
if (!dns_sending()) {
|
|
||||||
dns_ping(dns_fd);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
free(frame);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -151,11 +139,6 @@ main(int argc, char **argv)
|
|||||||
username = NULL;
|
username = NULL;
|
||||||
foreground = 0;
|
foreground = 0;
|
||||||
|
|
||||||
if (geteuid() != 0) {
|
|
||||||
printf("Run as root and you'll be happy.\n");
|
|
||||||
usage();
|
|
||||||
}
|
|
||||||
|
|
||||||
while ((choice = getopt(argc, argv, "vfhu:")) != -1) {
|
while ((choice = getopt(argc, argv, "vfhu:")) != -1) {
|
||||||
switch(choice) {
|
switch(choice) {
|
||||||
case 'v':
|
case 'v':
|
||||||
@ -175,6 +158,11 @@ main(int argc, char **argv)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (geteuid() != 0) {
|
||||||
|
printf("Run as root and you'll be happy.\n");
|
||||||
|
usage();
|
||||||
|
}
|
||||||
|
|
||||||
argc -= optind;
|
argc -= optind;
|
||||||
argv += optind;
|
argv += optind;
|
||||||
|
44
iodined.c
44
iodined.c
@ -49,11 +49,9 @@ tunnel(int tun_fd, int dns_fd)
|
|||||||
int read;
|
int read;
|
||||||
fd_set fds;
|
fd_set fds;
|
||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
struct tun_frame *frame;
|
char in[64*1024];
|
||||||
long buflen;
|
long outlen;
|
||||||
char buf[64*1024];
|
char out[64*1024];
|
||||||
|
|
||||||
frame = malloc(64*1024);
|
|
||||||
|
|
||||||
while (running) {
|
while (running) {
|
||||||
if (dnsd_hasack()) {
|
if (dnsd_hasack()) {
|
||||||
@ -82,33 +80,27 @@ tunnel(int tun_fd, int dns_fd)
|
|||||||
dnsd_forceack(dns_fd);
|
dnsd_forceack(dns_fd);
|
||||||
} else {
|
} else {
|
||||||
if(FD_ISSET(tun_fd, &fds)) {
|
if(FD_ISSET(tun_fd, &fds)) {
|
||||||
read = read_tun(tun_fd, frame, 64*1024);
|
read = read_tun(tun_fd, in, sizeof(in));
|
||||||
if(read > 0) {
|
if (read <= 0)
|
||||||
buflen = sizeof(buf);
|
continue;
|
||||||
compress2(buf, &buflen, frame->data, read - 4, 9);
|
|
||||||
dnsd_queuepacket(buf, buflen);
|
outlen = sizeof(out);
|
||||||
}
|
compress2(out, &outlen, in, read, 9);
|
||||||
|
dnsd_queuepacket(out, outlen);
|
||||||
}
|
}
|
||||||
if(FD_ISSET(dns_fd, &fds)) {
|
if(FD_ISSET(dns_fd, &fds)) {
|
||||||
read = dnsd_read(dns_fd, buf, 64*1024-4);
|
read = dnsd_read(dns_fd, in, sizeof(in));
|
||||||
if(read > 0) {
|
if (read <= 0)
|
||||||
buflen = 64*1024-4;
|
continue;
|
||||||
uncompress(frame->data, &buflen, buf, read);
|
|
||||||
|
outlen = sizeof(out);
|
||||||
frame->flags = htons(0x0000);
|
uncompress(out, &outlen, in, read);
|
||||||
#ifdef LINUX
|
|
||||||
frame->proto = htons(0x0800); // Linux wants ETH_P_IP
|
write_tun(tun_fd, out, outlen);
|
||||||
#else
|
|
||||||
frame->proto = htons(0x0002); // BSD wants AF_INET as long word
|
|
||||||
#endif
|
|
||||||
write_tun(tun_fd, frame, buflen + 4);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
free(frame);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
20
tun.c
20
tun.c
@ -120,9 +120,21 @@ close_tun(int tun_fd)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
write_tun(int tun_fd, struct tun_frame *frame, int len)
|
write_tun(int tun_fd, char *data, int len)
|
||||||
{
|
{
|
||||||
if (write(tun_fd, frame, len) != len) {
|
#ifdef LINUX
|
||||||
|
data[0] = 0x00;
|
||||||
|
data[1] = 0x00;
|
||||||
|
data[2] = 0x08;
|
||||||
|
data[3] = 0x00;
|
||||||
|
#else /* LINUX */
|
||||||
|
data[0] = 0x00;
|
||||||
|
data[1] = 0x00;
|
||||||
|
data[2] = 0x00;
|
||||||
|
data[3] = 0x02;
|
||||||
|
#endif /* !LINUX */
|
||||||
|
|
||||||
|
if (write(tun_fd, data, len) != len) {
|
||||||
warn("write_tun");
|
warn("write_tun");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -131,8 +143,8 @@ write_tun(int tun_fd, struct tun_frame *frame, int len)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
read_tun(int tun_fd, struct tun_frame *frame, int len)
|
read_tun(int tun_fd, char *buf, int len)
|
||||||
{
|
{
|
||||||
return read(tun_fd, frame, len);
|
return read(tun_fd, buf, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
11
tun.h
11
tun.h
@ -19,16 +19,9 @@
|
|||||||
#ifndef _TUN_H_
|
#ifndef _TUN_H_
|
||||||
#define _TUN_H_
|
#define _TUN_H_
|
||||||
|
|
||||||
struct tun_frame
|
|
||||||
{
|
|
||||||
short flags;
|
|
||||||
short proto;
|
|
||||||
char data[];
|
|
||||||
};
|
|
||||||
|
|
||||||
int open_tun();
|
int open_tun();
|
||||||
void close_tun(int);
|
void close_tun(int);
|
||||||
int write_tun(int, struct tun_frame *, int);
|
int write_tun(int, char *, int);
|
||||||
int read_tun(int, struct tun_frame *, int);
|
int read_tun(int, char *, int);
|
||||||
|
|
||||||
#endif /* _TUN_H_ */
|
#endif /* _TUN_H_ */
|
||||||
|
Loading…
Reference in New Issue
Block a user