summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Johnston <matt@ucc.asn.au>2015-02-20 23:38:05 +0800
committerMatt Johnston <matt@ucc.asn.au>2015-02-20 23:38:05 +0800
commit996be37485de0029912fd91ebcfcfd84ddec46a1 (patch)
treef47101175b60188d53fdef8dc657e29ff18291f8
parentc7b7e89f7568626e4f2ce59b24636df31667fa64 (diff)
downloaddropbear-996be37485de0029912fd91ebcfcfd84ddec46a1.tar.gz
Fixes for backwards compatibility
-rw-r--r--configure.ac2
-rw-r--r--dbutil.h12
-rw-r--r--netio.c85
-rw-r--r--netio.h12
-rw-r--r--sysoptions.h5
5 files changed, 56 insertions, 60 deletions
diff --git a/configure.ac b/configure.ac
index b952d7e..b0e85e5 100644
--- a/configure.ac
+++ b/configure.ac
@@ -632,7 +632,7 @@ fi
AC_PROG_GCC_TRADITIONAL
AC_FUNC_MEMCMP
AC_FUNC_SELECT_ARGTYPES
-AC_CHECK_FUNCS([dup2 getspnam getusershell memset putenv select socket strdup clearenv strlcpy strlcat daemon basename _getpty getaddrinfo freeaddrinfo getnameinfo fork writev sendmsg])
+AC_CHECK_FUNCS([dup2 getspnam getusershell memset putenv select socket strdup clearenv strlcpy strlcat daemon basename _getpty getaddrinfo freeaddrinfo getnameinfo fork writev])
AC_SEARCH_LIBS(basename, gen, AC_DEFINE(HAVE_BASENAME))
diff --git a/dbutil.h b/dbutil.h
index a7b6897..f5c57b3 100644
--- a/dbutil.h
+++ b/dbutil.h
@@ -65,18 +65,6 @@ extern int debug_trace;
char * stripcontrol(const char * text);
-#if defined(__linux__) && HAVE_SENDMSG
-#define DROPBEAR_TCP_FAST_OPEN
-void set_listen_fast_open(int sock);
-/* may be supported by kernel but not libc */
-#ifndef TCP_FASTOPEN
-#define TCP_FASTOPEN 23
-#endif
-#ifndef MSG_FASTOPEN
-#define MSG_FASTOPEN 0x20000000
-#endif
-#endif
-
int spawn_command(void(*exec_fn)(void *user_data), void *exec_data,
int *writefd, int *readfd, int *errfd, pid_t *pid);
void run_shell_command(const char* cmd, unsigned int maxfd, char* usershell);
diff --git a/netio.c b/netio.c
index 8dd8060..b86c85b 100644
--- a/netio.c
+++ b/netio.c
@@ -68,6 +68,11 @@ void cancel_connect(struct dropbear_progress_connection *c) {
static void connect_try_next(struct dropbear_progress_connection *c) {
struct addrinfo *r;
+ int res = 0;
+ int fastopen = 0;
+#ifdef DROPBEAR_TCP_FAST_OPEN
+ struct msghdr message;
+#endif
if (!c->res_iter) {
return;
@@ -89,59 +94,45 @@ static void connect_try_next(struct dropbear_progress_connection *c) {
set_piggyback_ack(c->sock);
#endif
-#ifdef PROGRESS_CONNECT_FALLBACK
-#if 0
- if (connect(c->sock, r->ai_addr, r->ai_addrlen) < 0) {
- if (errno == EINPROGRESS) {
- TRACE(("Connect in progress"))
- break;
- } else {
- close(c->sock);
- c->sock = -1;
- continue;
+#ifdef DROPBEAR_TCP_FAST_OPEN
+ fastopen = (c->writequeue != NULL);
+
+ memset(&message, 0x0, sizeof(message));
+ message.msg_name = r->ai_addr;
+ message.msg_namelen = r->ai_addrlen;
+
+ if (c->writequeue) {
+ int iovlen; /* Linux msg_iovlen is a size_t */
+ message.msg_iov = packet_queue_to_iovec(c->writequeue, &iovlen);
+ message.msg_iovlen = iovlen;
+ res = sendmsg(c->sock, &message, MSG_FASTOPEN);
+ if (res < 0 && errno == EOPNOTSUPP) {
+ TRACE(("Fastopen not supported"));
+ /* No kernel MSG_FASTOPEN support. Fall back below */
+ fastopen = 0;
+ /* Set to NULL to avoid trying again */
+ c->writequeue = NULL;
+ }
+ m_free(message.msg_iov);
+ if (res > 0) {
+ packet_queue_consume(c->writequeue, res);
}
}
-
- break; /* Success. Treated the same as EINPROGRESS */
#endif
-#else
- {
- struct msghdr message;
- int res = 0;
- memset(&message, 0x0, sizeof(message));
- message.msg_name = r->ai_addr;
- message.msg_namelen = r->ai_addrlen;
-
- if (c->writequeue) {
- int iovlen; /* Linux msg_iovlen is a size_t */
- message.msg_iov = packet_queue_to_iovec(c->writequeue, &iovlen);
- message.msg_iovlen = iovlen;
- res = sendmsg(c->sock, &message, MSG_FASTOPEN);
- if (res < 0 && errno == EOPNOTSUPP) {
- TRACE(("Fastopen not supported"));
- /* No kernel MSG_FASTOPEN support. Fall back below */
- c->writequeue = NULL;
- }
- m_free(message.msg_iov);
- if (res > 0) {
- packet_queue_consume(c->writequeue, res);
- }
- }
- if (!c->writequeue) {
- res = connect(c->sock, r->ai_addr, r->ai_addrlen);
- }
- if (res < 0 && errno != EINPROGRESS) {
- close(c->sock);
- c->sock = -1;
- continue;
- } else {
- break;
- }
+ /* Normal connect(), used as fallback for TCP fastopen too */
+ if (!fastopen) {
+ res = connect(c->sock, r->ai_addr, r->ai_addrlen);
}
-#endif
- }
+ if (res < 0 && errno != EINPROGRESS) {
+ close(c->sock);
+ c->sock = -1;
+ continue;
+ } else {
+ break;
+ }
+ }
if (r) {
c->res_iter = r->ai_next;
diff --git a/netio.h b/netio.h
index 3c98d6c..280ccaf 100644
--- a/netio.h
+++ b/netio.h
@@ -42,5 +42,17 @@ void connect_set_writequeue(struct dropbear_progress_connection *c, struct Queue
struct iovec * packet_queue_to_iovec(struct Queue *queue, int *ret_iov_count);
void packet_queue_consume(struct Queue *queue, ssize_t written);
+#ifdef DROPBEAR_TCP_FAST_OPEN
+/* Try for any Linux builds, will fall back if the kernel doesn't support it */
+void set_listen_fast_open(int sock);
+/* Define values which may be supported by the kernel even if the libc is too old */
+#ifndef TCP_FASTOPEN
+#define TCP_FASTOPEN 23
+#endif
+#ifndef MSG_FASTOPEN
+#define MSG_FASTOPEN 0x20000000
+#endif
+#endif
+
#endif
diff --git a/sysoptions.h b/sysoptions.h
index bec7246..092eb7e 100644
--- a/sysoptions.h
+++ b/sysoptions.h
@@ -259,4 +259,9 @@
/* Use this string since some implementations might special-case it */
#define DROPBEAR_KEEPALIVE_STRING "keepalive@openssh.com"
+/* Linux will attempt TCP fast open, falling back if not supported by the kernel */
+#ifdef __linux__
+#define DROPBEAR_TCP_FAST_OPEN 1
+#endif
+
/* no include guard for this file */