summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Pointner <equinox@anytun.org>2014-02-09 13:43:13 +0000
committerChristian Pointner <equinox@anytun.org>2014-02-09 13:43:13 +0000
commit8f720015cbec4c29b8264c126875bcef5c0a08a3 (patch)
treea5fc19be9a97f8513938648876b3051827fa0c66
parentrefactored name (diff)
remote end is now stored at every sock
-rw-r--r--src/uanytun.c17
-rw-r--r--src/udp.c22
-rw-r--r--src/udp.h4
3 files changed, 24 insertions, 19 deletions
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;