kernel-interface: Consider interface ID when allocating reqids

This commit is contained in:
Tobias Brunner
2019-04-03 12:00:08 +02:00
parent 72c96dbf9f
commit f99bd2a5a6
3 changed files with 36 additions and 12 deletions
+23 -6
View File
@@ -199,6 +199,10 @@ typedef struct {
mark_t mark_in; mark_t mark_in;
/** outbound mark used for SA */ /** outbound mark used for SA */
mark_t mark_out; mark_t mark_out;
/** inbound interface ID used for SA */
uint32_t if_id_in;
/** outbound interface ID used for SA */
uint32_t if_id_out;
/** local traffic selectors */ /** local traffic selectors */
array_t *local; array_t *local;
/** remote traffic selectors */ /** remote traffic selectors */
@@ -222,7 +226,9 @@ static u_int hash_reqid(reqid_entry_t *entry)
{ {
return chunk_hash_inc(chunk_from_thing(entry->reqid), return chunk_hash_inc(chunk_from_thing(entry->reqid),
chunk_hash_inc(chunk_from_thing(entry->mark_in), chunk_hash_inc(chunk_from_thing(entry->mark_in),
chunk_hash(chunk_from_thing(entry->mark_out)))); chunk_hash_inc(chunk_from_thing(entry->mark_out),
chunk_hash_inc(chunk_from_thing(entry->if_id_in),
chunk_hash(chunk_from_thing(entry->if_id_out))))));
} }
/** /**
@@ -234,7 +240,9 @@ static bool equals_reqid(reqid_entry_t *a, reqid_entry_t *b)
a->mark_in.value == b->mark_in.value && a->mark_in.value == b->mark_in.value &&
a->mark_in.mask == b->mark_in.mask && a->mark_in.mask == b->mark_in.mask &&
a->mark_out.value == b->mark_out.value && a->mark_out.value == b->mark_out.value &&
a->mark_out.mask == b->mark_out.mask; a->mark_out.mask == b->mark_out.mask &&
a->if_id_in == b->if_id_in &&
a->if_id_out == b->if_id_out;
} }
/** /**
@@ -262,7 +270,9 @@ static u_int hash_reqid_by_ts(reqid_entry_t *entry)
{ {
return hash_ts_array(entry->local, hash_ts_array(entry->remote, return hash_ts_array(entry->local, hash_ts_array(entry->remote,
chunk_hash_inc(chunk_from_thing(entry->mark_in), chunk_hash_inc(chunk_from_thing(entry->mark_in),
chunk_hash(chunk_from_thing(entry->mark_out))))); chunk_hash_inc(chunk_from_thing(entry->mark_out),
chunk_hash_inc(chunk_from_thing(entry->if_id_in),
chunk_hash(chunk_from_thing(entry->if_id_out)))))));
} }
/** /**
@@ -301,7 +311,9 @@ static bool equals_reqid_by_ts(reqid_entry_t *a, reqid_entry_t *b)
a->mark_in.value == b->mark_in.value && a->mark_in.value == b->mark_in.value &&
a->mark_in.mask == b->mark_in.mask && a->mark_in.mask == b->mark_in.mask &&
a->mark_out.value == b->mark_out.value && a->mark_out.value == b->mark_out.value &&
a->mark_out.mask == b->mark_out.mask; a->mark_out.mask == b->mark_out.mask &&
a->if_id_in == b->if_id_in &&
a->if_id_out == b->if_id_out;
} }
/** /**
@@ -328,7 +340,8 @@ static array_t *array_from_ts_list(linked_list_t *list)
METHOD(kernel_interface_t, alloc_reqid, status_t, METHOD(kernel_interface_t, alloc_reqid, status_t,
private_kernel_interface_t *this, private_kernel_interface_t *this,
linked_list_t *local_ts, linked_list_t *remote_ts, linked_list_t *local_ts, linked_list_t *remote_ts,
mark_t mark_in, mark_t mark_out, uint32_t *reqid) mark_t mark_in, mark_t mark_out, uint32_t if_id_in, uint32_t if_id_out,
uint32_t *reqid)
{ {
static uint32_t counter = 0; static uint32_t counter = 0;
reqid_entry_t *entry = NULL, *tmpl; reqid_entry_t *entry = NULL, *tmpl;
@@ -339,6 +352,8 @@ METHOD(kernel_interface_t, alloc_reqid, status_t,
.remote = array_from_ts_list(remote_ts), .remote = array_from_ts_list(remote_ts),
.mark_in = mark_in, .mark_in = mark_in,
.mark_out = mark_out, .mark_out = mark_out,
.if_id_in = if_id_in,
.if_id_out = if_id_out,
.reqid = *reqid, .reqid = *reqid,
); );
@@ -381,12 +396,14 @@ METHOD(kernel_interface_t, alloc_reqid, status_t,
METHOD(kernel_interface_t, release_reqid, status_t, METHOD(kernel_interface_t, release_reqid, status_t,
private_kernel_interface_t *this, uint32_t reqid, private_kernel_interface_t *this, uint32_t reqid,
mark_t mark_in, mark_t mark_out) mark_t mark_in, mark_t mark_out, uint32_t if_id_in, uint32_t if_id_out)
{ {
reqid_entry_t *entry, tmpl = { reqid_entry_t *entry, tmpl = {
.reqid = reqid, .reqid = reqid,
.mark_in = mark_in, .mark_in = mark_in,
.mark_out = mark_out, .mark_out = mark_out,
.if_id_in = if_id_in,
.if_id_out = if_id_out,
}; };
this->mutex->lock(this->mutex); this->mutex->lock(this->mutex);
+8 -3
View File
@@ -143,13 +143,15 @@ struct kernel_interface_t {
* @param remote_ts traffic selectors of remote side for SA * @param remote_ts traffic selectors of remote side for SA
* @param mark_in inbound mark on SA * @param mark_in inbound mark on SA
* @param mark_out outbound mark on SA * @param mark_out outbound mark on SA
* @param if_id_in inbound interface ID on SA
* @param if_id_out outbound interface ID on SA
* @param reqid allocated reqid * @param reqid allocated reqid
* @return SUCCESS if reqid allocated * @return SUCCESS if reqid allocated
*/ */
status_t (*alloc_reqid)(kernel_interface_t *this, status_t (*alloc_reqid)(kernel_interface_t *this,
linked_list_t *local_ts, linked_list_t *remote_ts, linked_list_t *local_ts, linked_list_t *remote_ts,
mark_t mark_in, mark_t mark_out, mark_t mark_in, mark_t mark_out, uint32_t if_id_in,
uint32_t *reqid); uint32_t if_id_out, uint32_t *reqid);
/** /**
* Release a previously allocated reqid. * Release a previously allocated reqid.
@@ -157,10 +159,13 @@ struct kernel_interface_t {
* @param reqid reqid to release * @param reqid reqid to release
* @param mark_in inbound mark on SA * @param mark_in inbound mark on SA
* @param mark_out outbound mark on SA * @param mark_out outbound mark on SA
* @param if_id_in inbound interface ID on SA
* @param if_id_out outbound interface ID on SA
* @return SUCCESS if reqid released * @return SUCCESS if reqid released
*/ */
status_t (*release_reqid)(kernel_interface_t *this, uint32_t reqid, status_t (*release_reqid)(kernel_interface_t *this, uint32_t reqid,
mark_t mark_in, mark_t mark_out); mark_t mark_in, mark_t mark_out,
uint32_t if_id_in, uint32_t if_id_out);
/** /**
* Add an SA to the SAD. * Add an SA to the SAD.
+5 -3
View File
@@ -832,7 +832,8 @@ static status_t install_internal(private_child_sa_t *this, chunk_t encr,
if (!this->reqid_allocated && !this->static_reqid) if (!this->reqid_allocated && !this->static_reqid)
{ {
status = charon->kernel->alloc_reqid(charon->kernel, my_ts, other_ts, status = charon->kernel->alloc_reqid(charon->kernel, my_ts, other_ts,
this->mark_in, this->mark_out, &this->reqid); this->mark_in, this->mark_out, 0, 0,
&this->reqid);
if (status != SUCCESS) if (status != SUCCESS)
{ {
my_ts->destroy(my_ts); my_ts->destroy(my_ts);
@@ -1228,7 +1229,7 @@ METHOD(child_sa_t, install_policies, status_t,
array_create_enumerator(this->other_ts)); array_create_enumerator(this->other_ts));
status = charon->kernel->alloc_reqid( status = charon->kernel->alloc_reqid(
charon->kernel, my_ts_list, other_ts_list, charon->kernel, my_ts_list, other_ts_list,
this->mark_in, this->mark_out, &this->reqid); this->mark_in, this->mark_out, 0, 0, &this->reqid);
my_ts_list->destroy(my_ts_list); my_ts_list->destroy(my_ts_list);
other_ts_list->destroy(other_ts_list); other_ts_list->destroy(other_ts_list);
if (status != SUCCESS) if (status != SUCCESS)
@@ -1703,7 +1704,8 @@ METHOD(child_sa_t, destroy, void,
if (this->reqid_allocated) if (this->reqid_allocated)
{ {
if (charon->kernel->release_reqid(charon->kernel, if (charon->kernel->release_reqid(charon->kernel,
this->reqid, this->mark_in, this->mark_out) != SUCCESS) this->reqid, this->mark_in, this->mark_out,
0, 0) != SUCCESS)
{ {
DBG1(DBG_CHD, "releasing reqid %u failed", this->reqid); DBG1(DBG_CHD, "releasing reqid %u failed", this->reqid);
} }