summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Pointner <equinox@anytun.org>2014-02-13 21:02:43 +0000
committerChristian Pointner <equinox@anytun.org>2014-02-13 21:02:43 +0000
commitf32ba56f0e81554647c34935862928351df4f7ea (patch)
tree46c741933d91ac185e89418b11763a0452429dad
parentsmall refactoring (diff)
removed useless remote_end_to_string
added rail version vor udp_write
-rw-r--r--src/uanytun.c11
-rw-r--r--src/udp.c58
-rw-r--r--src/udp.h1
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);