mirror of
https://github.com/yarrick/iodine.git
synced 2024-11-29 16:36:03 +03:00
#7 Move packet handling out of iodine.c and into packet.c
This commit is contained in:
parent
dc5138bc55
commit
bc5f0a7fb7
@ -1,5 +1,5 @@
|
|||||||
CC = gcc
|
CC = gcc
|
||||||
COMMONOBJS = tun.o dns.o read.o encoding.o login.o base32.o base64.o md5.o common.o
|
COMMONOBJS = tun.o dns.o read.o encoding.o login.o base32.o base64.o md5.o common.o packet.o
|
||||||
CLIENTOBJS = iodine.o
|
CLIENTOBJS = iodine.o
|
||||||
CLIENT = ../bin/iodine
|
CLIENT = ../bin/iodine
|
||||||
SERVEROBJS = iodined.o user.o
|
SERVEROBJS = iodined.o user.o
|
||||||
@ -11,7 +11,7 @@ ARCH = `uname -m`
|
|||||||
LDFLAGS = -lz
|
LDFLAGS = -lz
|
||||||
CFLAGS = -c -g -Wall -D$(OS) -pedantic
|
CFLAGS = -c -g -Wall -D$(OS) -pedantic
|
||||||
|
|
||||||
all: stateos $(CLIENT) $(SERVER) $(TESTSUITE)
|
all: stateos $(CLIENT) $(SERVER)
|
||||||
|
|
||||||
stateos:
|
stateos:
|
||||||
@echo OS is $(OS), arch is $(ARCH)
|
@echo OS is $(OS), arch is $(ARCH)
|
||||||
|
@ -30,14 +30,6 @@
|
|||||||
|
|
||||||
#define QUERY_NAME_SIZE 256
|
#define QUERY_NAME_SIZE 256
|
||||||
|
|
||||||
struct packet
|
|
||||||
{
|
|
||||||
int len; /* Total packet length */
|
|
||||||
int sentlen; /* Length of chunk currently transmitted */
|
|
||||||
int offset; /* Current offset */
|
|
||||||
char data[64*1024]; /* The data */
|
|
||||||
};
|
|
||||||
|
|
||||||
struct query {
|
struct query {
|
||||||
char name[QUERY_NAME_SIZE];
|
char name[QUERY_NAME_SIZE];
|
||||||
short type;
|
short type;
|
||||||
|
39
src/iodine.c
39
src/iodine.c
@ -141,12 +141,6 @@ build_hostname(char *buf, size_t buflen,
|
|||||||
return space;
|
return space;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
|
||||||
is_sending()
|
|
||||||
{
|
|
||||||
return (packet.len != 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
int
|
||||||
read_dns(int fd, char *buf, int buflen)
|
read_dns(int fd, char *buf, int buflen)
|
||||||
{
|
{
|
||||||
@ -166,15 +160,10 @@ read_dns(int fd, char *buf, int buflen)
|
|||||||
|
|
||||||
rv = dns_decode(buf, buflen, &q, QR_ANSWER, data, r);
|
rv = dns_decode(buf, buflen, &q, QR_ANSWER, data, r);
|
||||||
|
|
||||||
if (is_sending() && chunkid == q.id) {
|
if (packet_sending(&packet) && chunkid == q.id) {
|
||||||
/* Got ACK on sent packet */
|
/* Got ACK on sent packet */
|
||||||
packet.offset += packet.sentlen;
|
packet_advance(&packet);
|
||||||
if (packet.offset == packet.len) {
|
if (packet_sending(&packet)) {
|
||||||
/* Packet completed */
|
|
||||||
packet.offset = 0;
|
|
||||||
packet.len = 0;
|
|
||||||
packet.sentlen = 0;
|
|
||||||
} else {
|
|
||||||
/* More to send */
|
/* More to send */
|
||||||
send_chunk(fd);
|
send_chunk(fd);
|
||||||
}
|
}
|
||||||
@ -199,11 +188,8 @@ tunnel_tun(int tun_fd, int dns_fd)
|
|||||||
inlen = read;
|
inlen = read;
|
||||||
compress2((uint8_t*)out, &outlen, (uint8_t*)in, inlen, 9);
|
compress2((uint8_t*)out, &outlen, (uint8_t*)in, inlen, 9);
|
||||||
|
|
||||||
memcpy(packet.data, out, MIN(outlen, sizeof(packet.data)));
|
packet_fill(&packet, out, outlen);
|
||||||
packet.sentlen = 0;
|
|
||||||
packet.offset = 0;
|
|
||||||
packet.len = outlen;
|
|
||||||
|
|
||||||
send_chunk(dns_fd);
|
send_chunk(dns_fd);
|
||||||
|
|
||||||
return read;
|
return read;
|
||||||
@ -227,7 +213,7 @@ tunnel_dns(int tun_fd, int dns_fd)
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
write_tun(tun_fd, out, outlen);
|
write_tun(tun_fd, out, outlen);
|
||||||
if (!is_sending())
|
if (!packet_sending(&packet))
|
||||||
send_ping(dns_fd);
|
send_ping(dns_fd);
|
||||||
|
|
||||||
return read;
|
return read;
|
||||||
@ -248,7 +234,7 @@ tunnel(int tun_fd, int dns_fd)
|
|||||||
tv.tv_usec = 0;
|
tv.tv_usec = 0;
|
||||||
|
|
||||||
FD_ZERO(&fds);
|
FD_ZERO(&fds);
|
||||||
if (!is_sending())
|
if (!packet_sending(&packet))
|
||||||
FD_SET(tun_fd, &fds);
|
FD_SET(tun_fd, &fds);
|
||||||
FD_SET(dns_fd, &fds);
|
FD_SET(dns_fd, &fds);
|
||||||
|
|
||||||
@ -284,15 +270,18 @@ send_chunk(int fd)
|
|||||||
char buf[4096];
|
char buf[4096];
|
||||||
int avail;
|
int avail;
|
||||||
int code;
|
int code;
|
||||||
|
int sentlen;
|
||||||
char *p;
|
char *p;
|
||||||
|
|
||||||
p = packet.data;
|
p = packet.data;
|
||||||
p += packet.offset;
|
p += packet.offset;
|
||||||
avail = packet.len - packet.offset;
|
avail = packet_len_to_send(&packet);
|
||||||
|
|
||||||
packet.sentlen = build_hostname(buf + 1, sizeof(buf) - 1, p, avail, topdomain, dataenc);
|
sentlen = build_hostname(buf + 1, sizeof(buf) - 1, p, avail, topdomain, dataenc);
|
||||||
|
|
||||||
if (packet.sentlen == avail)
|
packet_send_len(&packet, sentlen);
|
||||||
|
|
||||||
|
if (sentlen == avail)
|
||||||
code = 1;
|
code = 1;
|
||||||
else
|
else
|
||||||
code = 0;
|
code = 0;
|
||||||
@ -325,7 +314,7 @@ send_ping(int fd)
|
|||||||
{
|
{
|
||||||
char data[3];
|
char data[3];
|
||||||
|
|
||||||
if (is_sending()) {
|
if (packet_sending(&packet)) {
|
||||||
packet.sentlen = 0;
|
packet.sentlen = 0;
|
||||||
packet.offset = 0;
|
packet.offset = 0;
|
||||||
packet.len = 0;
|
packet.len = 0;
|
||||||
|
62
src/packet.c
Normal file
62
src/packet.c
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "packet.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Is some part of this packet sent?
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
packet_sending(struct packet *packet)
|
||||||
|
{
|
||||||
|
return (packet->len != 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Acknowledge that the latest send was succesful
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
packet_advance(struct packet *packet)
|
||||||
|
{
|
||||||
|
packet->offset += packet->sentlen;
|
||||||
|
if (packet->offset == packet->len) {
|
||||||
|
/* Packet completed */
|
||||||
|
packet->offset = 0;
|
||||||
|
packet->len = 0;
|
||||||
|
packet->sentlen = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The length to left to send
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
packet_len_to_send(struct packet *packet)
|
||||||
|
{
|
||||||
|
return packet->len - packet->offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fill the packet with data
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
packet_fill(struct packet *packet, char *data, unsigned long datalen)
|
||||||
|
{
|
||||||
|
memcpy(packet->data, data, MIN(datalen, PKTSIZE));
|
||||||
|
packet->sentlen = 0;
|
||||||
|
packet->offset = 0;
|
||||||
|
packet->len = datalen;
|
||||||
|
|
||||||
|
return packet->len;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mark len number of bytes as being sent
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
packet_send_len(struct packet *packet, int len)
|
||||||
|
{
|
||||||
|
packet->sentlen = len;
|
||||||
|
}
|
||||||
|
|
36
src/packet.h
Normal file
36
src/packet.h
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2006-2007 Bjorn Andersson <flex@kryo.se>, Erik Ekman <yarrick@kryo.se>
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and distribute this software for any
|
||||||
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
|
* copyright notice and this permission notice appear in all copies.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __PACKET_H__
|
||||||
|
#define __PACKET_H__
|
||||||
|
|
||||||
|
#define PKTSIZE (64*1024)
|
||||||
|
|
||||||
|
struct packet
|
||||||
|
{
|
||||||
|
int len; /* Total packet length */
|
||||||
|
int sentlen; /* Length of chunk currently transmitted */
|
||||||
|
int offset; /* Current offset */
|
||||||
|
char data[PKTSIZE]; /* The data */
|
||||||
|
};
|
||||||
|
|
||||||
|
int packet_sending(struct packet *);
|
||||||
|
void packet_advance(struct packet *);
|
||||||
|
int packet_len_to_send(struct packet *);
|
||||||
|
int packet_fill(struct packet *, char *, unsigned long);
|
||||||
|
void packet_send_len(struct packet *, int);
|
||||||
|
|
||||||
|
#endif
|
@ -17,6 +17,8 @@
|
|||||||
#ifndef __USER_H__
|
#ifndef __USER_H__
|
||||||
#define __USER_H__
|
#define __USER_H__
|
||||||
|
|
||||||
|
#include "packet.h"
|
||||||
|
|
||||||
#define USERS 8
|
#define USERS 8
|
||||||
|
|
||||||
struct user {
|
struct user {
|
||||||
|
Loading…
Reference in New Issue
Block a user