kernel-interface: Reallocate previously used reqids

This is mainly an issue on FreeBSD where the current kernel still only
allows the daemon to use reqids < IPSEC_MANUAL_REQID_MAX (0x3fff = 16383).

Fixes #2315.
This commit is contained in:
Tobias Brunner
2020-03-09 15:27:03 +01:00
parent 05e373aeb0
commit 4958acc0c2
+13 -2
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2008-2016 Tobias Brunner * Copyright (C) 2008-2019 Tobias Brunner
* HSR Hochschule fuer Technik Rapperswil * HSR Hochschule fuer Technik Rapperswil
* *
* Copyright (C) 2010 Martin Willi * Copyright (C) 2010 Martin Willi
@@ -126,6 +126,11 @@ struct private_kernel_interface_t {
*/ */
hashtable_t *reqids_by_ts; hashtable_t *reqids_by_ts;
/**
* Previously used reqids that have been released
*/
array_t *released_reqids;
/** /**
* mutex for algorithm mappings * mutex for algorithm mappings
*/ */
@@ -382,7 +387,10 @@ METHOD(kernel_interface_t, alloc_reqid, status_t,
{ {
/* none found, create a new entry, allocating a reqid */ /* none found, create a new entry, allocating a reqid */
entry = tmpl; entry = tmpl;
entry->reqid = ++counter; if (!array_remove(this->released_reqids, ARRAY_HEAD, &entry->reqid))
{
entry->reqid = ++counter;
}
this->reqids_by_ts->put(this->reqids_by_ts, entry, entry); this->reqids_by_ts->put(this->reqids_by_ts, entry, entry);
this->reqids->put(this->reqids, entry, entry); this->reqids->put(this->reqids, entry, entry);
} }
@@ -412,6 +420,8 @@ METHOD(kernel_interface_t, release_reqid, status_t,
{ {
if (--entry->refs == 0) if (--entry->refs == 0)
{ {
array_insert_create_value(&this->released_reqids, sizeof(uint32_t),
ARRAY_TAIL, &entry->reqid);
entry = this->reqids_by_ts->remove(this->reqids_by_ts, entry); entry = this->reqids_by_ts->remove(this->reqids_by_ts, entry);
if (entry) if (entry)
{ {
@@ -996,6 +1006,7 @@ METHOD(kernel_interface_t, destroy, void,
DESTROY_FUNCTION_IF(this->ifaces_filter, (void*)free); DESTROY_FUNCTION_IF(this->ifaces_filter, (void*)free);
this->reqids->destroy(this->reqids); this->reqids->destroy(this->reqids);
this->reqids_by_ts->destroy(this->reqids_by_ts); this->reqids_by_ts->destroy(this->reqids_by_ts);
array_destroy(this->released_reqids);
this->listeners->destroy(this->listeners); this->listeners->destroy(this->listeners);
this->mutex->destroy(this->mutex); this->mutex->destroy(this->mutex);
free(this); free(this);