Permit unlimited connection entries and remotes

Currently we allow a max of 64 connection entries and remotes.
A larger number would allow users with 100's of independent
config files for different end points of same provider to
consolidate them to connection entries.

v2,v3: no change

Signed-off-by: Selva Nair <selva.nair@gmail.com>
Acked-by: Arne Schwabe <arne@rfc2549.org>
Message-Id: <20210907223126.8440-2-selva.nair@gmail.com>
URL: https://www.mail-archive.com/openvpn-devel@lists.sourceforge.net/msg22816.html
Signed-off-by: Gert Doering <gert@greenie.muc.de>
This commit is contained in:
Selva Nair 2021-09-07 18:31:25 -04:00 committed by Gert Doering
parent 1252638047
commit 4954beb618
3 changed files with 36 additions and 8 deletions

View file

@ -10,6 +10,8 @@ instead: https://github.com/OpenVPN/openvpn/issues
New features
------------
Support unlimited number of connection entries and remote entries
New management commands to enumerate and list remote entries
Use ``remote-entry-count`` and ``remote-entry-get``
commands from the management interface to get the number of

View file

@ -916,6 +916,16 @@ init_options(struct options *o, const bool init_gc)
void
uninit_options(struct options *o)
{
if (o->connection_list)
{
free(o->connection_list->array);
CLEAR(*o->connection_list);
}
if (o->remote_list)
{
free(o->remote_list->array);
CLEAR(*o->remote_list);
}
if (o->gc_owned)
{
gc_free(&o->gc);
@ -2160,10 +2170,17 @@ alloc_connection_entry(struct options *options, const int msglevel)
struct connection_list *l = alloc_connection_list_if_undef(options);
struct connection_entry *e;
if (l->len >= CONNECTION_LIST_SIZE)
if (l->len == l->capacity)
{
msg(msglevel, "Maximum number of 'connection' options (%d) exceeded", CONNECTION_LIST_SIZE);
return NULL;
int capacity = l->capacity + CONNECTION_LIST_SIZE;
struct connection_entry **ce = realloc(l->array, capacity*sizeof(struct connection_entry *));
if (ce == NULL)
{
msg(msglevel, "Unable to process more connection options: out of memory. Number of entries = %d", l->len);
return NULL;
}
l->array = ce;
l->capacity = capacity;
}
ALLOC_OBJ_GC(e, struct connection_entry, &options->gc);
l->array[l->len++] = e;
@ -2186,10 +2203,17 @@ alloc_remote_entry(struct options *options, const int msglevel)
struct remote_list *l = alloc_remote_list_if_undef(options);
struct remote_entry *e;
if (l->len >= CONNECTION_LIST_SIZE)
if (l->len == l->capacity)
{
msg(msglevel, "Maximum number of 'remote' options (%d) exceeded", CONNECTION_LIST_SIZE);
return NULL;
int capacity = l->capacity + CONNECTION_LIST_SIZE;
struct remote_entry **re = realloc(l->array, capacity*sizeof(struct remote_entry *));
if (re == NULL)
{
msg(msglevel, "Unable to process more remote options: out of memory. Number of entries = %d", l->len);
return NULL;
}
l->array = re;
l->capacity = capacity;
}
ALLOC_OBJ_GC(e, struct remote_entry, &options->gc);
l->array[l->len++] = e;

View file

@ -183,15 +183,17 @@ struct remote_entry
struct connection_list
{
int capacity;
int len;
int current;
struct connection_entry *array[CONNECTION_LIST_SIZE];
struct connection_entry **array;
};
struct remote_list
{
int capacity;
int len;
struct remote_entry *array[CONNECTION_LIST_SIZE];
struct remote_entry **array;
};
struct provider_list