mirror of
https://github.com/yarrick/iodine.git
synced 2024-11-25 15:41:26 +00:00
tun hanterar frames
This commit is contained in:
parent
ce6ff57280
commit
c816cb71d3
25
dnstun.c
25
dnstun.c
|
@ -21,6 +21,8 @@
|
|||
#include <signal.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <err.h>
|
||||
|
||||
#include "tun.h"
|
||||
|
@ -28,6 +30,8 @@
|
|||
|
||||
#define MAX(a,b) ((a)>(b)?(a):(b))
|
||||
|
||||
#define FRAMESIZE (64*1024)
|
||||
|
||||
int running = 1;
|
||||
|
||||
static void
|
||||
|
@ -41,8 +45,10 @@ tunnel(int tun_fd, int dns_fd)
|
|||
int i;
|
||||
int read;
|
||||
fd_set fds;
|
||||
char buf[4096];
|
||||
struct timeval tv;
|
||||
struct tun_frame *frame;
|
||||
|
||||
frame = malloc(FRAMESIZE);
|
||||
|
||||
while (running) {
|
||||
tv.tv_sec = 1;
|
||||
|
@ -64,25 +70,32 @@ tunnel(int tun_fd, int dns_fd)
|
|||
}
|
||||
|
||||
if(i == 0) {
|
||||
dns_ping(dns_fd);
|
||||
//dns_ping(dns_fd);
|
||||
} else {
|
||||
if(FD_ISSET(tun_fd, &fds)) {
|
||||
read = read_tun(tun_fd, buf, sizeof(buf));
|
||||
read = read_tun(tun_fd, frame, FRAMESIZE);
|
||||
if (read > 0) {
|
||||
int fd;
|
||||
|
||||
fd = open("moo", O_WRONLY | O_CREAT, S_IRGRP);
|
||||
write(fd, frame->data, read - 4);
|
||||
close(fd);
|
||||
printf("Got data on tun! %d bytes\n", read);
|
||||
dns_handle_tun(dns_fd, buf, read);
|
||||
dns_handle_tun(dns_fd, frame->data, read - 4);
|
||||
}
|
||||
}
|
||||
if(FD_ISSET(dns_fd, &fds)) {
|
||||
read = dns_read(dns_fd, buf, sizeof(buf));
|
||||
read = dns_read(dns_fd, frame->data, FRAMESIZE-4);
|
||||
if (read > 0) {
|
||||
printf("Got data on dns! %d bytes\n", read);
|
||||
write_tun(tun_fd, buf, read);
|
||||
write_tun(tun_fd, frame, read + 4);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
free(frame);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
14
dnstund.c
14
dnstund.c
|
@ -45,8 +45,10 @@ tunnel(int tun_fd, int dns_fd)
|
|||
int i;
|
||||
int read;
|
||||
fd_set fds;
|
||||
char buf[64*1024];
|
||||
struct timeval tv;
|
||||
struct tun_frame *frame;
|
||||
|
||||
frame = malloc(64*1024);
|
||||
|
||||
while (running) {
|
||||
tv.tv_sec = 1;
|
||||
|
@ -68,18 +70,20 @@ tunnel(int tun_fd, int dns_fd)
|
|||
|
||||
if(i != 0) {
|
||||
if(FD_ISSET(tun_fd, &fds)) {
|
||||
read = read_tun(tun_fd, buf, sizeof(buf));
|
||||
read = read_tun(tun_fd, frame, 64*1024);
|
||||
if(read > 0)
|
||||
dnsd_queuepacket(buf, read);
|
||||
dnsd_queuepacket(frame->data, read - 4);
|
||||
}
|
||||
if(FD_ISSET(dns_fd, &fds)) {
|
||||
read = dnsd_read(dns_fd, buf, sizeof(buf));
|
||||
read = dnsd_read(dns_fd, frame->data, 64*1024-4);
|
||||
if(read > 0)
|
||||
write_tun(tun_fd, buf, read);
|
||||
write_tun(tun_fd, frame, read + 4);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
free(frame);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
8
tun.c
8
tun.c
|
@ -118,9 +118,9 @@ close_tun(int tun_fd)
|
|||
}
|
||||
|
||||
int
|
||||
write_tun(int tun_fd, uint8_t *buf, int len)
|
||||
write_tun(int tun_fd, struct tun_frame *frame, int len)
|
||||
{
|
||||
if (write(tun_fd, buf, len) != len) {
|
||||
if (write(tun_fd, frame, len) != len) {
|
||||
warn("write_tun");
|
||||
return 1;
|
||||
}
|
||||
|
@ -129,8 +129,8 @@ write_tun(int tun_fd, uint8_t *buf, int len)
|
|||
}
|
||||
|
||||
int
|
||||
read_tun(int tun_fd, uint8_t *buf, int len)
|
||||
read_tun(int tun_fd, struct tun_frame *frame, int len)
|
||||
{
|
||||
return read(tun_fd, buf, len);
|
||||
return read(tun_fd, frame, len);
|
||||
}
|
||||
|
||||
|
|
11
tun.h
11
tun.h
|
@ -19,9 +19,16 @@
|
|||
#ifndef _TUN_H_
|
||||
#define _TUN_H_
|
||||
|
||||
struct tun_frame
|
||||
{
|
||||
short flags;
|
||||
short proto;
|
||||
char data[];
|
||||
};
|
||||
|
||||
int open_tun();
|
||||
void close_tun(int);
|
||||
int write_tun(int, uint8_t *, int);
|
||||
int read_tun(int, uint8_t *, int);
|
||||
int write_tun(int, struct tun_frame *, int);
|
||||
int read_tun(int, struct tun_frame *, int);
|
||||
|
||||
#endif /* _TUN_H_ */
|
||||
|
|
Loading…
Reference in a new issue