From 3e8e025704d6965cd0d67213bcca7d2ae1a70036 Mon Sep 17 00:00:00 2001 From: Joseph Henry Date: Wed, 14 Oct 2015 19:55:21 -0400 Subject: [PATCH] Minor cleanup items --- netcon/Intercept.c | 190 +++-------------------------------- netcon/NetconEthernetTap.cpp | 17 ++-- netcon/libintercept.so.1.0 | Bin 46264 -> 0 bytes netcon/make-intercept.mk | 2 +- 4 files changed, 24 insertions(+), 185 deletions(-) delete mode 100755 netcon/libintercept.so.1.0 diff --git a/netcon/Intercept.c b/netcon/Intercept.c index 40593626c..bb5cf9ce7 100755 --- a/netcon/Intercept.c +++ b/netcon/Intercept.c @@ -111,7 +111,7 @@ int getsockopt(GETSOCKOPT_SIG); int accept4(ACCEPT4_SIG); #ifdef USE_SOCKS_DNS -int res_init(void); + int res_init(void); #endif int connect_to_service(void); @@ -122,7 +122,7 @@ void set_up_intercept(); int checkpid(); -#define BUF_SZ 1024 +#define BUF_SZ 32 #define SERVICE_CONNECT_ATTEMPTS 30 #define ERR_OK 0 @@ -137,9 +137,6 @@ pthread_mutex_t loglock; ------------------- Intercept<--->Service Comm mechanisms----------------------- ------------------------------------------------------------------------------*/ -// TODO: Find minimum BUF_SZ for RPC -// TODO: Refactor RPC send logic - static int is_initialized = 0; static int fdret_sock; // used for fd-transfers static int newfd; // used for "this_end" socket @@ -168,10 +165,9 @@ void send_command(int rpc_fd, char *cmd) if(n_write < 0){ dwr("Error writing command to service (CMD = %d)\n", cmd[0]); errno = 0; - //return -1; } - } + /* * Reads a return value from the service and sets errno (if applicable) */ @@ -204,22 +200,18 @@ int init_service_connection() if(!is_initialized) { struct sockaddr_un addr; - int tfd = -1; + int tfd = -1, attempts = 0, conn_err = -1; memset(&addr, 0, sizeof(addr)); addr.sun_family = AF_UNIX; strncpy(addr.sun_path, af_sock_name, sizeof(addr.sun_path)-1); - int attempts = 0; - int conn_err = -1; - if ( (tfd = realsocket(AF_UNIX, SOCK_STREAM, 0)) == -1) { perror("socket error"); exit(-1); } - while(conn_err < 0 && attempts < SERVICE_CONNECT_ATTEMPTS) { - dwr("trying connection (%d): %s\n", tfd, af_sock_name); + //dwr("trying connection (%d): %s\n", tfd, af_sock_name); conn_err = realconnect(tfd, (struct sockaddr*)&addr, sizeof(addr)); if(conn_err < 0) { @@ -252,19 +244,6 @@ void my_dest(void) { void load_symbols(void) { - /* - dwr("sizeof(connect_st) = %d\n", sizeof(struct connect_st)); - dwr("sizeof(bind_st) = %d\n", sizeof(struct bind_st)); - dwr("sizeof(close_st) = %d\n", sizeof(struct close_st)); - dwr("sizeof(read_st) = %d\n", sizeof(struct read_st)); - dwr("sizeof(write_st) = %d\n", sizeof(struct write_st)); - dwr("sizeof(listen_st) = %d\n", sizeof(struct listen_st)); - dwr("sizeof(socket_st) = %d\n", sizeof(struct socket_st)); - dwr("sizeof(accept_st) = %d\n", sizeof(struct accept_st)); - dwr("sizeof(shutdown_st) = %d\n", sizeof(struct shutdown_st)); - dwr("sizeof(struct sockaddr) = %d\n", sizeof(struct sockaddr)); - */ - #ifdef USE_OLD_DLSYM void *lib; #endif @@ -272,8 +251,8 @@ void load_symbols(void) if(thispid == getpid()) { dwr("detected duplicate call to global ctor (pid=%d).\n", thispid); } - dwr(" -- pid = %d\n", getpid()); - dwr(" -- uid = %d\n", getuid()); + //dwr(" -- pid = %d\n", getpid()); + //dwr(" -- uid = %d\n", getuid()); thispid = getpid(); #ifndef USE_OLD_DLSYM @@ -288,10 +267,9 @@ void load_symbols(void) realsetsockopt = dlsym(RTLD_NEXT, "setsockopt"); realgetsockopt = dlsym(RTLD_NEXT, "getsockopt"); realaccept4 = dlsym(RTLD_NEXT, "accept4"); - - #ifdef USE_SOCKS_DNS +#ifdef USE_SOCKS_DNS realresinit = dlsym(RTLD_NEXT, "res_init"); - #endif +#endif #else lib = dlopen(LIBCONNECT, RTLD_LAZY); @@ -305,12 +283,10 @@ void load_symbols(void) realsetsockopt = dlsym(lib, "setsockopt"); realgetsockopt = dlsym(lib, "getsockopt"); realaccept4 = dlsym(lib), "accept4"); - - #ifdef USE_SOCKS_DNS +#ifdef USE_SOCKS_DNS realresinit = dlsym(lib, "res_init"); - #endif +#endif dlclose(lib); - lib = dlopen(LIBC, RTLD_LAZY); dlclose(lib); #endif @@ -335,147 +311,6 @@ void set_up_intercept() } -/*------------------------------------------------------------------------------ -------------------------- ioctl(), fcntl(), setsockopt()------------------------ -------------------------------------------------------------------------------*/ - -/* -char *cmd_to_str(int cmd) -{ - switch(cmd) - { - case F_DUPFD: - return "F_DUPFD"; - case F_GETFD: - return "F_GETFD"; - case F_SETFD: - return "F_SETFD"; - case F_GETFL: - return "F_GETFL"; - case F_SETFL: - return "F_SETFL"; - case F_GETLK: - return "F_GETLK"; - case F_SETLK: - return "F_SETLK"; - case F_SETLKW: - return "F_SETLKW"; - default: - return "?"; - } - return "?"; -} -*/ -/* -void arg_to_str(int arg) -{ - if(arg & O_RDONLY) dwr("O_RDONLY "); - if(arg & O_WRONLY) dwr("O_WRONLY "); - if(arg & O_RDWR) dwr("O_RDWR "); - if(arg & O_CREAT) dwr("O_CREAT "); - if(arg & O_EXCL) dwr("O_EXCL "); - if(arg & O_NOCTTY) dwr("O_NOCTTY "); - if(arg & O_TRUNC) dwr("O_TRUNC "); - if(arg & O_APPEND) dwr("O_APPEND "); - if(arg & O_ASYNC) dwr("O_ASYNC "); - if(arg & O_DIRECT) dwr("O_DIRECT "); - if(arg & O_NOATIME) dwr("O_NOATIME "); - if(arg & O_NONBLOCK) dwr("O_NONBLOCK "); - if(arg & O_DSYNC) dwr("O_DSYNC "); - if(arg & O_SYNC) dwr("O_SYNC "); -} -*/ -/* -char* level_to_str(int level) -{ - switch(level) - { - case SOL_SOCKET: - return "SOL_SOCKET"; - case IPPROTO_TCP: - return "IPPROTO_TCP"; - default: - return "?"; - } - return "?"; -} -*/ -/* -char* option_name_to_str(int opt) -{ - if(opt == SO_DEBUG) return "SO_DEBUG"; - if(opt == SO_BROADCAST) return "SO_BROADCAST"; - if(opt == SO_BINDTODEVICE) return "SO_BINDTODEVICE"; - if(opt == SO_REUSEADDR) return "SO_REUSEADDR"; - if(opt == SO_KEEPALIVE) return "SO_KEEPALIVE"; - if(opt == SO_LINGER) return "SO_LINGER"; - if(opt == SO_OOBINLINE) return "SO_OOBINLINE"; - if(opt == SO_SNDBUF) return "SO_SNDBUF"; - if(opt == SO_RCVBUF) return "SO_RCVBUF"; - if(opt == SO_DONTROUTE) return "SO_DONTROUTEO_ASYNC"; - if(opt == SO_RCVLOWAT) return "SO_RCVLOWAT"; - if(opt == SO_RCVTIMEO) return "SO_RCVTIMEO"; - if(opt == SO_SNDLOWAT) return "SO_SNDLOWAT"; - if(opt == SO_SNDTIMEO)return "SO_SNDTIMEO"; - return "?"; -} -*/ - -/*------------------------------------------------------------------------------ ----------------------------------- shutdown() ---------------------------------- -------------------------------------------------------------------------------*/ - -/* -void shutdown_arg_to_str(int arg) -{ - if(arg & O_RDONLY) dwr("O_RDONLY "); - if(arg & O_WRONLY) dwr("O_WRONLY "); - if(arg & O_RDWR) dwr("O_RDWR "); - if(arg & O_CREAT) dwr("O_CREAT "); - if(arg & O_EXCL) dwr("O_EXCL "); - if(arg & O_NOCTTY) dwr("O_NOCTTY "); - if(arg & O_TRUNC) dwr("O_TRUNC "); - if(arg & O_APPEND) dwr("O_APPEND "); - if(arg & O_ASYNC) dwr("O_ASYNC "); - if(arg & O_DIRECT) dwr("O_DIRECT "); - if(arg & O_NOATIME) dwr("O_NOATIME "); - if(arg & O_NONBLOCK) dwr("O_NONBLOCK "); - if(arg & O_DSYNC) dwr("O_DSYNC "); - if(arg & O_SYNC) dwr("O_SYNC "); -} -*/ - -/* -void sock_type_to_str(int arg) -{ - if(arg == SOCK_STREAM) printf("SOCK_STREAM "); - if(arg == SOCK_DGRAM) printf("SOCK_DGRAM "); - if(arg == SOCK_SEQPACKET) printf("SOCK_SEQPACKET "); - if(arg == SOCK_RAW) printf("SOCK_RAW "); - if(arg == SOCK_RDM) printf("SOCK_RDM "); - if(arg == SOCK_PACKET) printf("SOCK_PACKET "); - if(arg & SOCK_NONBLOCK) printf("| SOCK_NONBLOCK "); - if(arg & SOCK_CLOEXEC) printf("| SOCK_CLOEXEC "); -} -*/ - -/* -void sock_domain_to_str(int domain) -{ - if(domain == AF_UNIX) printf("AF_UNIX "); - if(domain == AF_LOCAL) printf("AF_LOCAL "); - if(domain == AF_INET) printf("AF_INET "); - if(domain == AF_INET6) printf("AF_INET6 "); - if(domain == AF_IPX) printf("AF_IPX "); - if(domain == AF_NETLINK) printf("AF_NETLINK "); - if(domain == AF_X25) printf("AF_X25 "); - if(domain == AF_AX25) printf("AF_AX25 "); - if(domain == AF_ATMPVC) printf("AF_ATMPVC "); - if(domain == AF_APPLETALK) printf("AF_APPLETALK "); - if(domain == AF_PACKET) printf("AF_PACKET "); -} -*/ - /*------------------------------------------------------------------------------ --------------------------------- setsockopt() --------------------------------- ------------------------------------------------------------------------------*/ @@ -844,7 +679,7 @@ int accept(ACCEPT_SIG) return -1; } pthread_mutex_unlock(&lock); - errno = ERR_OK; + //errno = ERR_OK; return new_conn_socket; // OK } else { @@ -895,7 +730,6 @@ int listen(LISTEN_SIG) return(reallisten(sockfd, backlog)); char cmd[BUF_SZ]; - dwr("listen(%d)\n", sockfd); /* Assemble and route command */ memset(cmd, '\0', BUF_SZ); struct listen_st rpc_st; diff --git a/netcon/NetconEthernetTap.cpp b/netcon/NetconEthernetTap.cpp index 0ef3a6f04..72d6273a2 100644 --- a/netcon/NetconEthernetTap.cpp +++ b/netcon/NetconEthernetTap.cpp @@ -49,7 +49,9 @@ #include "Intercept.h" #include "NetconUtilities.hpp" -#define APPLICATION_POLL_FREQ 1 +#define APPLICATION_POLL_FREQ 1 +#define ZT_LWIP_TCP_TIMER_INTERVAL 10 + namespace ZeroTier { @@ -238,7 +240,6 @@ void NetconEthernetTap::scanMulticastGroups(std::vector &added,s if (!std::binary_search(newGroups.begin(),newGroups.end(),*m)) removed.push_back(*m); } - _multicastGroups.swap(newGroups); } @@ -291,8 +292,10 @@ void NetconEthernetTap::closeConnection(TcpConnection *conn) void NetconEthernetTap::closeClient(PhySocket *sock) { for(int i=0; itap->send_return_value(conn, -1, errno); + //fprintf(stderr, "**************\n"); return ERR_MEM; } } @@ -745,7 +749,7 @@ err_t NetconEthernetTap::nc_poll(void* arg, struct tcp_pcb *tpcb) * */ err_t NetconEthernetTap::nc_sent(void* arg, struct tcp_pcb *tpcb, u16_t len) -{ +{fprintf(stderr, "nc_sent()\n"); Larg *l = (Larg*)arg; if(len) { //fprintf(stderr, "ACKING len = %d, setting read-notify = true, (sndbuf = %d)\n", len, l->conn->pcb->snd_buf); @@ -769,6 +773,7 @@ err_t NetconEthernetTap::nc_sent(void* arg, struct tcp_pcb *tpcb, u16_t len) */ err_t NetconEthernetTap::nc_connected(void *arg, struct tcp_pcb *tpcb, err_t err) { + fprintf(stderr, "nc_connected()\n"); Larg *l = (Larg*)arg; l->tap->send_return_value(l->conn, ERR_OK); return ERR_OK; diff --git a/netcon/libintercept.so.1.0 b/netcon/libintercept.so.1.0 deleted file mode 100755 index f8a46023602d89857773857897f2fe925539f665..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46264 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 diff --git a/netcon/make-intercept.mk b/netcon/make-intercept.mk index 77d26de7a..a16ff7e7f 100644 --- a/netcon/make-intercept.mk +++ b/netcon/make-intercept.mk @@ -27,7 +27,7 @@ SHCC=gcc -intercept_CFLAGS = -c -fPIC -g -O2 -Wall -std=c99 -D_GNU_SOURCE -DCHECKS -DNETCON_INTERCEPT +intercept_CFLAGS = -c -fPIC -g -O2 -Wall -std=c99 -DCHECKS -D_GNU_SOURCE -DNETCON_INTERCEPT LIB_NAME = intercept SHLIB_EXT=dylib SHLIB_MAJOR = 1