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
*/
child_cfg_t *cfg, linked_list_t *remote)
{
traffic_selector_t *current, *orig = NULL;
- linked_list_t *received, *selected;
enumerator_t *enumerator;
enumerator = this->handler->create_include_enumerator(this->handler,
break;
}
}
- /* narrow received Unity TS with the child configuration */
- 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);
+ narrow_ts(cfg, current, remote);
}
enumerator->destroy(enumerator);
if (orig)
UNITY_SPLIT_INCLUDE, remote);
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);
+ }
+ }
}
/**
"255.255.255.255", 65535);
if (ts)
{
+ DBG2(DBG_CFG, "changing proposed traffic selectors for other:");
+ DBG2(DBG_CFG, " %R", ts);
list->insert_last(list, ts);
}
}