unity: Replicate default behavior if no UNITY_SPLIT_INCLUDE attributes were received
This commit is contained in:
@@ -35,6 +35,26 @@ struct private_unity_narrow_t {
|
|||||||
unity_handler_t *handler;
|
unity_handler_t *handler;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Narrow the given received traffic selector with the child configuration and
|
||||||
|
* put them into the given list of TS
|
||||||
|
*/
|
||||||
|
static void narrow_ts(child_cfg_t *cfg, traffic_selector_t *ts,
|
||||||
|
linked_list_t *list)
|
||||||
|
{
|
||||||
|
linked_list_t *received, *selected;
|
||||||
|
|
||||||
|
received = linked_list_create();
|
||||||
|
received->insert_last(received, ts);
|
||||||
|
selected = cfg->get_traffic_selectors(cfg, FALSE, received, NULL);
|
||||||
|
while (selected->remove_first(selected, (void**)&ts) == SUCCESS)
|
||||||
|
{
|
||||||
|
list->insert_last(list, ts);
|
||||||
|
}
|
||||||
|
selected->destroy(selected);
|
||||||
|
received->destroy(received);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Narrow TS as initiator to Unity Split-Include/Local-LAN
|
* Narrow TS as initiator to Unity Split-Include/Local-LAN
|
||||||
*/
|
*/
|
||||||
@@ -42,7 +62,6 @@ static void narrow_initiator(private_unity_narrow_t *this, ike_sa_t *ike_sa,
|
|||||||
child_cfg_t *cfg, linked_list_t *remote)
|
child_cfg_t *cfg, linked_list_t *remote)
|
||||||
{
|
{
|
||||||
traffic_selector_t *current, *orig = NULL;
|
traffic_selector_t *current, *orig = NULL;
|
||||||
linked_list_t *received, *selected;
|
|
||||||
enumerator_t *enumerator;
|
enumerator_t *enumerator;
|
||||||
|
|
||||||
enumerator = this->handler->create_include_enumerator(this->handler,
|
enumerator = this->handler->create_include_enumerator(this->handler,
|
||||||
@@ -56,16 +75,7 @@ static void narrow_initiator(private_unity_narrow_t *this, ike_sa_t *ike_sa,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* narrow received Unity TS with the child configuration */
|
narrow_ts(cfg, current, remote);
|
||||||
received = linked_list_create();
|
|
||||||
received->insert_last(received, current);
|
|
||||||
selected = cfg->get_traffic_selectors(cfg, FALSE, received, NULL);
|
|
||||||
while (selected->remove_first(selected, (void**)¤t) == SUCCESS)
|
|
||||||
{
|
|
||||||
remote->insert_last(remote, current);
|
|
||||||
}
|
|
||||||
selected->destroy(selected);
|
|
||||||
received->destroy(received);
|
|
||||||
}
|
}
|
||||||
enumerator->destroy(enumerator);
|
enumerator->destroy(enumerator);
|
||||||
if (orig)
|
if (orig)
|
||||||
@@ -75,6 +85,15 @@ static void narrow_initiator(private_unity_narrow_t *this, ike_sa_t *ike_sa,
|
|||||||
UNITY_SPLIT_INCLUDE, remote);
|
UNITY_SPLIT_INCLUDE, remote);
|
||||||
orig->destroy(orig);
|
orig->destroy(orig);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{ /* since we originally changed the traffic selector to 0.0.0.0/0 local
|
||||||
|
* narrowing is not applied if no Split-Include attrs are received */
|
||||||
|
if (remote->remove_first(remote, (void**)&orig) == SUCCESS)
|
||||||
|
{
|
||||||
|
narrow_ts(cfg, orig, remote);
|
||||||
|
orig->destroy(orig);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -93,6 +112,8 @@ static void narrow_initiator_pre(linked_list_t *list)
|
|||||||
"255.255.255.255", 65535);
|
"255.255.255.255", 65535);
|
||||||
if (ts)
|
if (ts)
|
||||||
{
|
{
|
||||||
|
DBG2(DBG_CFG, "changing proposed traffic selectors for other:");
|
||||||
|
DBG2(DBG_CFG, " %R", ts);
|
||||||
list->insert_last(list, ts);
|
list->insert_last(list, ts);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user