From f32ba56f0e81554647c34935862928351df4f7ea Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Thu, 13 Feb 2014 21:02:43 +0000 Subject: removed useless remote_end_to_string added rail version vor udp_write --- src/uanytun.c | 11 ++--------- src/udp.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++------------ src/udp.h | 1 - 3 files changed, 48 insertions(+), 22 deletions(-) diff --git a/src/uanytun.c b/src/uanytun.c index 6ebd721..75d21ce 100644 --- a/src/uanytun.c +++ b/src/uanytun.c @@ -380,15 +380,8 @@ int main(int argc, char* argv[]) exit(ret); } - if(opt.remote_addr_) { - if(!udp_resolv_remote(&sock, opt.remote_addr_, opt.remote_port_, opt.resolv_addr_type_)) { - char* remote_string = udp_get_remote_end_string(&sock); - if(remote_string) { - log_printf(NOTICE, "set remote end to: %s", remote_string); - free(remote_string); - } - } - } + if(opt.remote_addr_) + udp_resolv_remote(&sock, opt.remote_addr_, opt.remote_port_, opt.resolv_addr_type_); FILE* pid_file = NULL; diff --git a/src/udp.c b/src/udp.c index 635b310..43b2cfe 100644 --- a/src/udp.c +++ b/src/udp.c @@ -209,10 +209,17 @@ int udp_init_fd_set(udp_t* sock, fd_set* set) int udp_has_remote(udp_t* sock) { - if(!sock->active_sock_ || !sock->active_sock_->remote_end_set_) + if(!sock->rail_mode_ && (!sock->active_sock_ || !sock->active_sock_->remote_end_set_)) return 0; - return 1; + udp_socket_t* s = sock->socks_; + while(s) { + if(s->remote_end_set_) + return 1; + s = s->next_; + } + + return 0; } int udp_resolv_remote(udp_t* sock, const char* remote_addr, const char* port, resolv_addr_type_t resolv_type) @@ -259,6 +266,11 @@ int udp_resolv_remote(udp_t* sock, const char* remote_addr, const char* port, re memcpy(&(sock->active_sock_->remote_end_.addr_), r->ai_addr, r->ai_addrlen); sock->active_sock_->remote_end_.len_ = r->ai_addrlen; sock->active_sock_->remote_end_set_ = 1; + char* remote_string = udp_endpoint_to_string(&(sock->active_sock_->remote_end_)); + if(remote_string) { + log_printf(NOTICE, "set remote end to: %s", remote_string); + free(remote_string); + } break; } @@ -343,26 +355,48 @@ char* udp_endpoint_to_string(udp_endpoint_t* e) return ret; } -char* udp_get_remote_end_string(udp_t* sock) -{ - if(!sock || !(sock->active_sock_) || !(sock->active_sock_->remote_end_set_)) - return NULL; - - 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) { - if(!sock || !remote_end) + if(!sock || !buf || !remote_end) return -1; return recvfrom(fd, buf, len, 0, (struct sockaddr *)&(remote_end->addr_), &(remote_end->len_)); } -int udp_write(udp_t* sock, u_int8_t* buf, u_int32_t len) + +static int udp_write_active_sock(udp_t* sock, u_int8_t* buf, u_int32_t len) { - if(!sock || !sock->active_sock_ || !sock->active_sock_->remote_end_set_) + if(!sock->active_sock_ || !sock->active_sock_->remote_end_set_) return 0; return sendto(sock->active_sock_->fd_, buf, len, 0, (struct sockaddr *)&(sock->active_sock_->remote_end_.addr_), sock->active_sock_->remote_end_.len_); } + +static int udp_write_rail(udp_t* sock, u_int8_t* buf, u_int32_t len) +{ + int i=0; + + udp_socket_t* s = sock->socks_; + while(s) { + if(s->remote_end_set_) { + sendto(s->fd_, buf, len, 0, (struct sockaddr *)&(s->remote_end_.addr_), s->remote_end_.len_); + i++; + } + s = s->next_; + } + + log_printf(DEBUG, "sent %d Bytes to %d sockets", len, i); + return len; +} + +int udp_write(udp_t* sock, u_int8_t* buf, u_int32_t len) +{ + if(!sock || !buf) + return 0; + + if(sock->rail_mode_) + return udp_write_rail(sock, buf, len); + + return udp_write_active_sock(sock, buf, len); +} diff --git a/src/udp.h b/src/udp.h index 8f54ed4..5b74c2d 100644 --- a/src/udp.h +++ b/src/udp.h @@ -70,7 +70,6 @@ void udp_update_remote(udp_t* sock, int fd, udp_endpoint_t* remote); void udp_close(udp_t* sock); char* udp_endpoint_to_string(udp_endpoint_t* e); -char* udp_get_remote_end_string(udp_t* sock); int udp_read(udp_t* sock, int fd, u_int8_t* buf, u_int32_t len, udp_endpoint_t* remote_end); int udp_write(udp_t* sock, u_int8_t* buf, u_int32_t len); -- cgit v1.2.3