From 8f720015cbec4c29b8264c126875bcef5c0a08a3 Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Sun, 9 Feb 2014 13:43:13 +0000 Subject: remote end is now stored at every sock --- src/uanytun.c | 17 ++++++++++------- src/udp.c | 22 ++++++++++++---------- src/udp.h | 4 ++-- 3 files changed, 24 insertions(+), 19 deletions(-) (limited to 'src') diff --git a/src/uanytun.c b/src/uanytun.c index a0265d5..3473b24 100644 --- a/src/uanytun.c +++ b/src/uanytun.c @@ -124,7 +124,7 @@ int process_tun_data(tun_device_t* dev, udp_t* sock, options_t* opt, plain_packe else plain_packet_set_type(plain_packet, PAYLOAD_TYPE_UNKNOWN); - if(!sock->remote_end_set_) + if(!sock->active_sock_ || !sock->active_sock_->remote_end_set_) return 0; cipher_encrypt(c, kd, kd_outbound, plain_packet, encrypted_packet, seq_nr, opt->sender_id_, opt->mux_); @@ -183,12 +183,15 @@ int process_sock_data(tun_device_t* dev, int fd, udp_t* sock, options_t* opt, pl } udp_set_active_sock(sock, fd); - if(remote.len_ != sock->remote_end_.len_ || memcmp(&(remote.addr_), &(sock->remote_end_.addr_), remote.len_)) { - memcpy(&(sock->remote_end_.addr_), &(remote.addr_), remote.len_); - sock->remote_end_set_ = 1; - char* addrstring = udp_endpoint_to_string(remote); - log_printf(NOTICE, "autodetected remote host changed %s", addrstring); - free(addrstring); + if(sock->active_sock_) { + if(remote.len_ != sock->active_sock_->remote_end_.len_ || + memcmp(&(remote.addr_), &(sock->active_sock_->remote_end_.addr_), remote.len_)) { + memcpy(&(sock->active_sock_->remote_end_.addr_), &(remote.addr_), remote.len_); + sock->active_sock_->remote_end_set_ = 1; + char* addrstring = udp_endpoint_to_string(remote); + log_printf(NOTICE, "autodetected remote host changed %s", addrstring); + free(addrstring); + } } if(encrypted_packet_get_payload_length(encrypted_packet) <= plain_packet_get_header_length()) { diff --git a/src/udp.c b/src/udp.c index b75a8e6..883e9fc 100644 --- a/src/udp.c +++ b/src/udp.c @@ -59,9 +59,6 @@ int udp_init(udp_t* sock, const char* local_addr, const char* port, resolv_addr_ sock->socks_ = NULL; sock->active_sock_ = NULL; - memset(&(sock->remote_end_.addr_), 0, sizeof(sock->remote_end_.addr_)); - sock->remote_end_.len_ = sizeof(sock->remote_end_.addr_); - sock->remote_end_set_ = 0; struct addrinfo hints, *res; @@ -100,6 +97,9 @@ int udp_init(udp_t* sock, const char* local_addr, const char* port, resolv_addr_ } memset(&(new_sock->local_end_.addr_), 0, sizeof(new_sock->local_end_.addr_)); new_sock->local_end_.len_ = sizeof(new_sock->local_end_.addr_); + memset(&(new_sock->remote_end_.addr_), 0, sizeof(new_sock->remote_end_.addr_)); + new_sock->remote_end_.len_ = sizeof(new_sock->remote_end_.addr_); + new_sock->remote_end_set_ = 0; new_sock->next_ = NULL; if(!sock->socks_) { @@ -189,9 +189,6 @@ int udp_resolv_remote(udp_t* sock, const char* remote_addr, const char* port, re log_printf(ERROR, "getaddrinfo returned no address for %s:%s", remote_addr, port); return -1; } - memcpy(&(sock->remote_end_.addr_), res->ai_addr, res->ai_addrlen); - sock->remote_end_.len_ = res->ai_addrlen; - sock->remote_end_set_ = 1; if(!sock->active_sock_) { udp_socket_t* s = sock->socks_; @@ -203,6 +200,11 @@ int udp_resolv_remote(udp_t* sock, const char* remote_addr, const char* port, re s = s->next_; } } + if(sock->active_sock_) { + memcpy(&(sock->active_sock_->remote_end_.addr_), res->ai_addr, res->ai_addrlen); + sock->active_sock_->remote_end_.len_ = res->ai_addrlen; + sock->active_sock_->remote_end_set_ = 1; + } freeaddrinfo(res); @@ -263,10 +265,10 @@ char* udp_endpoint_to_string(udp_endpoint_t e) char* udp_get_remote_end_string(udp_t* sock) { - if(!sock || !sock->remote_end_set_) + if(!sock || !sock->active_sock_->remote_end_set_) return NULL; - return udp_endpoint_to_string(sock->remote_end_); + return udp_endpoint_to_string(sock->active_sock_->remote_end_); } int udp_read(udp_t* sock, int fd, u_int8_t* buf, u_int32_t len, udp_endpoint_t* remote_end) @@ -279,8 +281,8 @@ int udp_read(udp_t* sock, int fd, u_int8_t* buf, u_int32_t len, udp_endpoint_t* int udp_write(udp_t* sock, u_int8_t* buf, u_int32_t len) { - if(!sock || !sock->remote_end_set_ || !sock->active_sock_) + if(!sock || !sock->active_sock_ || !sock->active_sock_->remote_end_set_) return 0; - return sendto(sock->active_sock_->fd_, buf, len, 0, (struct sockaddr *)&(sock->remote_end_.addr_), sock->remote_end_.len_); + return sendto(sock->active_sock_->fd_, buf, len, 0, (struct sockaddr *)&(sock->active_sock_->remote_end_.addr_), sock->active_sock_->remote_end_.len_); } diff --git a/src/udp.h b/src/udp.h index 284d41f..2684c13 100644 --- a/src/udp.h +++ b/src/udp.h @@ -49,6 +49,8 @@ typedef struct { struct udp_socket_struct { int fd_; udp_endpoint_t local_end_; + udp_endpoint_t remote_end_; + int remote_end_set_; struct udp_socket_struct* next_; }; typedef struct udp_socket_struct udp_socket_t; @@ -56,8 +58,6 @@ typedef struct udp_socket_struct udp_socket_t; struct udp_struct { udp_socket_t* socks_; udp_socket_t* active_sock_; - udp_endpoint_t remote_end_; - int remote_end_set_; }; typedef struct udp_struct udp_t; -- cgit v1.2.3