Skip to content

Commit

Permalink
move setsockopt to util function
Browse files Browse the repository at this point in the history
  • Loading branch information
Fabian Mauchle committed May 12, 2017
1 parent e48d335 commit 0f342f7
Show file tree
Hide file tree
Showing 4 changed files with 27 additions and 25 deletions.
26 changes: 1 addition & 25 deletions tcp.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
#include <signal.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <netdb.h>
#include <string.h>
#include <unistd.h>
Expand Down Expand Up @@ -84,9 +83,6 @@ int tcpconnect(struct server *server, struct timeval *when, int timeout, char *t
struct timeval now;
time_t elapsed;

int optval;
socklen_t optlen = sizeof(optval);

debug(DBG_DBG, "tcpconnect: called from %s", text);
pthread_mutex_lock(&server->lock);
if (when && memcmp(&server->lastconnecttry, when, sizeof(struct timeval))) {
Expand Down Expand Up @@ -123,27 +119,7 @@ int tcpconnect(struct server *server, struct timeval *when, int timeout, char *t
if (server->sock >= 0)
close(server->sock);
if ((server->sock = connecttcphostlist(server->conf->hostports, srcres)) >= 0) {
optval = 1;
if(setsockopt(server->sock, SOL_SOCKET, TCP_KEEPCNT, &optval, optlen) < 0) {
debug(DBG_ERR, "tcpconnect: setsockopt TCP_KEEPCNT failed");
}
optval = 2000;
if(setsockopt(server->sock, SOL_SOCKET, TCP_KEEPIDLE, &optval, optlen) < 0) {
debug(DBG_ERR, "tcpconnect: setsockopt TCP_KEEPIDLE %d failed", optval);
}
if(getsockopt(server->sock, SOL_SOCKET, TCP_KEEPIDLE, &optval, &optlen) < 0) {
debug(DBG_ERR, "tcpconnect: getsockopt failed");
}else{
debug(DBG_ERR, "tcpconnect: TCP_KEEPIDLE is %d", optval);
}
optval = 1;
if(setsockopt(server->sock, SOL_SOCKET, TCP_KEEPINTVL, &optval, optlen) < 0) {
debug(DBG_ERR, "tcpconnect: setsockopt TCP_KEEPINTVL failed");
}
optval = 1;
if(setsockopt(server->sock, SOL_SOCKET, SO_KEEPALIVE, &optval, optlen) < 0) {
debug(DBG_ERR, "tcpconnect: setsockopt SO_KEEPALIVE failed");
}
enable_keepalive(server->sock);
break;
}
}
Expand Down
2 changes: 2 additions & 0 deletions tls.c
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,8 @@ int tlsconnect(struct server *server, struct timeval *when, int timeout, char *t
if ((server->sock = connecttcphostlist(server->conf->hostports, srcres)) < 0)
continue;

enable_keepalive(server->sock);

SSL_free(server->ssl);
server->ssl = NULL;
ctx = tlsgetctx(handle, server->conf->tlsconf);
Expand Down
23 changes: 23 additions & 0 deletions util.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
Expand Down Expand Up @@ -123,6 +124,28 @@ void disable_DF_bit(int socket, struct addrinfo *res) {
}
}

void enable_keepalive(int socket) {
int optval;
socklen_t optlen = sizeof(optval);

optval = 3;
if(setsockopt(socket, SOL_TCP, TCP_KEEPCNT, &optval, optlen) < 0) {
debug(DBG_ERR, "enable_keepalive: setsockopt TCP_KEEPCNT failed");
}
optval = 10;
if(setsockopt(socket, SOL_TCP, TCP_KEEPIDLE, &optval, optlen) < 0) {
debug(DBG_ERR, "enable_keepalive: setsockopt TCP_KEEPIDLE %d failed", optval);
}
optval = 10;
if(setsockopt(socket, SOL_TCP, TCP_KEEPINTVL, &optval, optlen) < 0) {
debug(DBG_ERR, "enable_keepalive: setsockopt TCP_KEEPINTVL failed");
}
optval = 1;
if(setsockopt(socket, SOL_SOCKET, SO_KEEPALIVE, &optval, optlen) < 0) {
debug(DBG_ERR, "enable_keepalive: setsockopt SO_KEEPALIVE failed");
}
}

int bindtoaddr(struct addrinfo *addrinfo, int family, int reuse, int v6only) {
int s, on = 1;
struct addrinfo *res;
Expand Down
1 change: 1 addition & 0 deletions util.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ void port_set(struct sockaddr *sa, uint16_t port);

void printfchars(char *prefixfmt, char *prefix, char *charfmt, uint8_t *chars, int len);
void disable_DF_bit(int socket, struct addrinfo *res);
void enable_keepalive(int socket);
int bindtoaddr(struct addrinfo *addrinfo, int family, int reuse, int v6only);
int connecttcp(struct addrinfo *addrinfo, struct addrinfo *src, uint16_t timeout);

Expand Down

0 comments on commit 0f342f7

Please sign in to comment.