uint32_t reqid;
/** destination address (wildcard case) */
host_t *dst;
+ /** security label, if any */
+ sec_label_t *label;
} acquire_t;
/**
static void destroy_acquire(acquire_t *this)
{
DESTROY_IF(this->dst);
+ DESTROY_IF(this->label);
free(this);
}
acquire_t *this, va_list args)
{
uint32_t reqid;
+ sec_label_t *label;
- VA_ARGS_VGET(args, reqid);
- return this->reqid == reqid;
+ VA_ARGS_VGET(args, reqid, label);
+ return this->reqid == reqid && sec_labels_equal(this->label, label);
}
CALLBACK(acquire_by_dst, bool,
else
{
if (this->acquires->find_first(this->acquires, acquire_by_reqid,
- (void**)&acquire, reqid))
+ (void**)&acquire, reqid, data->label))
{
ignore = TRUE;
}
{
INIT(acquire,
.reqid = reqid,
+ .label = data->label ? data->label->clone(data->label) : NULL,
);
this->acquires->insert_last(this->acquires, acquire);
}
.reqid = reqid,
.src = data->src,
.dst = data->dst,
+ .label = data->label,
};
if (this->ignore_acquire_ts || ike_sa->get_version(ike_sa) == IKEV1)
{
continue;
}
+ else if (!sec_labels_equal(acquire->label,
+ child_sa->get_label(child_sa)))
+ {
+ continue;
+ }
}
this->acquires->remove_at(this->acquires, enumerator);
destroy_acquire(acquire);