summaryrefslogtreecommitdiff
path: root/src/uanytun.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/uanytun.c')
-rw-r--r--src/uanytun.c79
1 files changed, 48 insertions, 31 deletions
diff --git a/src/uanytun.c b/src/uanytun.c
index a7e1f7d..649ac7a 100644
--- a/src/uanytun.c
+++ b/src/uanytun.c
@@ -53,7 +53,7 @@
#include "daemon.h"
#include "sysexec.h"
-void main_loop(tun_device_t* dev, udp_socket_t* sock, options_t* opt)
+int main_loop(tun_device_t* dev, udp_socket_t* sock, options_t* opt)
{
log_printf(INFO, "entering main loop");
@@ -65,6 +65,13 @@ void main_loop(tun_device_t* dev, udp_socket_t* sock, options_t* opt)
udp_endpoint_t remote;
seq_nr_t seq_nr = 0;
+ cipher_t* c;
+ cipher_init(&c, opt->cipher_);
+ if(!c) {
+ log_printf(ERR, "could not initialize cipher of type %s", opt->cipher_);
+ return -1;
+ }
+
while(1) {
plain_packet_set_payload_length(&plain_packet, -1);
encrypted_packet_set_length(&encrypted_packet, -1);
@@ -72,42 +79,51 @@ void main_loop(tun_device_t* dev, udp_socket_t* sock, options_t* opt)
// TODO: add select
// if dev->fd_ is ready:
- len = tun_read(dev, plain_packet_get_payload(&plain_packet), plain_packet_get_payload_length(&plain_packet));
- plain_packet_set_payload_length(&plain_packet, len);
-
- // TODO: cipher packet
- // TODO: add auth-tag
-
- encrypted_packet_set_seq_nr(&encrypted_packet, seq_nr);
- encrypted_packet_set_sender_id(&encrypted_packet, opt->sender_id_);
- encrypted_packet_set_mux(&encrypted_packet, opt->mux_);
-
- udp_write(sock, encrypted_packet_get_packet(&encrypted_packet), encrypted_packet_get_length(&encrypted_packet));
-
-
+ if(1) {
+ len = tun_read(dev, plain_packet_get_payload(&plain_packet), plain_packet_get_payload_length(&plain_packet));
+ plain_packet_set_payload_length(&plain_packet, len);
+
+ if(dev->type_ = TYPE_TUN)
+ plain_packet_set_type(&plain_packet, PAYLOAD_TYPE_TUN);
+ else if(dev->type_ = TYPE_TAP)
+ plain_packet_set_type(&plain_packet, PAYLOAD_TYPE_TAP);
+ else
+ plain_packet_set_type(&plain_packet, PAYLOAD_TYPE_UNKNOWN);
+
+ cipher_encrypt(c, &plain_packet, &encrypted_packet, seq_nr, opt->sender_id_, opt->mux_);
+ seq_nr++;
+
+ // TODO: add auth-tag
+
+ udp_write(sock, encrypted_packet_get_packet(&encrypted_packet), encrypted_packet_get_length(&encrypted_packet));
+ }
// if sock->fd_ is ready:
- len = udp_read(sock, encrypted_packet_get_packet(&encrypted_packet), encrypted_packet_get_length(&encrypted_packet), &remote);
- encrypted_packet_set_length(&encrypted_packet, len);
+/* len = udp_read(sock, encrypted_packet_get_packet(&encrypted_packet), encrypted_packet_get_length(&encrypted_packet), &remote); */
+/* encrypted_packet_set_length(&encrypted_packet, len); */
- // TODO: check auth-tag
+/* // TODO: check auth-tag */
- if(encrypted_packet_get_mux(&encrypted_packet) != opt->mux_)
- continue;
+/* if(encrypted_packet_get_mux(&encrypted_packet) != opt->mux_) */
+/* continue; */
- // TODO: check seq nr for sender id
+/* // TODO: check seq nr for sender id */
- if(memcmp(&remote, &(sock->remote_end_), sizeof(remote))) {
- memcpy(&(sock->remote_end_), &remote, sizeof(remote));
- char* addrstring = udp_endpoint_to_string(remote);
- log_printf(NOTICE, "autodetected remote host changed %s", addrstring);
- free(addrstring);
- }
+/* if(memcmp(&remote, &(sock->remote_end_), sizeof(remote))) { */
+/* memcpy(&(sock->remote_end_), &remote, sizeof(remote)); */
+/* char* addrstring = udp_endpoint_to_string(remote); */
+/* log_printf(NOTICE, "autodetected remote host changed %s", addrstring); */
+/* free(addrstring); */
+/* } */
- // TODO: decipher packet
+/* // TODO: decipher packet */
- tun_write(dev, plain_packet_get_payload(&plain_packet), plain_packet_get_payload_length(&plain_packet));
+/* tun_write(dev, plain_packet_get_payload(&plain_packet), plain_packet_get_payload_length(&plain_packet)); */
}
+
+ cipher_close(&c);
+
+ return 0;
}
void print_hex_dump(const u_int8_t* buf, u_int32_t len)
@@ -195,13 +211,14 @@ int main(int argc, char* argv[])
fclose(pid_file);
}
- main_loop(dev, sock, opt);
+ ret = main_loop(dev, sock, opt);
tun_close(&dev);
udp_close(&sock);
options_clear(&opt);
- log_printf(NOTICE, "normal shutdown");
+ if(!ret)
+ log_printf(NOTICE, "normal shutdown");
- return 0;
+ return ret;
}