mirror of
https://github.com/yarrick/iodine.git
synced 2024-11-23 00:29:20 +02: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 <signal.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <fcntl.h>
|
||||||
#include <err.h>
|
#include <err.h>
|
||||||
|
|
||||||
#include "tun.h"
|
#include "tun.h"
|
||||||
|
@ -28,6 +30,8 @@
|
||||||
|
|
||||||
#define MAX(a,b) ((a)>(b)?(a):(b))
|
#define MAX(a,b) ((a)>(b)?(a):(b))
|
||||||
|
|
||||||
|
#define FRAMESIZE (64*1024)
|
||||||
|
|
||||||
int running = 1;
|
int running = 1;
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -41,8 +45,10 @@ tunnel(int tun_fd, int dns_fd)
|
||||||
int i;
|
int i;
|
||||||
int read;
|
int read;
|
||||||
fd_set fds;
|
fd_set fds;
|
||||||
char buf[4096];
|
|
||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
|
struct tun_frame *frame;
|
||||||
|
|
||||||
|
frame = malloc(FRAMESIZE);
|
||||||
|
|
||||||
while (running) {
|
while (running) {
|
||||||
tv.tv_sec = 1;
|
tv.tv_sec = 1;
|
||||||
|
@ -64,25 +70,32 @@ tunnel(int tun_fd, int dns_fd)
|
||||||
}
|
}
|
||||||
|
|
||||||
if(i == 0) {
|
if(i == 0) {
|
||||||
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, buf, sizeof(buf));
|
read = read_tun(tun_fd, frame, FRAMESIZE);
|
||||||
if (read > 0) {
|
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);
|
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)) {
|
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) {
|
if (read > 0) {
|
||||||
printf("Got data on dns! %d bytes\n", read);
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
14
dnstund.c
14
dnstund.c
|
@ -45,8 +45,10 @@ tunnel(int tun_fd, int dns_fd)
|
||||||
int i;
|
int i;
|
||||||
int read;
|
int read;
|
||||||
fd_set fds;
|
fd_set fds;
|
||||||
char buf[64*1024];
|
|
||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
|
struct tun_frame *frame;
|
||||||
|
|
||||||
|
frame = malloc(64*1024);
|
||||||
|
|
||||||
while (running) {
|
while (running) {
|
||||||
tv.tv_sec = 1;
|
tv.tv_sec = 1;
|
||||||
|
@ -68,18 +70,20 @@ tunnel(int tun_fd, int dns_fd)
|
||||||
|
|
||||||
if(i != 0) {
|
if(i != 0) {
|
||||||
if(FD_ISSET(tun_fd, &fds)) {
|
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)
|
if(read > 0)
|
||||||
dnsd_queuepacket(buf, read);
|
dnsd_queuepacket(frame->data, read - 4);
|
||||||
}
|
}
|
||||||
if(FD_ISSET(dns_fd, &fds)) {
|
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)
|
if(read > 0)
|
||||||
write_tun(tun_fd, buf, read);
|
write_tun(tun_fd, frame, read + 4);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
free(frame);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
8
tun.c
8
tun.c
|
@ -118,9 +118,9 @@ close_tun(int tun_fd)
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
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");
|
warn("write_tun");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -129,8 +129,8 @@ write_tun(int tun_fd, uint8_t *buf, int len)
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
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_
|
#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, uint8_t *, int);
|
int write_tun(int, struct tun_frame *, int);
|
||||||
int read_tun(int, uint8_t *, int);
|
int read_tun(int, struct tun_frame *, int);
|
||||||
|
|
||||||
#endif /* _TUN_H_ */
|
#endif /* _TUN_H_ */
|
||||||
|
|
Loading…
Reference in New Issue