diff --git a/doc/management-notes.txt b/doc/management-notes.txt index 60d46d64..6daa811a 100644 --- a/doc/management-notes.txt +++ b/doc/management-notes.txt @@ -877,6 +877,13 @@ use this command: remote SKIP +Starting OpenVPN version 2.6 (management version > 3), skip +multiple remotes using: + + remote SKIP n + +where n > 0 is the number of remotes to skip. + COMMAND -- proxy (OpenVPN 2.3 or higher) -------------------------------------------- diff --git a/src/openvpn/init.c b/src/openvpn/init.c index f63422ff..2e95256c 100644 --- a/src/openvpn/init.c +++ b/src/openvpn/init.c @@ -389,6 +389,7 @@ management_callback_remote_cmd(void *arg, const char **p) { flags = CE_MAN_QUERY_REMOTE_SKIP; ret = true; + c->options.ce_advance_count = (p[2]) ? atoi(p[2]) : 1; } else if (!strcmp(p[1], "MOD") && p[2] && p[3]) { @@ -563,18 +564,28 @@ next_connection_entry(struct context *c) c->c1.link_socket_addr.remote_list; } + int advance_count = 1; + + /* If previous connection entry was skipped by management client + * with a count to advance by, apply it. + */ + if (c->options.ce_advance_count > 0) + { + advance_count = c->options.ce_advance_count; + } + /* * Increase the number of connection attempts * If this is connect-retry-max * size(l) * OpenVPN will quit */ - c->options.unsuccessful_attempts++; + c->options.unsuccessful_attempts += advance_count; + l->current += advance_count; - if (++l->current >= l->len) + if (l->current >= l->len) { - - l->current = 0; + l->current %= l->len; if (++n_cycles >= 2) { msg(M_FATAL, "No usable connection profiles are present"); @@ -583,6 +594,7 @@ next_connection_entry(struct context *c) } } + c->options.ce_advance_count = 1; ce = l->array[l->current]; if (ce->flags & CE_DISABLED) diff --git a/src/openvpn/options.h b/src/openvpn/options.h index 04cc2e5c..fec1eace 100644 --- a/src/openvpn/options.h +++ b/src/openvpn/options.h @@ -285,6 +285,8 @@ struct options bool advance_next_remote; /* Counts the number of unsuccessful connection attempts */ unsigned int unsuccessful_attempts; + /* count of connection entries to advance by when no_advance is not set */ + int ce_advance_count; /* the server can suggest a backoff time to the client, it * will still be capped by the max timeout between connections * (300s by default) */