-/* $ID$ */
-
-/* Copyright (c) 2007 Kayo Fujiwara. All rights reserved. */
+/* Copyright (c) 2007-2011, 2014. The SimGrid Team.
+ * All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
//Temporary classes for generating GTNetS topology
#include "gtnets_topology.h"
+#ifdef XBT_DEBUG
+ #undef XBT_DEBUG
+#endif
+#include "xbt/log.h"
+#include "xbt/asserts.h"
+#include <stdio.h> //for fflush in print_topology
+
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_network_gtnets_topology, surf_network_gtnets,
+ "Logging specific to the SURF network GTNetS simulator");
//
// GTNETS_Node
// hostid = network_card_id
int GTNETS_Node::add_host(int hostid){
- if (is_router_){
- fprintf(stderr, "Cannot add a host to a router node.\n");
- return -1;
- }
+ xbt_assert(!(is_router_), "Cannot add a host to a router node");
hosts_.insert(hostid);
return 0;
}
// Add a router. If this node already has a router/host,
// return -1.
int GTNETS_Node::add_router(int routerid){
- if (hosts_.size() > 1){
- fprintf(stderr, "Router node should have only one router.\n");
- return -1;
- }else if (hosts_.size() == 1){
- if (hosts_.find(routerid) != hosts_.end()){
- //printf("the router already exists\n");
- return 0;
- }else{
- fprintf(stderr, "Node %d is a different router.\n");
- return -1;
- }
+ xbt_assert(!(hosts_.size() > 1), "Router node should have only one router");
+ if (hosts_.size() == 1){
+ xbt_assert((hosts_.find(routerid) != hosts_.end()), "Node %d is a different router", routerid);
+ return 0;
}
is_router_ = true;
hosts_.insert(routerid);
void GTNETS_Node::print_hosts(){
set<int>::iterator it;
- printf("[");
for (it = hosts_.begin(); it != hosts_.end(); it++){
- printf(" %d", *it);
+ XBT_DEBUG("host id %d", *it);
}
- printf("]");
}
//
}
void GTNETS_Link::print_link_status(){
- printf("== LINKID: %d\n", ID_);
+ XBT_DEBUG("****** link id: %d", ID_);
if (src_node_){
- printf(" [SRC] ID: %d, router?: %d, hosts[]: ",
- src_node_->id(), src_node_->is_router());
- src_node_->print_hosts();
- printf("\n");
+ XBT_DEBUG("[src] id: %d, is it router?: %d",src_node_->id(), src_node_->is_router());
}
if (dst_node_){
- printf(" [DST] ID: %d, router?: %d, hosts[]: ",
- dst_node_->id(), dst_node_->is_router());
- dst_node_->print_hosts();
- printf("\n");
+ XBT_DEBUG("[dst] id: %d, is it router?: %d",dst_node_->id(), dst_node_->is_router());
}
}
// return the peer node id
int GTNETS_Link::peer_node(int cur_id){
+ xbt_assert(((cur_id == src_node_->id())||(cur_id == dst_node_->id())), "Node not found");
+
if (cur_id == src_node_->id()) return dst_node_->id();
else if (cur_id == dst_node_->id()) return src_node_->id();
- else {
- fprintf(stderr, "node not found\n");
- return -1;
- }
}
int GTNETS_Link::add_src(GTNETS_Node* src){
int GTNETS_Topology::add_link(int id){
map<int,GTNETS_Link*>::iterator iter = links_.find(id);
+ xbt_assert((iter == links_.end()), "Link %d already exists", id);
if(iter == links_.end()) {
GTNETS_Link* link= new GTNETS_Link(id);
- //printf("link %d is added: %d\n", id, link->id());
- //links_.insert(make_pair(id, link));
links_[id] = link;
- return 0;
- }else{
- fprintf(stderr, "Link %d already exists.\n", id);
- return -1;
}
+ return 0;
}
int GTNETS_Topology::add_router(int id){
set<int>::iterator iter = routers_.find(id);
-
- if(iter == routers_.end()) {
- //printf("router %d is inserted\n", id);
- routers_.insert(id);
- return 0;
+ if(iter == routers_.end()){
+ routers_.insert(id);
}else{
- fprintf(stderr, "Router %d already exists.\n", id);
- return -1;
+ XBT_DEBUG("Router (#%d) already exists", id);
}
+ return 0;
}
bool GTNETS_Topology::is_router(int id){
//return the node id of the peer of cur_id by linkid.
int GTNETS_Topology::peer_node_id(int linkid, int cur_id){
- //printf("linkid: %d, cur_id: %d\n", linkid, cur_id);
GTNETS_Link* link = links_[linkid];
- if (!link) {
- fprintf(stderr, "link %d not found\n", linkid);
- return -1;
- }
- if ((cur_id < 0) || (cur_id > nodes_.size()-1)){
- fprintf(stderr, "node %d not found\n", cur_id);
- return -1;
- }
+ xbt_assert((link), "Link %d not found", linkid);
+ xbt_assert(!((cur_id < 0) || (cur_id > nodes_.size()-1)), "Node %d not found", cur_id);
+
int peer = link->peer_node(nodes_[cur_id]->id());
- if (peer < 0){
- fprintf(stderr, "peer not found\n");
- return -1;
- }
+ xbt_assert(!(peer < 0), "Peer not found");
+
return peer;
}
map<int, GTNETS_Link*>::iterator iter = links_.find(linkid);
- if(iter == links_.end()) {
- fprintf(stderr, "Link %d not found.\n", linkid);
- return -1;
- }else{
- link = iter->second;
- }
+ xbt_assert(!(iter == links_.end()), "Link %d not found", linkid);
+ link = iter->second;
- // printf("add_onehop_route: src: %d, dst: %d, linkid: %d, %d\n",
- // src, dst, linkid, link->id());
+ XBT_DEBUG("Add onehop route, src (#%d), dst (#%d), linkid %d:(#%d)",src, dst, linkid, link->id());
GTNETS_Node *src_node, *dst_node;
src_node = link->src_node();
dst_node = link->dst_node();
-
// If not exists a route, add one.
if (!link->route_exists()){
- //check whether there exists a node for the src host/router.
+ //check whether there exists a node for the src.
int s_node_id = nodeid_from_hostid(src);
int node_id;
nodes_[d_node_id]->add_host(dst);
link->add_dst(nodes_[d_node_id]);
-
- // other: has either src or dst (error)
- }else if (!src_node || !dst_node){
- fprintf(stderr, "Either src or dst is null\n");
- return -1;
+ }else if (!(src_node && dst_node)){
+ xbt_assert((src_node && dst_node), "Either src or dst is null");
}
// case 1: link has two routers
int tmpsrc2 = nodeid_from_hostid(src);
int tmpdst1 = dst_node->id();
int tmpdst2 = nodeid_from_hostid(dst);
- if (((tmpsrc1 == tmpsrc2) && (tmpdst1 == tmpdst2)) ||
- ((tmpsrc1 == tmpdst2) && (tmpdst1 == tmpsrc2))){
- fprintf(stderr, "Route already exists\n");
- }else{
- fprintf(stderr, "Different one hop route defined\n");
- return -1;
- }
+ xbt_assert( (((tmpsrc1 == tmpsrc2) && (tmpdst1 == tmpdst2)) ||
+ ((tmpsrc1 == tmpdst2) && (tmpdst1 == tmpsrc2))), "Different one hop route defined");
}
+
// case 2: link has one router and one host
else if (src_node->is_router() && !dst_node->is_router()){
int newsrc, newdst;
+ xbt_assert( ((is_router(src))||(is_router(dst))), "One of nodes should be a router");
+
if (is_router(src)){
newsrc = src;
newdst = dst;
}else if (is_router(dst)){
newsrc = dst;
newdst = src;
- }else{
- fprintf(stderr, "one of nodes should be a router\n");
- return -1;
}
- if (src_node->id() != nodeid_from_hostid(newsrc)){
- fprintf(stderr, "The router should be identical\n");
- return -1;
- }
+ xbt_assert(!(src_node->id() != nodeid_from_hostid(newsrc)), "The router should be identical");
//now, to add dst to dst_node, dst should be a host.
-
- if (is_router(newdst)){
- fprintf(stderr, "dst %d is not an endpoint. cannot add it to dst_node\n");
- return -1;
- }
+ xbt_assert(!(is_router(newdst)), "Dst %d is not an endpoint. cannot add it to dst_node", newdst);
if (!dst_node->include(newdst)){
dst_node->add_host(newdst);
}
else if (!src_node->is_router() && dst_node->is_router()){
int newsrc, newdst;
+ xbt_assert(((is_router(src))||(is_router(dst))), "One of nodes should be a router");
+
if (is_router(src)){
newsrc = dst;
newdst = src;
}else if (is_router(dst)){
newsrc = src;
newdst = dst;
- }else{
- fprintf(stderr, "one of nodes should be a router\n");
- return -1;
- }
-
-
- if (dst_node->id() != hosts_[newdst]){
- fprintf(stderr, "The router should be identical\n");
- return -1;
}
+ xbt_assert(!(dst_node->id() != hosts_[newdst]), "The router should be identical");
//now, to add dst to src_node, dst should be a host.
-
- if (is_router(newsrc)){
- fprintf(stderr, "dst %d is not an endpoint. cannot add it to src_node\n");
- return -1;
- }
+ xbt_assert(!(is_router(newsrc)), "Src %d is not an endpoint. cannot add it to src_node", newsrc);
if (!src_node->include(newsrc)){
src_node->add_host(newsrc);
// case 3: link has two hosts
else if (!src_node->is_router() && !dst_node->is_router()){
-
- if (is_router(src) || is_router(dst)){
- fprintf(stderr, "Cannot add a router to host-host link\n");
- return -1;
- }
+ xbt_assert(!(is_router(src) || is_router(dst)), "Cannot add a router to host-host link");
//if both are hosts, the order doesn't matter.
if (src_node->include(src)){
if (dst_node->include(dst)){
- //nothing
+ //nothing
}else{
- dst_node->add_host(dst);
- hosts_[dst] = dst_node->id();
+ dst_node->add_host(dst);
+ hosts_[dst] = dst_node->id();
}
}else if (src_node->include(dst)){
if (dst_node->include(src)){
- //nothing
+ //nothing
}else{
- dst_node->add_host(src);
- hosts_[src] = dst_node->id();
+ dst_node->add_host(src);
+ hosts_[src] = dst_node->id();
}
}else if (dst_node->include(src)){
if (src_node->include(dst)){
- //nothing
+ //nothing
}else{
- src_node->add_host(dst);
- hosts_[dst] = src_node->id();
+ src_node->add_host(dst);
+ hosts_[dst] = src_node->id();
}
}else if (dst_node->include(dst)){
if (src_node->include(src)){
- //nothing
+ //nothing
}else{
- src_node->add_host(src);
- hosts_[src] = src_node->id();
+ src_node->add_host(src);
+ hosts_[src] = src_node->id();
}
}else{
src_node->add_host(src);
}
else{
- fprintf(stderr, "Shouldn't be here\n");
- return -1;
+ xbt_die("Shouldn't be here");
}
+
return 0;
}
}
void GTNETS_Topology::print_topology(){
+ XBT_DEBUG("<<<<<================================>>>>>");
+ XBT_DEBUG("Dumping GTNETS topollogy information");
map<int, GTNETS_Link*>::iterator it;
for (it = links_.begin(); it != links_.end(); it++){
it->second->print_link_status();
}
+ XBT_DEBUG(">>>>>================================<<<<<");
+ fflush(NULL);
}
const vector<GTNETS_Node*>& GTNETS_Topology::nodes(){