aboutsummaryrefslogtreecommitdiffstats
path: root/src/libimcv/imc/imc_msg.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libimcv/imc/imc_msg.c')
-rw-r--r--src/libimcv/imc/imc_msg.c31
1 files changed, 22 insertions, 9 deletions
diff --git a/src/libimcv/imc/imc_msg.c b/src/libimcv/imc/imc_msg.c
index 810a92a93..83337cf7b 100644
--- a/src/libimcv/imc/imc_msg.c
+++ b/src/libimcv/imc/imc_msg.c
@@ -117,7 +117,8 @@ METHOD(imc_msg_t, send_, TNC_Result,
/* Get IF-M segmentation contract for this subtype if any */
contracts = this->state->get_contracts(this->state);
- contract = contracts->get_contract(contracts, this->msg_type, FALSE);
+ contract = contracts->get_contract(contracts, this->msg_type,
+ FALSE, this->dst_id);
while (this->attr_list->get_count(this->attr_list))
{
@@ -287,6 +288,10 @@ METHOD(imc_msg_t, receive, TNC_Result,
return TNC_RESULT_FATAL;
}
+ /* determine target IMC ID */
+ target_imc_id = (this->dst_id != TNC_IMCID_ANY) ?
+ this->dst_id : this->agent->get_id(this->agent);
+
/* process any IF-M segmentation contracts */
enumerator = this->pa_msg->create_attribute_enumerator(this->pa_msg);
while (enumerator->enumerate(enumerator, &attr))
@@ -316,7 +321,7 @@ METHOD(imc_msg_t, receive, TNC_Result,
attr_cast->get_attr_size(attr_cast, &max_attr_size,
&max_seg_size);
contract = contracts->get_contract(contracts, this->msg_type,
- FALSE);
+ FALSE, this->src_id);
if (contract)
{
contract->set_max_size(contract, max_attr_size,
@@ -326,6 +331,7 @@ METHOD(imc_msg_t, receive, TNC_Result,
{
contract = seg_contract_create(this->msg_type, max_attr_size,
max_seg_size, FALSE, this->src_id, TRUE);
+ contract->set_responder(contract, target_imc_id);
contracts->add_contract(contracts, contract);
}
contract->get_info_string(contract, buf, BUF_LEN, TRUE);
@@ -364,7 +370,18 @@ METHOD(imc_msg_t, receive, TNC_Result,
attr_cast->get_attr_size(attr_cast, &max_attr_size,
&max_seg_size);
contract = contracts->get_contract(contracts, this->msg_type,
- TRUE);
+ TRUE, this->src_id);
+ if (!contract)
+ {
+ contract = contracts->get_contract(contracts, this->msg_type,
+ TRUE, TNC_IMCID_ANY);
+ if (contract)
+ {
+ contract = contract->clone(contract);
+ contract->set_responder(contract, this->src_id);
+ contracts->add_contract(contracts, contract);
+ }
+ }
if (contract)
{
contract->get_max_size(contract, &my_max_attr_size,
@@ -397,7 +414,7 @@ METHOD(imc_msg_t, receive, TNC_Result,
base_attr_id = seg_env_attr->get_base_attr_id(seg_env_attr);
contract = contracts->get_contract(contracts, this->msg_type,
- TRUE);
+ TRUE, this->src_id);
if (!contract)
{
DBG2(DBG_IMC, "no contract for received attribute segment "
@@ -430,7 +447,7 @@ METHOD(imc_msg_t, receive, TNC_Result,
base_attr_id = attr_cast->get_base_attr_id(attr_cast);
contract = contracts->get_contract(contracts, this->msg_type,
- FALSE);
+ FALSE, this->src_id);
if (!contract)
{
/* TODO no contract - generate error message */
@@ -457,10 +474,6 @@ METHOD(imc_msg_t, receive, TNC_Result,
}
enumerator->destroy(enumerator);
- /* determine target IMC ID */
- target_imc_id = (this->dst_id != TNC_IMCID_ANY) ?
- this->dst_id : this->agent->get_id(this->agent);
-
/* preprocess any received IETF standard error attributes */
non_fatal_types = this->agent->get_non_fatal_attr_types(this->agent);
*fatal_error = this->pa_msg->process_ietf_std_errors(this->pa_msg,