Private implementation of the Networking Zones.
A netzone is a network container, in charge of routing information between elements (hosts and sub-netzones) and to the nearby netzones. In SimGrid, there is a hierarchy of netzones, ie a tree with a unique root NetZone, that you can retrieve with simgrid::s4u::Engine::netRoot().
The purpose of the kernel::routing module is to retrieve the routing path between two points in a time- and space-efficient manner. This is done by NetZoneImpl::getGlobalRoute(), called when creating a communication to retrieve both the list of links that the create communication will use, and the summed latency that these links represent.
The network model could recompute the latency by itself from the list, but it would require an additional traversal of the link set. This operation being on the critical path of SimGrid, the routing computes the latency on the behalf of the network while constructing the link set.
Finding the path between two nodes is rather complex because we navigate a hierarchy of netzones, each of them being a full network. In addition, the routing can declare shortcuts (called bypasses), either within a NetZone at the route level or directly between NetZones. Also, each NetZone can use a differing routing algorithm, depending on its class. FullZone have a full matrix giving explicitly the path between any pair of their contained nodes, while DijkstraZone or FloydZone rely on a shortest path algorithm. VivaldiZone does not even have any link but only use only coordinate information to compute the latency.
So NetZoneImpl::getGlobalRoute builds the path recursively asking its specific information to each traversed NetZone with NetZoneImpl::getLocalRoute, that is redefined in each sub-class. The algorithm for that is explained in http://hal.inria.fr/hal-00650233/ (but for historical reasons, NetZones are called Autonomous Systems in this article).
|
simgrid::s4u::Host * | createHost (const char *name, std::vector< double > *speedPerPstate, int coreAmount, std::map< std::string, std::string > *props) |
| Make an host within that NetZone. More...
|
|
void | addBypassRoute (NetPoint *src, NetPoint *dst, NetPoint *gw_src, NetPoint *gw_dst, std::vector< simgrid::surf::LinkImpl *> &link_list, bool symmetrical) override |
| Creates a new route in this NetZone. More...
|
|
virtual void | getGraph (xbt_graph_t graph, std::map< std::string, xbt_node_t > *nodes, std::map< std::string, xbt_edge_t > *edges)=0 |
|
virtual void | seal () |
| Seal your netzone once you're done adding content, and before routing stuff through it. More...
|
|
const std::string & | getName () const |
| Retrieves the name of that netzone as a C++ string. More...
|
|
const char * | getCname () const |
| Retrieves the name of that netzone as a C string. More...
|
|
NetZone * | getFather () |
|
std::vector< NetZone * > * | getChildren () |
|
void | getHosts (std::vector< s4u::Host *> *whereto) |
|
std::unordered_map< std::string, std::string > * | getProperties () |
| Get the properties assigned to a host. More...
|
|
const char * | getProperty (const char *key) |
| Retrieve the property value (or nullptr if not set) More...
|
|
void | setProperty (const char *key, const char *value) |
|
virtual int | addComponent (kernel::routing::NetPoint *elm) |
|
virtual void | addRoute (kernel::routing::NetPoint *src, kernel::routing::NetPoint *dst, kernel::routing::NetPoint *gw_src, kernel::routing::NetPoint *gw_dst, std::vector< simgrid::surf::LinkImpl *> &link_list, bool symmetrical) |
|