#include "surf_routing.hpp"
#include "surf_routing_private.hpp"
#include "surf_routing_cluster.hpp"
-#include "surf_routing_cluster_torus.hpp"
-#include "surf_routing_cluster_fat_tree.hpp"
#include "simgrid/platf_interface.h" // platform creation API internal interface
#include "simgrid/sg_config.h"
#include "storage_interface.hpp"
-
+#include "src/surf/platform.hpp"
#include "surf/surfxml_parse_values.h"
/*************
namespace simgrid {
namespace surf {
-simgrid::surf::signal<void(simgrid::surf::RoutingEdge*)> routingEdgeCreatedCallbacks;
-simgrid::surf::signal<void(simgrid::surf::As*)> asCreatedCallbacks;
+simgrid::xbt::signal<void(simgrid::surf::NetCard*)> netcardCreatedCallbacks;
+simgrid::xbt::signal<void(simgrid::surf::As*)> asCreatedCallbacks;
}
}
int SIMIX_STORAGE_LEVEL; //Simix storage level
int MSG_STORAGE_LEVEL; //Msg storage level
-int SD_STORAGE_LEVEL; //Simdag storage level
xbt_lib_t as_router_lib;
int ROUTING_ASR_LEVEL; //Routing level
int NS3_ASR_LEVEL; //host node for ns3
int ROUTING_PROP_ASR_LEVEL; //Where the properties are stored
-static xbt_dict_t random_value = NULL;
-
-
-/** @brief Retrieve a routing edge from its name
+/** @brief Retrieve a netcard from its name
*
- * Routing edges are either host and routers, whatever
+ * Netcards are the thing that connect host or routers to the network
*/
-simgrid::surf::RoutingEdge *sg_routing_edge_by_name_or_null(const char *name)
+simgrid::surf::NetCard *sg_netcard_by_name_or_null(const char *name)
{
sg_host_t h = sg_host_by_name(name);
- simgrid::surf::RoutingEdge *net_elm = h==NULL?NULL: sg_host_edge(h);
+ simgrid::surf::NetCard *net_elm = h==NULL?NULL: h->pimpl_netcard;
if (!net_elm)
- net_elm = (simgrid::surf::RoutingEdge*) xbt_lib_get_or_null(as_router_lib, name, ROUTING_ASR_LEVEL);
+ net_elm = (simgrid::surf::NetCard*) xbt_lib_get_or_null(as_router_lib, name, ROUTING_ASR_LEVEL);
return net_elm;
}
/* Global vars */
simgrid::surf::RoutingPlatf *routing_platf = NULL;
-/* global parse functions */
-extern xbt_dynar_t mount_list;
-
XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_route, surf, "Routing part of surf");
/** The current AS in the parsing */
return current_routing;
}
-// static void routing_parse_Srandom(void); /* random bypass */
-
-static void routing_parse_postparse(void);
-
/* this lines are only for replace use like index in the model table */
typedef enum {
SURF_MODEL_FULL = 0,
struct s_model_type routing_models[] = {
{"Full",
"Full routing data (fast, large memory requirements, fully expressive)",
- model_full_create, model_full_end},
+ model_full_create},
{"Floyd",
"Floyd routing data (slow initialization, fast lookup, lesser memory requirements, shortest path routing only)",
- model_floyd_create, model_floyd_end},
+ model_floyd_create},
{"Dijkstra",
"Dijkstra routing data (fast initialization, slow lookup, small memory requirements, shortest path routing only)",
- model_dijkstra_create, model_dijkstra_both_end},
+ model_dijkstra_create},
{"DijkstraCache",
"Dijkstra routing data (fast initialization, fast lookup, small memory requirements, shortest path routing only)",
- model_dijkstracache_create, model_dijkstra_both_end},
+ model_dijkstracache_create},
{"none", "No routing (Unless you know what you are doing, avoid using this mode in combination with a non Constant network model).",
- model_none_create, NULL},
- {"Vivaldi", "Vivaldi routing",
- model_vivaldi_create, NULL},
- {"Cluster", "Cluster routing",
- model_cluster_create, NULL},
- {"Torus_Cluster", "Torus Cluster routing",
- model_torus_cluster_create, NULL},
- {"Fat_Tree_Cluster", "Fat Tree Cluster routing",
- model_fat_tree_cluster_create, NULL},
- {NULL, NULL, NULL, NULL}
+ model_none_create},
+ {"Vivaldi", "Vivaldi routing", model_vivaldi_create},
+ {"Cluster", "Cluster routing", model_cluster_create},
+ {"Torus_Cluster", "Torus Cluster routing", model_torus_cluster_create},
+ {"Fat_Tree_Cluster", "Fat Tree Cluster routing", model_fat_tree_cluster_create},
+ {NULL, NULL, NULL}
};
/**
- * \brief Add a "host_link" to the network element list
+ * \brief Add a netcard connecting an host to the network element list
+ * FIXME: integrate into host constructor
*/
-void sg_platf_new_host_link(sg_platf_host_link_cbarg_t host)
+void sg_platf_new_netcard(sg_platf_host_link_cbarg_t netcard)
{
- simgrid::surf::RoutingEdge *info = sg_host_edge(sg_host_by_name(host->id));
- xbt_assert(info, "Host '%s' not found!", host->id);
+ simgrid::surf::NetCard *info = sg_host_by_name(netcard->id)->pimpl_netcard;
+ xbt_assert(info, "Host '%s' not found!", netcard->id);
xbt_assert(current_routing->p_modelDesc == &routing_models[SURF_MODEL_CLUSTER] ||
current_routing->p_modelDesc == &routing_models[SURF_MODEL_VIVALDI],
"You have to be in model Cluster to use tag host_link!");
s_surf_parsing_link_up_down_t link_up_down;
- link_up_down.link_up = Link::byName(host->link_up);
- link_up_down.link_down = Link::byName(host->link_down);
+ link_up_down.link_up = Link::byName(netcard->link_up);
+ link_up_down.link_down = Link::byName(netcard->link_down);
- xbt_assert(link_up_down.link_up, "Link '%s' not found!",host->link_up);
- xbt_assert(link_up_down.link_down, "Link '%s' not found!",host->link_down);
+ xbt_assert(link_up_down.link_up, "Link '%s' not found!",netcard->link_up);
+ xbt_assert(link_up_down.link_down, "Link '%s' not found!",netcard->link_down);
if(!current_routing->p_linkUpDownList)
current_routing->p_linkUpDownList = xbt_dynar_new(sizeof(s_surf_parsing_link_up_down_t),NULL);
- // If dynar is is greater than edge id and if the host_link is already defined
+ // If dynar is is greater than netcard id and if the host_link is already defined
if((int)xbt_dynar_length(current_routing->p_linkUpDownList) > info->getId() &&
xbt_dynar_get_as(current_routing->p_linkUpDownList, info->getId(), void*))
- surf_parse_error("Host_link for '%s' is already defined!",host->id);
+ surf_parse_error("Host_link for '%s' is already defined!",netcard->id);
XBT_DEBUG("Push Host_link for host '%s' to position %d", info->getName(), info->getId());
xbt_dynar_set_as(current_routing->p_linkUpDownList, info->getId(), s_surf_parsing_link_up_down_t, link_up_down);
}
-/**
- * \brief Add a "host" to the network element list
- */
-simgrid::surf::RoutingEdge *routing_add_host(
- simgrid::surf::As* current_routing, sg_platf_host_cbarg_t host)
-{
- if (current_routing->p_hierarchy == SURF_ROUTING_NULL)
- current_routing->p_hierarchy = SURF_ROUTING_BASE;
- xbt_assert(!sg_host_by_name(host->id),
- "Reading a host, processing unit \"%s\" already exists", host->id);
-
- simgrid::surf::RoutingEdge *routingEdge =
- new simgrid::surf::RoutingEdgeImpl(xbt_strdup(host->id),
- -1,
- SURF_NETWORK_ELEMENT_HOST,
- current_routing);
- routingEdge->setId(current_routing->parsePU(routingEdge));
- sg_host_t h = sg_host_by_name_or_create(host->id);
- sg_host_edge_set(h, routingEdge);
- XBT_DEBUG("Having set name '%s' id '%d'", host->id, routingEdge->getId());
- simgrid::surf::routingEdgeCreatedCallbacks(routingEdge);
-
- if(mount_list){
- xbt_lib_set(storage_lib, host->id, ROUTING_STORAGE_HOST_LEVEL, (void *) mount_list);
- mount_list = NULL;
- }
-
- if (host->coord && strcmp(host->coord, "")) {
- unsigned int cursor;
- char*str;
-
- if (!COORD_HOST_LEVEL)
- xbt_die ("To use host coordinates, please add --cfg=network/coordinates:yes to your command line");
- /* Pre-parse the host coordinates -- FIXME factorize with routers by overloading the routing->parse_PU function*/
- xbt_dynar_t ctn_str = xbt_str_split_str(host->coord, " ");
- xbt_dynar_t ctn = xbt_dynar_new(sizeof(double),NULL);
- xbt_dynar_foreach(ctn_str,cursor, str) {
- double val = atof(str);
- xbt_dynar_push(ctn,&val);
- }
- xbt_dynar_shrink(ctn, 0);
- xbt_dynar_free(&ctn_str);
- h->extension_set(COORD_HOST_LEVEL, (void *) ctn);
- XBT_DEBUG("Having set host coordinates for '%s'",host->id);
- }
-
- return routingEdge;
-}
-
-/**
- * \brief Store the ASroute by calling the set_ASroute function of the current routing component
- */
-static void parse_E_ASroute(sg_platf_route_cbarg_t ASroute)
-{
- /*FIXME:REMOVE:xbt_assert(current_routing->parse_ASroute,
- "no defined method \"set_ASroute\" in \"%s\"",
- current_routing->name);*/
- current_routing->parseASroute(ASroute);
-}
-
void sg_platf_new_trace(sg_platf_trace_cbarg_t trace)
{
tmgr_trace_t tmgr_trace;
if (!trace->file || strcmp(trace->file, "") != 0) {
tmgr_trace = tmgr_trace_new_from_file(trace->file);
- } else if (strcmp(trace->pc_data, "") == 0) {
- tmgr_trace = NULL;
} else {
- tmgr_trace =
- tmgr_trace_new_from_string(trace->id, trace->pc_data,
- trace->periodicity);
+ xbt_assert(strcmp(trace->pc_data, ""),
+ "Trace '%s' must have either a content, or point to a file on disk.",trace->id);
+ tmgr_trace = tmgr_trace_new_from_string(trace->id, trace->pc_data, trace->periodicity);
}
xbt_dict_set(traces_set_list, trace->id, (void *) tmgr_trace, NULL);
}
-void sg_platf_trace_connect(sg_platf_trace_connect_cbarg_t trace_connect)
-{
- xbt_assert(xbt_dict_get_or_null
- (traces_set_list, trace_connect->trace),
- "Cannot connect trace %s to %s: trace unknown",
- trace_connect->trace,
- trace_connect->element);
-
- switch (trace_connect->kind) {
- case SURF_TRACE_CONNECT_KIND_HOST_AVAIL:
- xbt_dict_set(trace_connect_list_host_avail,
- trace_connect->trace,
- xbt_strdup(trace_connect->element), NULL);
- break;
- case SURF_TRACE_CONNECT_KIND_POWER:
- xbt_dict_set(trace_connect_list_power, trace_connect->trace,
- xbt_strdup(trace_connect->element), NULL);
- break;
- case SURF_TRACE_CONNECT_KIND_LINK_AVAIL:
- xbt_dict_set(trace_connect_list_link_avail,
- trace_connect->trace,
- xbt_strdup(trace_connect->element), NULL);
- break;
- case SURF_TRACE_CONNECT_KIND_BANDWIDTH:
- xbt_dict_set(trace_connect_list_bandwidth,
- trace_connect->trace,
- xbt_strdup(trace_connect->element), NULL);
- break;
- case SURF_TRACE_CONNECT_KIND_LATENCY:
- xbt_dict_set(trace_connect_list_latency, trace_connect->trace,
- xbt_strdup(trace_connect->element), NULL);
- break;
- default:
- surf_parse_error("Cannot connect trace %s to %s: kind of trace unknown",
- trace_connect->trace, trace_connect->element);
- break;
- }
-}
-
/**
* \brief Make a new routing component to the platform
*
XBT_DEBUG("routing_AS_begin");
routing_model_description_t model = NULL;
- xbt_assert(!xbt_lib_get_or_null
- (as_router_lib, AS->id, ROUTING_ASR_LEVEL),
- "The AS \"%s\" already exists", AS->id);
+ xbt_assert(NULL == xbt_lib_get_or_null(as_router_lib, AS->id, ROUTING_ASR_LEVEL),
+ "Refusing to create a second AS called \"%s\".", AS->id);
_sg_cfg_init_status = 2; /* horrible hack: direct access to the global
* controlling the level of configuration to prevent
new_as->p_hierarchy = SURF_ROUTING_NULL;
new_as->p_name = xbt_strdup(AS->id);
- simgrid::surf::RoutingEdge *info =
- new simgrid::surf::RoutingEdgeImpl(xbt_strdup(new_as->p_name),
+ simgrid::surf::NetCard *info =
+ new simgrid::surf::NetCardImpl(xbt_strdup(new_as->p_name),
-1,
SURF_NETWORK_ELEMENT_AS,
current_routing);
/* set the new current component of the tree */
current_routing = new_as;
- current_routing->p_netElem = info;
+ current_routing->p_netcard = info;
- simgrid::surf::routingEdgeCreatedCallbacks(info);
+ simgrid::surf::netcardCreatedCallbacks(info);
simgrid::surf::asCreatedCallbacks(new_as);
}
*/
void routing_AS_end()
{
-
- if (current_routing == NULL) {
- THROWF(arg_error, 0, "Close an AS, but none was under construction");
- } else {
- if (current_routing->p_modelDesc->end)
- current_routing->p_modelDesc->end(current_routing);
- current_routing = current_routing->p_routingFather;
- }
+ xbt_assert(current_routing, "Cannot seal the current AS: none under construction");
+ current_routing->Seal();
+ current_routing = current_routing->p_routingFather;
}
/* Aux Business methods */
* Get the common father of the to processing units, and the first different
* father in the chain
*/
-static void elements_father(sg_routing_edge_t src, sg_routing_edge_t dst,
+static void elements_father(sg_netcard_t src, sg_netcard_t dst,
AS_t * res_father,
AS_t * res_src,
AS_t * res_dst)
simgrid::surf::As *father;
/* (1) find the as where the src and dst are located */
- sg_routing_edge_t src_data = src;
- sg_routing_edge_t dst_data = dst;
+ sg_netcard_t src_data = src;
+ sg_netcard_t dst_data = dst;
src_as = src_data->getRcComponent();
dst_as = dst_data->getRcComponent();
#ifndef NDEBUG
* recursively through the ASes tree.
*/
static void _get_route_and_latency(
- simgrid::surf::RoutingEdge *src, simgrid::surf::RoutingEdge *dst,
+ simgrid::surf::NetCard *src, simgrid::surf::NetCard *dst,
xbt_dynar_t * links, double *latency)
{
s_sg_platf_route_cbarg_t route = SG_PLATF_ROUTE_INITIALIZER;
/* Common ancestor is kind enough to declare a bypass route from src to dst -- use it and bail out */
if (e_route_bypass) {
xbt_dynar_merge(links, &e_route_bypass->link_list);
- generic_free_route(e_route_bypass);
+ routing_route_free(e_route_bypass);
return;
}
route.link_list = xbt_dynar_new(sizeof(sg_routing_link_t), NULL);
// Find the net_card corresponding to father
- simgrid::surf::RoutingEdge *src_father_net_elm = src_father->p_netElem;
- simgrid::surf::RoutingEdge *dst_father_net_elm = dst_father->p_netElem;
+ simgrid::surf::NetCard *src_father_netcard = src_father->p_netcard;
+ simgrid::surf::NetCard *dst_father_netcard = dst_father->p_netcard;
- common_father->getRouteAndLatency(src_father_net_elm, dst_father_net_elm,
+ common_father->getRouteAndLatency(src_father_netcard, dst_father_netcard,
&route, latency);
xbt_assert((route.gw_src != NULL) && (route.gw_dst != NULL),
"bad gateways for route from \"%s\" to \"%s\"", src->getName(), dst->getName());
- sg_routing_edge_t src_gateway_net_elm = route.gw_src;
- sg_routing_edge_t dst_gateway_net_elm = route.gw_dst;
+ sg_netcard_t src_gateway_net_elm = route.gw_src;
+ sg_netcard_t dst_gateway_net_elm = route.gw_dst;
/* If source gateway is not our source, we have to recursively find our way up to this point */
if (src != src_gateway_net_elm)
if (dst_gateway_net_elm != dst)
_get_route_and_latency(dst_gateway_net_elm, dst, links, latency);
- // if vivaldi latency+=vivaldi(src_gateway,dst_gateway)
}
AS_t surf_platf_get_root(routing_platf_t platf){
return platf->p_root;
}
-e_surf_network_element_type_t surf_routing_edge_get_rc_type(sg_routing_edge_t edge){
- return edge->getRcType();
+e_surf_network_element_type_t surf_routing_edge_get_rc_type(sg_netcard_t netcard){
+ return netcard->getRcType();
}
namespace simgrid {
* \pre route!=NULL
*
* walk through the routing components tree and find a route between hosts
- * by calling the differents "get_route" functions in each routing component.
+ * by calling each "get_route" function in each routing component.
*/
-void RoutingPlatf::getRouteAndLatency(
- simgrid::surf::RoutingEdge *src, simgrid::surf::RoutingEdge *dst,
- xbt_dynar_t* route, double *latency)
+void RoutingPlatf::getRouteAndLatency(NetCard *src, NetCard *dst, xbt_dynar_t* route, double *latency)
{
- XBT_DEBUG("routing_get_route_and_latency from %s to %s", src->getName(), dst->getName());
- if (!*route) {
+ XBT_DEBUG("getRouteAndLatency from %s to %s", src->getName(), dst->getName());
+ if (NULL == *route) {
xbt_dynar_reset(routing_platf->p_lastRoute);
*route = routing_platf->p_lastRoute;
}
e_surf_network_element_type_t routing_get_network_element_type(const char *name)
{
- simgrid::surf::RoutingEdge *rc = sg_routing_edge_by_name_or_null(name);
+ simgrid::surf::NetCard *rc = sg_netcard_by_name_or_null(name);
if (rc)
return rc->getRcType();
return SURF_NETWORK_ELEMENT_NULL;
}
-/**
- * \brief Generic method: create the global routing schema
- *
- * Make a global routing structure and set all the parsing functions.
- */
+/** @brief create the root AS */
void routing_model_create( void *loopback)
{
- /* config the uniq global routing */
- routing_platf = new simgrid::surf::RoutingPlatf();
- routing_platf->p_root = NULL;
- routing_platf->p_loopback = loopback;
- routing_platf->p_lastRoute = xbt_dynar_new(sizeof(sg_routing_link_t),NULL);
- /* no current routing at moment */
- current_routing = NULL;
+ routing_platf = new simgrid::surf::RoutingPlatf(loopback);
}
-
-/* ************************************************** */
-/* ********** PATERN FOR NEW ROUTING **************** */
-
-/* The minimal configuration of a new routing model need the next functions,
- * also you need to set at the start of the file, the new model in the model
- * list. Remember keep the null ending of the list.
- */
-/*** Routing model structure ***/
-// typedef struct {
-// s_routing_component_t generic_routing;
-// /* things that your routing model need */
-// } s_routing_component_NEW_t,*routing_component_NEW_t;
-
-/*** Parse routing model functions ***/
-// static void model_NEW_set_processing_unit(routing_component_t rc, const char* name) {}
-// static void model_NEW_set_autonomous_system(routing_component_t rc, const char* name) {}
-// static void model_NEW_set_route(routing_component_t rc, const char* src, const char* dst, route_t route) {}
-// static void model_NEW_set_ASroute(routing_component_t rc, const char* src, const char* dst, route_extended_t route) {}
-// static void model_NEW_set_bypassroute(routing_component_t rc, const char* src, const char* dst, route_extended_t e_route) {}
-
-/*** Business methods ***/
-// static route_extended_t NEW_get_route(routing_component_t rc, const char* src,const char* dst) {return NULL;}
-// static route_extended_t NEW_get_bypass_route(routing_component_t rc, const char* src,const char* dst) {return NULL;}
-// static void NEW_finalize(routing_component_t rc) { xbt_free(rc);}
-
-/*** Creation routing model functions ***/
-// static void* model_NEW_create(void) {
-// routing_component_NEW_t new_component = xbt_new0(s_routing_component_NEW_t,1);
-// new_component->generic_routing.set_processing_unit = model_NEW_set_processing_unit;
-// new_component->generic_routing.set_autonomous_system = model_NEW_set_autonomous_system;
-// new_component->generic_routing.set_route = model_NEW_set_route;
-// new_component->generic_routing.set_ASroute = model_NEW_set_ASroute;
-// new_component->generic_routing.set_bypassroute = model_NEW_set_bypassroute;
-// new_component->generic_routing.get_route = NEW_get_route;
-// new_component->generic_routing.get_bypass_route = NEW_get_bypass_route;
-// new_component->generic_routing.finalize = NEW_finalize;
-// /* initialization of internal structures */
-// return new_component;
-// } /* mandatory */
-// static void model_NEW_load(void) {} /* mandatory */
-// static void model_NEW_unload(void) {} /* mandatory */
-// static void model_NEW_end(void) {} /* mandatory */
-
/* ************************************************************************** */
/* ************************* GENERIC PARSE FUNCTIONS ************************ */
}
s_sg_platf_host_cbarg_t host = SG_PLATF_HOST_INITIALIZER;
memset(&host, 0, sizeof(host));
- host.initial_state = SURF_RESOURCE_ON;
+ host.initiallyOn = 1;
host.pstate = 0;
host.speed_scale = 1.0;
host.core_amount = 1;
s_sg_platf_link_cbarg_t link = SG_PLATF_LINK_INITIALIZER;
memset(&link, 0, sizeof(link));
- link.state = SURF_RESOURCE_ON;
+ link.initiallyOn = 1;
link.policy = SURF_LINK_FULLDUPLEX;
link.latency = cabinet->lat;
link.bandwidth = cabinet->bw;
host_link.id = host_id;
host_link.link_up = link_up;
host_link.link_down = link_down;
- sg_platf_new_host_link(&host_link);
+ sg_platf_new_netcard(&host_link);
free(host_id);
free(link_id);
xbt_dynar_free(&radical_elements);
}
-void routing_new_cluster(sg_platf_cluster_cbarg_t cluster)
-{
- using simgrid::surf::AsCluster;
- using simgrid::surf::AsClusterTorus;
- using simgrid::surf::AsClusterFatTree;
-
- char *host_id, *groups, *link_id = NULL;
- xbt_dict_t patterns = NULL;
- int rankId=0;
-
- s_sg_platf_host_cbarg_t host = SG_PLATF_HOST_INITIALIZER;
- s_sg_platf_link_cbarg_t link = SG_PLATF_LINK_INITIALIZER;
-
- unsigned int iter;
- int start, end, i;
- xbt_dynar_t radical_elements;
- xbt_dynar_t radical_ends;
-
- if ((cluster->availability_trace && strcmp(cluster->availability_trace, ""))
- || (cluster->state_trace && strcmp(cluster->state_trace, ""))) {
- patterns = xbt_dict_new_homogeneous(xbt_free_f);
- xbt_dict_set(patterns, "id", xbt_strdup(cluster->id), NULL);
- xbt_dict_set(patterns, "prefix", xbt_strdup(cluster->prefix), NULL);
- xbt_dict_set(patterns, "suffix", xbt_strdup(cluster->suffix), NULL);
- }
-
- /* parse the topology attribute. If we are not in a flat cluster,
- * switch to the right mode and initialize the routing with
- * the parameters in topo_parameters attribute
- */
- s_sg_platf_AS_cbarg_t AS = SG_PLATF_AS_INITIALIZER;
- AS.id = cluster->id;
-
- if(cluster->topology == SURF_CLUSTER_TORUS){
- XBT_DEBUG("<AS id=\"%s\"\trouting=\"Torus_Cluster\">", cluster->id);
- AS.routing = A_surfxml_AS_routing_Cluster___torus;
- sg_platf_new_AS_begin(&AS);
- ((AsClusterTorus*)current_routing)->parse_specific_arguments(cluster);
- }
- else if (cluster->topology == SURF_CLUSTER_FAT_TREE) {
- XBT_DEBUG("<AS id=\"%s\"\trouting=\"Fat_Tree_Cluster\">", cluster->id);
- AS.routing = A_surfxml_AS_routing_Cluster___fat___tree;
- sg_platf_new_AS_begin(&AS);
- ((AsClusterFatTree*)current_routing)->parse_specific_arguments(cluster);
- }
-
- else{
- XBT_DEBUG("<AS id=\"%s\"\trouting=\"Cluster\">", cluster->id);
- AS.routing = A_surfxml_AS_routing_Cluster;
- sg_platf_new_AS_begin(&AS);
- }
-
- if(cluster->loopback_bw!=0 || cluster->loopback_lat!=0){
- ((AsCluster*)current_routing)->p_nb_links_per_node++;
- ((AsCluster*)current_routing)->p_has_loopback=1;
- }
-
- if(cluster->limiter_link!=0){
- ((AsCluster*)current_routing)->p_nb_links_per_node++;
- ((AsCluster*)current_routing)->p_has_limiter=1;
- }
-
-
-
- current_routing->p_linkUpDownList
- = xbt_dynar_new(sizeof(s_surf_parsing_link_up_down_t),NULL);
-
- //Make all hosts
- radical_elements = xbt_str_split(cluster->radical, ",");
- xbt_dynar_foreach(radical_elements, iter, groups) {
-
- radical_ends = xbt_str_split(groups, "-");
- start = surf_parse_get_int(xbt_dynar_get_as(radical_ends, 0, char *));
-
- switch (xbt_dynar_length(radical_ends)) {
- case 1:
- end = start;
- break;
- case 2:
- end = surf_parse_get_int(xbt_dynar_get_as(radical_ends, 1, char *));
- break;
- default:
- surf_parse_error("Malformed radical");
- break;
- }
- for (i = start; i <= end; i++) {
- host_id =
- bprintf("%s%d%s", cluster->prefix, i, cluster->suffix);
- link_id = bprintf("%s_link_%d", cluster->id, i);
-
- XBT_DEBUG("<host\tid=\"%s\"\tpower=\"%f\">", host_id, cluster->speed);
-
- memset(&host, 0, sizeof(host));
- host.id = host_id;
- if ((cluster->properties != NULL) && (!xbt_dict_is_empty(cluster->properties))) {
- xbt_dict_cursor_t cursor=NULL;
- char *key,*data;
- host.properties = xbt_dict_new();
-
- xbt_dict_foreach(cluster->properties,cursor,key,data) {
- xbt_dict_set(host.properties, key, xbt_strdup(data),free);
- }
- }
- if (cluster->availability_trace && strcmp(cluster->availability_trace, "")) {
- xbt_dict_set(patterns, "radical", bprintf("%d", i), NULL);
- char *avail_file = xbt_str_varsubst(cluster->availability_trace, patterns);
- XBT_DEBUG("\tavailability_file=\"%s\"", avail_file);
- host.speed_trace = tmgr_trace_new_from_file(avail_file);
- xbt_free(avail_file);
- } else {
- XBT_DEBUG("\tavailability_file=\"\"");
- }
-
- if (cluster->state_trace && strcmp(cluster->state_trace, "")) {
- char *avail_file = xbt_str_varsubst(cluster->state_trace, patterns);
- XBT_DEBUG("\tstate_file=\"%s\"", avail_file);
- host.state_trace = tmgr_trace_new_from_file(avail_file);
- xbt_free(avail_file);
- } else {
- XBT_DEBUG("\tstate_file=\"\"");
- }
-
- host.speed_peak = xbt_dynar_new(sizeof(double), NULL);
- xbt_dynar_push(host.speed_peak,&cluster->speed);
- host.pstate = 0;
-
- //host.power_peak = cluster->power;
- host.speed_scale = 1.0;
- host.core_amount = cluster->core_amount;
- host.initial_state = SURF_RESOURCE_ON;
- host.coord = "";
- sg_platf_new_host(&host);
- xbt_dynar_free(&host.speed_peak);
- XBT_DEBUG("</host>");
-
- XBT_DEBUG("<link\tid=\"%s\"\tbw=\"%f\"\tlat=\"%f\"/>", link_id,
- cluster->bw, cluster->lat);
-
-
- s_surf_parsing_link_up_down_t info_lim, info_loop;
- // All links are saved in a matrix;
- // every row describes a single node; every node
- // may have multiple links.
- // the first column may store a link from x to x if p_has_loopback is set
- // the second column may store a limiter link if p_has_limiter is set
- // other columns are to store one or more link for the node
-
- //add a loopback link
- if(cluster->loopback_bw!=0 || cluster->loopback_lat!=0){
- char *tmp_link = bprintf("%s_loopback", link_id);
- XBT_DEBUG("<loopback\tid=\"%s\"\tbw=\"%f\"/>", tmp_link,
- cluster->limiter_link);
-
-
- memset(&link, 0, sizeof(link));
- link.id = tmp_link;
- link.bandwidth = cluster->loopback_bw;
- link.latency = cluster->loopback_lat;
- link.state = SURF_RESOURCE_ON;
- link.policy = SURF_LINK_FATPIPE;
- sg_platf_new_link(&link);
- info_loop.link_up = Link::byName(tmp_link);
- info_loop.link_down = info_loop.link_up;
- free(tmp_link);
- xbt_dynar_set(current_routing->p_linkUpDownList,
- rankId*(static_cast<AsCluster*>(current_routing))->p_nb_links_per_node, &info_loop);
- }
-
- //add a limiter link (shared link to account for maximal bandwidth of the node)
- if(cluster->limiter_link!=0){
- char *tmp_link = bprintf("%s_limiter", link_id);
- XBT_DEBUG("<limiter\tid=\"%s\"\tbw=\"%f\"/>", tmp_link,
- cluster->limiter_link);
-
-
- memset(&link, 0, sizeof(link));
- link.id = tmp_link;
- link.bandwidth = cluster->limiter_link;
- link.latency = 0;
- link.state = SURF_RESOURCE_ON;
- link.policy = SURF_LINK_SHARED;
- sg_platf_new_link(&link);
- info_lim.link_up = Link::byName(tmp_link);
- info_lim.link_down = info_lim.link_up;
- free(tmp_link);
- auto as_cluster = static_cast<AsCluster*>(current_routing);
- xbt_dynar_set(current_routing->p_linkUpDownList,
- rankId*(as_cluster)->p_nb_links_per_node + as_cluster->p_has_loopback ,
- &info_lim);
-
- }
-
-
- //call the cluster function that adds the others links
- if (cluster->topology == SURF_CLUSTER_FAT_TREE) {
- ((AsClusterFatTree*) current_routing)->addProcessingNode(i);
- }
- else {
- static_cast<AsCluster*>(current_routing)->create_links_for_node(cluster, i, rankId, rankId*
- static_cast<AsCluster*>(current_routing)->p_nb_links_per_node
- + static_cast<AsCluster*>(current_routing)->p_has_loopback
- + static_cast<AsCluster*>(current_routing)->p_has_limiter );
- }
- xbt_free(link_id);
- xbt_free(host_id);
- rankId++;
- }
-
- xbt_dynar_free(&radical_ends);
- }
- xbt_dynar_free(&radical_elements);
-
- // For fat trees, the links must be created once all nodes have been added
- if(cluster->topology == SURF_CLUSTER_FAT_TREE) {
- static_cast<simgrid::surf::AsClusterFatTree*>(current_routing)->create_links();
- }
- // Add a router. It is magically used thanks to the way in which surf_routing_cluster is written,
- // and it's very useful to connect clusters together
- XBT_DEBUG(" ");
- XBT_DEBUG("<router id=\"%s\"/>", cluster->router_id);
- char *newid = NULL;
- s_sg_platf_router_cbarg_t router = SG_PLATF_ROUTER_INITIALIZER;
- memset(&router, 0, sizeof(router));
- router.id = cluster->router_id;
- router.coord = "";
- if (!router.id || !strcmp(router.id, ""))
- router.id = newid =
- bprintf("%s%s_router%s", cluster->prefix, cluster->id,
- cluster->suffix);
- sg_platf_new_router(&router);
- ((AsCluster*)current_routing)->p_router = (simgrid::surf::RoutingEdge*) xbt_lib_get_or_null(as_router_lib, router.id, ROUTING_ASR_LEVEL);
- free(newid);
-
- //Make the backbone
- if ((cluster->bb_bw != 0) || (cluster->bb_lat != 0)) {
- char *link_backbone = bprintf("%s_backbone", cluster->id);
- XBT_DEBUG("<link\tid=\"%s\" bw=\"%f\" lat=\"%f\"/>", link_backbone,
- cluster->bb_bw, cluster->bb_lat);
-
- memset(&link, 0, sizeof(link));
- link.id = link_backbone;
- link.bandwidth = cluster->bb_bw;
- link.latency = cluster->bb_lat;
- link.state = SURF_RESOURCE_ON;
- link.policy = cluster->bb_sharing_policy;
-
- sg_platf_new_link(&link);
-
- routing_cluster_add_backbone(Link::byName(link_backbone));
-
- free(link_backbone);
- }
-
- XBT_DEBUG("</AS>");
- sg_platf_new_AS_end();
- XBT_DEBUG(" ");
- xbt_dict_free(&patterns); // no op if it were never set
-}
-
-static void routing_parse_postparse(void) {
- xbt_dict_free(&random_value);
-}
-
void sg_platf_new_peer(sg_platf_peer_cbarg_t peer)
{
- using simgrid::surf::RoutingEdge;
+ using simgrid::surf::NetCard;
using simgrid::surf::AsCluster;
char *host_id = NULL;
XBT_DEBUG("<host\tid=\"%s\"\tpower=\"%f\"/>", host_id, peer->speed);
s_sg_platf_host_cbarg_t host = SG_PLATF_HOST_INITIALIZER;
memset(&host, 0, sizeof(host));
- host.initial_state = SURF_RESOURCE_ON;
+ host.initiallyOn = 1;
host.id = host_id;
host.speed_peak = xbt_dynar_new(sizeof(double), NULL);
s_sg_platf_link_cbarg_t link = SG_PLATF_LINK_INITIALIZER;
memset(&link, 0, sizeof(link));
- link.state = SURF_RESOURCE_ON;
+ link.initiallyOn = 1;
link.policy = SURF_LINK_SHARED;
link.latency = peer->lat;
host_link.id = host_id;
host_link.link_up = link_up;
host_link.link_down = link_down;
- sg_platf_new_host_link(&host_link);
+ sg_platf_new_netcard(&host_link);
XBT_DEBUG("<router id=\"%s\"/>", router_id);
s_sg_platf_router_cbarg_t router = SG_PLATF_ROUTER_INITIALIZER;
router.id = router_id;
router.coord = peer->coord;
sg_platf_new_router(&router);
- static_cast<AsCluster*>(current_routing)->p_router = static_cast<RoutingEdge*>(xbt_lib_get_or_null(as_router_lib, router.id, ROUTING_ASR_LEVEL));
+ static_cast<AsCluster*>(current_routing)->p_router = static_cast<NetCard*>(xbt_lib_get_or_null(as_router_lib, router.id, ROUTING_ASR_LEVEL));
XBT_DEBUG("</AS>");
sg_platf_new_AS_end();
xbt_lib_cursor_t cursor;
char *key;
void **data;
- simgrid::surf::RoutingEdge *host_elm;
+ simgrid::surf::NetCard *host_elm;
xbt_lib_foreach(storage_lib, cursor, key, data) {
if(xbt_lib_get_level(xbt_lib_get_elm_or_null(storage_lib, key), SURF_STORAGE_LEVEL) != NULL) {
- simgrid::surf::Storage *storage = static_cast<simgrid::surf::Storage*>(xbt_lib_get_level(xbt_lib_get_elm_or_null(storage_lib, key), SURF_STORAGE_LEVEL));
- host_elm = sg_routing_edge_by_name_or_null(storage->p_attach);
- if(!host_elm)
- surf_parse_error("Unable to attach storage %s: host %s doesn't exist.", storage->getName(), storage->p_attach);
+ simgrid::surf::Storage *storage = static_cast<simgrid::surf::Storage*>(xbt_lib_get_level(xbt_lib_get_elm_or_null(storage_lib, key), SURF_STORAGE_LEVEL));
+ host_elm = sg_netcard_by_name_or_null(storage->p_attach);
+ if(!host_elm)
+ surf_parse_error("Unable to attach storage %s: host %s doesn't exist.", storage->getName(), storage->p_attach);
}
}
}
void routing_register_callbacks()
{
- sg_platf_postparse_add_cb(routing_parse_postparse);
- sg_platf_postparse_add_cb(check_disk_attachment);
+ simgrid::surf::on_postparse.connect(check_disk_attachment);
instr_routing_define_callbacks();
}
namespace simgrid {
namespace surf {
-RoutingPlatf::~RoutingPlatf()
-{
- xbt_dynar_free(&p_lastRoute);
- finalize_rec(p_root);
-}
+ RoutingPlatf::RoutingPlatf(void *loopback)
+ : p_loopback(loopback)
+ {
+ }
+ RoutingPlatf::~RoutingPlatf()
+ {
+ xbt_dynar_free(&p_lastRoute);
+ finalize_rec(p_root);
+ }
}
}
int count = xbt_dynar_length(elms);
xbt_dynar_t res = xbt_dynar_new(sizeof(sg_host_t), NULL);
for (int index = 0; index < count; index++) {
- sg_routing_edge_t relm =
- xbt_dynar_get_as(elms, index, simgrid::surf::RoutingEdge*);
- sg_host_t delm = simgrid::Host::by_name_or_null(relm->getName());
+ sg_netcard_t relm =
+ xbt_dynar_get_as(elms, index, simgrid::surf::NetCard*);
+ sg_host_t delm = simgrid::s4u::Host::by_name_or_null(relm->getName());
if (delm!=NULL) {
xbt_dynar_push(res, &delm);
}